faux-jax-tulios
Version:
Fork using latest mitm for node 10 - Intercept and respond to requests in the browser (XMLHttpRequest, XDomainRequest) and Node.js (http(s) module)
193 lines (161 loc) • 5.48 kB
JavaScript
var bind = require('lodash-compat/function/bind');
var test = require('tape');
var XMLHttpRequest = require('../../../lib/XMLHttpRequest/');
var support = require('../../../lib/support');
test('xhr.setResponseBody() throws when body is not a String', function(t) {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/');
xhr.send();
xhr.setResponseHeaders({});
t.throws(bind(xhr.setResponseBody, xhr, 30), Error, 'Body is not a string');
t.end();
});
test('xhr.setResponseBody() throws when state is not OPEN', function(t) {
var xhr = new XMLHttpRequest();
t.throws(bind(xhr.setResponseBody, xhr, 'boom'), Error, 'State is < OPENED');
t.end();
});
test('xhr.setResponseBody() throws when send() flag is unset', function(t) {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/');
t.throws(bind(xhr.setResponseBody, xhr, 'boom'), Error, 'Send() flag is unset');
t.end();
});
test('xhr.setResponseBody() throws when state is not HEADERS_RECEIVED', function(t) {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/');
xhr.send();
t.throws(bind(xhr.setResponseBody, xhr, 'boom'), Error, 'State is < HEADERS_RECEIVED');
t.end();
});
test('xhr.setResponseBody() sends readystatechange event with a LOADING readyState every 10 bytes', function(t) {
t.plan(18);
var body = (new Array(21)).join();
var xhr = new XMLHttpRequest();
xhr.open('GET', '/');
xhr.send();
xhr.setResponseHeaders({});
var receivedEvents = 0;
var expectedEvents = [{
bubbles: false,
cancelable: false,
currentTarget: xhr,
eventPhase: 0,
target: xhr,
timestamp: 500,
type: 'readystatechange'
}, {
bubbles: false,
cancelable: false,
currentTarget: xhr,
eventPhase: 0,
target: xhr,
timestamp: 500,
type: 'readystatechange'
}];
xhr.onreadystatechange = function listen(receivedEvent) {
var expectedEvent = expectedEvents[receivedEvents];
receivedEvent.timestamp = expectedEvent.timestamp;
t.equal(receivedEvent.bubbles, expectedEvent.bubbles);
t.equal(receivedEvent.cancelable, expectedEvent.cancelable);
t.equal(receivedEvent.currentTarget, expectedEvent.currentTarget);
t.equal(receivedEvent.eventPhase, expectedEvent.eventPhase);
t.equal(receivedEvent.target, expectedEvent.target);
t.equal(receivedEvent.timestamp, expectedEvent.timestamp);
t.equal(receivedEvent.type, expectedEvent.type);
t.equal(receivedEvent.target.readyState, 3, 'readyState is LOADING');
receivedEvents++;
t.equal(xhr.responseText.length, receivedEvents * 10, 'content length updated');
if (receivedEvents === 2) {
xhr.onreadystatechange = function() {};
}
};
xhr.setResponseBody(body);
});
test('xhr.setResponseBody() sends readystatechange event with a DONE readyState when finished', function(t) {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/');
xhr.send();
xhr.setResponseHeaders({});
var receivedEvents = [];
xhr.onreadystatechange = function listen(receivedEvent) {
receivedEvents.push(receivedEvent);
};
xhr.setResponseBody('DAWG');
var lastEvent = receivedEvents.pop();
t.equal(lastEvent.target.readyState, 4, 'readyState is DONE');
t.end();
});
test('xhr.setResponseBody() sends a load event when finished', function(t) {
t.plan(1);
var xhr = new XMLHttpRequest();
xhr.open('GET', '/');
xhr.send();
xhr.setResponseHeaders({});
xhr.onload = function listen() {
if (support.xhr.events.load) {
t.pass('received a load event');
} else {
t.fail('should not receive a load event');
}
};
xhr.setResponseBody('DAWG');
if (!support.xhr.events.load) {
t.pass('load event not supported');
}
});
test('xhr.setResponseBody() sets responseText', function(t) {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/');
xhr.send();
xhr.setResponseHeaders({});
xhr.setResponseBody('DAWG');
t.equal(xhr.responseText, 'DAWG', 'responseText matches');
t.end();
});
if (support.xhr.responseURL) {
test('xhr.setResponseBody() sets responseURL when relative', function(t) {
var urlResolve = require('url').resolve;
var xhr = new XMLHttpRequest();
xhr.open('GET', 'ah/ahahahah#ROFL');
xhr.send();
xhr.setResponseHeaders({});
xhr.setResponseBody('DAWG');
t.equal(xhr.responseURL, urlResolve(location.href, 'ah/ahahahah'), 'responseURL matches');
t.end();
});
test('xhr.setResponseBody() sets responseURL when absolute', function(t) {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://www.google.com/dawg#WIIIIII');
xhr.send();
xhr.setResponseHeaders({});
xhr.setResponseBody('DAWG');
t.equal(xhr.responseURL, 'http://www.google.com/dawg', 'responseURL matches');
t.end();
});
}
if (support.xhr.response) {
test('xhr.setResponseBody() sets response', function(t) {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/');
xhr.send();
xhr.setResponseHeaders({});
xhr.setResponseBody('DAWG');
t.equal(xhr.response, 'DAWG', 'response matches');
t.end();
});
}
if (support.xhr.response) {
test('xhr.setResponseBody() understand responseType=json', function(t) {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/');
xhr.responseType = 'json';
xhr.send();
xhr.setResponseHeaders({});
xhr.setResponseBody('{"yaw": "dawg"}');
t.deepEqual(xhr.response, {
yaw: 'dawg'
}, 'response matches and is a JSON object');
t.end();
});
}