@qooxdoo/framework
Version:
The JS Framework for Coders
564 lines (435 loc) • 15.6 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2013 1&1 Internet AG, Germany, http://www.1und1.de
License:
MIT: https://opensource.org/licenses/MIT
See the LICENSE file in the project's top-level directory for details.
Authors:
* Richard Sternagel (rsternagel)
************************************************************************ */
qx.Class.define("qx.test.bom.request.SimpleXhr",
{
extend : qx.dev.unit.TestCase,
include : [qx.dev.unit.MMock],
members :
{
setUp : function()
{
this.req = new qx.bom.request.SimpleXhr();
},
tearDown : function()
{
this.req = null;
this.getSandbox().restore();
},
//
// setRequestHeader()
// getRequestHeader()
//
"test: set/get request header": function() {
var key = "Accept",
value = "application/json";
this.assertEquals(value, this.req.setRequestHeader(key, value).getRequestHeader(key));
},
//
// setUrl()
// getUrl()
//
"test: set/get url": function() {
var url = "http://example.org";
this.assertEquals(url, this.req.setUrl(url).getUrl());
},
//
// setMethod()
// getMethod()
//
"test: set/get method": function() {
var method = "GET";
this.assertEquals(method, this.req.setMethod(method).getMethod());
},
//
// setRequestData()
// getRequestData()
//
"test: set/get request data": function() {
var data = {"abc": "def", "uvw": "xyz"};
this.assertEquals(data, this.req.setRequestData(data).getRequestData());
},
//
// _setResponse()
// getResponse()
//
"test: set/get response": function() {
var req = this.req,
json = '{"animals": ["monkey", "mouse"]}',
xml = "<animals><monkey/><mouse/></animals>",
obj = {a:"b"};
req._transport.responseText = json;
this.assertEquals(json, req.getResponse());
req._transport.responseXML = xml;
this.assertEquals(xml, req.getResponse());
req._setResponse(obj);
this.assertEquals(obj, req.getResponse());
},
//
// setTimeout()
// getTimeout()
//
"test: set/get timeout in millis": function() {
this.assertEquals(150, this.req.setTimeout(150).getTimeout());
},
//
// useCaching
// isCaching
//
"test: use/is caching": function() {
this.assertTrue(this.req.useCaching(true).isCaching());
this.assertFalse(this.req.useCaching(false).isCaching());
},
//
// setParser()
//
"test: set (custom) parser": function() {
var req = this.req,
acceptedParser = null,
customParser = function() {};
acceptedParser = req.setParser(customParser);
this.assertEquals(customParser, acceptedParser);
},
//
// _serializeData()
//
"test: serialize data": function() {
var data = {"abc": "def", "uvw": "xyz"},
contentType = "application/json";
this.assertNull(this.req._serializeData(null));
this.assertEquals("leaveMeIntact", this.req._serializeData("leaveMeIntact"));
this.assertEquals("abc=def&uvw=xyz", this.req._serializeData(data));
this.assertEquals("abc=def&uvw=xyz", this.req._serializeData(data, "arbitrary/contentType"));
this.assertEquals('{"abc":"def","uvw":"xyz"}', this.req._serializeData(data, contentType));
this.assertEquals('[1,2,3]', this.req._serializeData([1,2,3], contentType));
},
//
// send()
//
stubTransportMethods : function(methods) {
var stubbedTransport = this.req._createTransport(),
l = methods.length;
while (l--) {
this.stub(stubbedTransport, methods[l]);
}
this.req._transport = stubbedTransport;
return stubbedTransport;
},
"test: send() w/ timeout": function() {
var req = this.req,
method = "GET",
url = "http://example.org",
stubbedTransport = {};
req.setUrl(url);
req.setTimeout(150);
stubbedTransport = this.stubTransportMethods(["open", "send"]);
req.send();
this.assertCalledWith(stubbedTransport.open, method, url, true);
this.assertCalledWith(stubbedTransport.send);
this.assertEquals(stubbedTransport.timeout, req.getTimeout());
},
"test: send() w/o data and w/o headers": function() {
var req = this.req,
method = "GET",
url = "http://example.org",
stubbedTransport = {};
req.setUrl(url);
stubbedTransport = this.stubTransportMethods(["open", "send"]);
req.send();
this.assertCalledWith(stubbedTransport.open, method, url, true);
this.assertCalledWith(stubbedTransport.send);
},
"test: send() GET w/ data and w/ headers": function() {
var req = this.req,
method = "GET",
url = "http://example.org",
obj = {a:"b"},
stubbedTransport = {};
req.setUrl(url);
req.setRequestHeader("Accept", "application/json");
req.setRequestData(obj);
stubbedTransport = this.stubTransportMethods(["open", "setRequestHeader", "send"]);
req.send();
this.assertCalledWith(stubbedTransport.open, method, url+"?a=b", true);
this.assertCalledWith(stubbedTransport.setRequestHeader, "Accept", "application/json");
this.assertCalledWith(stubbedTransport.send);
},
"test: send() GET w/ enabled caching sets nocache param": function() {
var req = this.req,
method = "GET",
url = "http://example.org",
expectedUrl = new RegExp(url+"\\?nocache=[0-9]{13,}"),
stubbedTransport = {};
req.setUrl(url);
req.useCaching(false);
stubbedTransport = this.stubTransportMethods(["open", "send"]);
req.send();
this.assertCalledWithMatch(stubbedTransport.open, method, expectedUrl, true);
this.assertCalledWith(stubbedTransport.send);
},
"test: send() GET w/ caching header overrides cache prevention": function() {
var req = this.req,
method = "GET",
url = "http://example.org",
stubbedTransport = {};
req.setUrl(url);
req.setRequestHeader("Cache-Control", "no-cache");
stubbedTransport = this.stubTransportMethods(["open", "setRequestHeader", "send"]);
req.send();
this.assertCalledWith(stubbedTransport.open, method, url, true);
this.assertCalledWith(stubbedTransport.setRequestHeader, "Cache-Control", "no-cache");
this.assertCalledWith(stubbedTransport.send);
},
"test: send() POST w/ data (default content-type)": function() {
var req = this.req,
method = "POST",
url = "http://example.org",
obj = {a:"b"},
stubbedTransport = {};
req.setUrl(url);
req.setMethod(method);
req.setRequestData(obj);
stubbedTransport = this.stubTransportMethods(["open", "setRequestHeader", "send"]);
req.send();
this.assertCalledWith(stubbedTransport.open, method, url, true);
this.assertCalledWith(stubbedTransport.setRequestHeader, "Content-Type", "application/x-www-form-urlencoded");
this.assertCalledWith(stubbedTransport.send, "a=b");
},
"test: send() POST w/ data (application/json)": function() {
var req = this.req,
method = "POST",
url = "http://example.org",
obj = {a:"b"},
stubbedTransport = {};
req.setUrl(url);
req.setMethod(method);
req.setRequestData(obj);
req.setRequestHeader("Content-Type", "application/json");
stubbedTransport = this.stubTransportMethods(["open", "setRequestHeader", "send"]);
req.send();
this.assertCalledWith(stubbedTransport.open, method, url, true);
this.assertCalledWith(stubbedTransport.send, qx.lang.Json.stringify(obj));
},
"test: send() POST w/ FormData": function() {
var req = this.req,
method = "POST",
url = "http://example.org",
stubbedTransport = {};
if (!window.FormData) {
this.skip("FormData API not supported");
}
if (!req.setMethod) {
this.skip("POST requests not supported by this transport");
}
var formData = new FormData();
formData.append("foo", "bar");
formData.append("baz", "qux");
req.setUrl(url);
req.setMethod(method);
req.setRequestData(formData);
stubbedTransport = this.stubTransportMethods(["open", "setRequestHeader", "send"]);
req.send();
this.assertCalledWith(stubbedTransport.send, formData);
},
"test: send() POST w/ Blob": function() {
var req = this.req,
method = "POST",
url = "http://example.org",
stubbedTransport = {};
if (!window.Blob) {
this.skip("Blob API not supported");
}
if (!req.setMethod) {
this.skip("POST requests not supported by this transport");
}
var blob = new window.Blob(['abc123'], {type: 'text/plain'});
req.setUrl(url);
req.setMethod(method);
req.setRequestData(blob);
stubbedTransport = this.stubTransportMethods(["open", "setRequestHeader", "send"]);
req.send();
this.assertCalledWith(stubbedTransport.send, blob);
},
"test: send() POST w/ ArrayBuffer": function() {
var req = this.req,
method = "POST",
url = "http://example.org",
stubbedTransport = {};
if (!window.ArrayBuffer) {
this.skip("ArrayBuffer API not supported");
}
if (!req.setMethod) {
this.skip("POST requests not supported by this transport");
}
var arrayBuffer = new window.ArrayBuffer(512);
req.setUrl(url);
req.setMethod(method);
req.setRequestData(arrayBuffer);
stubbedTransport = this.stubTransportMethods(["open", "setRequestHeader", "send"]);
req.send();
this.assertCalledWith(stubbedTransport.send, arrayBuffer);
},
//
// abort()
//
"test: abort() aborts transport": function() {
var stubbedTransport = this.stubTransportMethods(["abort"]);
this.req.abort();
this.assertCalled(stubbedTransport.abort);
},
//
// dispose()
//
"test: dispose() disposes transport": function() {
this.assertTrue(this.req.dispose());
},
//
// addListenerOnce()
//
"test: addListenerOnce() event handler": function() {
var req = this.req,
stubbedTransport = this.req._createTransport(),
name = "test-success",
listener = function() {},
ctx = this;
this.stub(req, "once");
req._transport = stubbedTransport;
req.addListenerOnce(name, listener, ctx);
this.assertCalledWith(req.once, name, listener, ctx);
},
//
// _onReadyStateChange()
// __onReadyStateDone()
//
"test: _onReadyStateDone() success": function() {
var req = this.req,
json = '{"animals": ["monkey", "mouse"]}',
obj = {animals: ["monkey", "mouse"]},
contentType = "application/json",
stubbedTransport = req._createTransport();
// prep transport
this.stub(req, "emit");
this.stub(stubbedTransport, "getResponseHeader").returns(contentType);
req._transport = req._registerTransportListener(stubbedTransport);
req._transport.readyState = qx.bom.request.Xhr.DONE;
req._transport.responseText = json;
req._transport.status = 200;
req._transport.onreadystatechange();
this.assertArrayEquals(obj.animals, req.getResponse().animals);
this.assertCalledWith(req.emit, "success");
},
"test: _onReadyStateDone() fail w/ response": function() {
var req = this.req,
json = '{"animals": ["monkey", "mouse"]}',
obj = {animals: ["monkey", "mouse"]},
contentType = "application/json",
stubbedTransport = req._createTransport();
// prep transport
this.stub(req, "emit");
this.stub(stubbedTransport, "getResponseHeader").returns(contentType);
req._transport = req._registerTransportListener(stubbedTransport);
req._transport.readyState = qx.bom.request.Xhr.DONE;
req._transport.responseText = json;
req._transport.status = 404;
req._transport.onreadystatechange();
this.assertArrayEquals(obj.animals, req.getResponse().animals);
this.assertCalledWith(req.emit, "fail");
},
"test: _onReadyStateDone() fail w/o response": function() {
var req = this.req,
contentType = "hasToExist/ButContentDoesntMatter",
stubbedTransport = req._createTransport();
// prep transport
this.stub(req, "emit");
this.stub(stubbedTransport, "getResponseHeader").returns(contentType);
req._transport = req._registerTransportListener(stubbedTransport);
req._transport.readyState = qx.bom.request.Xhr.DONE;
req._transport.status = 404;
req._transport.onreadystatechange();
this.assertEquals("", req.getResponse());
this.assertCalledWith(req.emit, "fail");
},
//
// onLoadEnd()
//
"test: onLoadEnd()": function() {
var req = this.req,
stubbedTransport = req._createTransport();
// prep transport
this.stub(req, "emit");
req._transport = req._registerTransportListener(stubbedTransport);
req._transport.onloadend();
this.assertCalledWith(req.emit, "loadEnd");
},
//
// onAbort()
//
"test: onAbort()": function() {
var req = this.req,
stubbedTransport = req._createTransport();
// prep transport
this.stub(req, "emit");
req._transport = req._registerTransportListener(stubbedTransport);
req._transport.onabort();
this.assertCalledWith(req.emit, "abort");
},
//
// onTimeout()
//
"test: onTimeout()": function() {
var req = this.req,
stubbedTransport = req._createTransport();
// prep transport
this.stub(req, "emit");
req._transport = req._registerTransportListener(stubbedTransport);
req._transport.ontimeout();
this.assertCalledWith(req.emit, "timeout");
this.assertEquals(2, req.emit.callCount); // + emit("fail")
},
//
// onError()
//
"test: onError()": function() {
var req = this.req,
stubbedTransport = req._createTransport();
// prep transport
this.stub(req, "emit");
req._transport = req._registerTransportListener(stubbedTransport);
req._transport.onerror();
this.assertCalledWith(req.emit, "error");
this.assertEquals(2, req.emit.callCount); // + emit("fail")
},
testGetResponseHeaders: function() {
this.useFakeServer();
this.getServer().autoRespond = true;
this.getServer().respondWith("GET", "/foo",
[
200,
{
"x-affe": "AFFE"
},
"Response Body"
]);
var req = new qx.bom.request.SimpleXhr('/foo', 'GET');
req.on("success", function() {
this.resume(function() {
this.assertEquals("AFFE", req.getResponseHeader("x-affe"));
var headers = req.getAllResponseHeaders();
this.assertMatch(headers, /x-affe.*?AFFE/);
}.bind(this));
}.bind(this));
window.setTimeout(function() {
req.send();
}, 100);
this.wait(200);
}
}
});