grunt-jstestdriver-phantomjs
Version:
Grunt task for unit testing with jsTestDriver and PhantomJS.
151 lines (120 loc) • 4 kB
JavaScript
function FakeXMLHttpRequest() {
this.requestHeaders = {};
this.readyState = 0;
this.status = null;
this.responseText = null;
this.responses = [];
jasmine.Ajax.server = this;
}
(function (objectPrototype) {
function open() {
this.method = arguments[0];
this.url = arguments[1];
this.readyState = 1;
}
function setRequestHeader(header, value) {
this.requestHeaders[header] = value;
}
function abort() {
this.readyState = 0;
}
function onreadystatechange(isTimeout) {}
function send(data) {
this.params = data;
this.readyState = 2;
}
function getResponseHeader(name) {
return this.responseHeaders[name];
}
function getAllResponseHeaders() {
var responseHeaders = [];
for (var i in this.responseHeaders) {
if (this.responseHeaders.hasOwnProperty(i)) {
responseHeaders.push(i + ': ' + this.responseHeaders[i]);
}
}
return responseHeaders.join('\r\n');
}
function respond() {
var response = getResponseByUrl(this.responses, this.url);
if (response) {
this.status = response.status;
this.responseText = response.responseText || "";
this.readyState = 4;
this.responseHeaders = response.responseHeaders ||
{"Content-type": response.contentType || "application/json" };
this.onreadystatechange();
}
}
function getResponseByUrl(responses, url) {
var i,
l = responses.length,
response;
for (i = 0; i < l; i += 1) {
if (responses[i].url === url) {
response = responses[i];
}
}
return response;
}
function respondWith(response) {
this.responses.push(response);
}
function responseTimeout() {
this.readyState = 4;
jasmine.Clock.tick(30000);
this.onreadystatechange('timeout');
}
objectPrototype.open = open;
objectPrototype.setRequestHeader = setRequestHeader;
objectPrototype.abort = abort;
objectPrototype.onreadystatechange = onreadystatechange;
objectPrototype.send = send;
objectPrototype.getResponseHeader = getResponseHeader;
objectPrototype.getAllResponseHeaders = getAllResponseHeaders;
objectPrototype.respond = respond;
objectPrototype.respondWith = respondWith;
objectPrototype.responseTimeout = responseTimeout;
}(FakeXMLHttpRequest.prototype));
jasmine.Ajax = {
isInstalled: function () {
return jasmine.Ajax.installed;
},
assertInstalled: function () {
if (!jasmine.Ajax.isInstalled()) {
throw new Error("Mock ajax is not installed, use jasmine.Ajax.useMock()");
}
},
useMock: function () {
if (!jasmine.Ajax.isInstalled()) {
var spec = jasmine.getEnv().currentSpec;
spec.after(jasmine.Ajax.uninstallMock);
jasmine.Ajax.installMock();
}
},
installMock: function () {
jasmine.Ajax.installXHR();
jasmine.Ajax.installed = true;
},
installXHR: function () {
jasmine.Ajax.xhrMock();
},
uninstallMock: function () {
jasmine.Ajax.assertInstalled();
jasmine.Ajax.server = jasmine.Ajax.server;
window.XMLHttpRequest = jasmine.Ajax.real;
jasmine.Ajax.reset();
},
reset: function () {
jasmine.Ajax.installed = false;
jasmine.Ajax.real = null;
jasmine.Ajax.server = null;
jasmine.Ajax.responses = [];
},
xhrMock: function () {
jasmine.Ajax.real = XMLHttpRequest;
window.XMLHttpRequest = FakeXMLHttpRequest;
return XMLHttpRequest;
},
installed: false
};