@qooxdoo/framework
Version:
The JS Framework for Coders
636 lines (495 loc) • 15.7 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() {
this.req = new qx.bom.request.SimpleXhr();
},
tearDown() {
this.req = null;
this.getSandbox().restore();
},
//
// setRequestHeader()
// getRequestHeader()
//
"test: set/get request header"() {
var key = "Accept",
value = "application/json";
this.assertEquals(
value,
this.req.setRequestHeader(key, value).getRequestHeader(key)
);
},
//
// setUrl()
// getUrl()
//
"test: set/get url"() {
var url = "http://example.org";
this.assertEquals(url, this.req.setUrl(url).getUrl());
},
//
// setMethod()
// getMethod()
//
"test: set/get method"() {
var method = "GET";
this.assertEquals(method, this.req.setMethod(method).getMethod());
},
//
// setRequestData()
// getRequestData()
//
"test: set/get request data"() {
var data = { abc: "def", uvw: "xyz" };
this.assertEquals(data, this.req.setRequestData(data).getRequestData());
},
//
// _setResponse()
// getResponse()
//
"test: set/get response"() {
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"() {
this.assertEquals(150, this.req.setTimeout(150).getTimeout());
},
//
// useCaching
// isCaching
//
"test: use/is caching"() {
this.assertTrue(this.req.useCaching(true).isCaching());
this.assertFalse(this.req.useCaching(false).isCaching());
},
//
// setParser()
//
"test: set (custom) parser"() {
var req = this.req,
acceptedParser = null,
customParser = function () {};
acceptedParser = req.setParser(customParser);
this.assertEquals(customParser, acceptedParser);
},
//
// _serializeData()
//
"test: serialize data"() {
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(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"() {
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"() {
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"() {
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"() {
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"() {
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)"() {
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)"() {
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"() {
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"() {
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"() {
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"() {
var stubbedTransport = this.stubTransportMethods(["abort"]);
this.req.abort();
this.assertCalled(stubbedTransport.abort);
},
//
// dispose()
//
"test: dispose() disposes transport"() {
this.assertTrue(this.req.dispose());
},
//
// addListenerOnce()
//
"test: addListenerOnce() event handler"() {
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"() {
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"() {
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"() {
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()"() {
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()"() {
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()"() {
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()"() {
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() {
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(500);
}
}
});