blob: 560950260e8e8e6a2733bdbc6afb498d13f922e7 [file] [log] [blame]
describe('sk.request, sk.get, sk.post, and sk.delete',
function() {
var server;
beforeEach(function () { server = sinon.fakeServer.create(); });
afterEach(function () { server.restore(); });
function testRequestSuccess() {
var method = 'POST';
var url = '/test-url';
var requestBody = 'Test body';
var requestHeaders = {'Content-Type': 'text/plain',
'X-Foo': 'Bar'};
var promise = sk.request(method, url, requestBody, requestHeaders);
assert.equal(server.requests.length, 1);
var request = server.requests[0];
assert.equal(request.method, method);
assert.equal(request.url, url);
assert.equal(request.requestBody, requestBody);
assert.deepEqual(request.requestHeaders,
{'Content-Type': 'text/plain;charset=utf-8',
'X-Foo': 'Bar'});
var responseBody = 'Hey, look at this body!';
request.respond(200, {}, responseBody);
return promise.should.eventually.equal(responseBody);
}
it('should send an async XMLHttpRequest', testRequestSuccess);
function testRequestErrorResponse() {
var method = 'GET';
var url = '/test-url';
var requestHeaders = {'X-Foo': 'Bar'};
var promise = sk.request(method, url, null, requestHeaders);
assert.equal(server.requests.length, 1);
var request = server.requests[0];
assert.equal(request.method, method);
assert.equal(request.url, url);
assert(!request.requestBody);
assert.deepEqual(request.requestHeaders, requestHeaders);
var responseBody = "This didn't work out.";
request.respond(503, {}, responseBody);
return promise.should.be.rejectedWith({
status:503,
response: responseBody,
});
}
it('should reject when non-OK response', testRequestErrorResponse);
function testRequestNetworkError() {
// Sinon does not seem to have a way to simulate network errors. Instead,
// make a request to an invalid domain.
server.restore();
var method = 'GET';
var url = 'http://x.invalid/test-url';
return sk.request(method, url).should.be.rejectedWith({
response:Error
});
}
it('should fail with a network error', testRequestNetworkError);
function testGet() {
var url = '/test-url';
var promise = sk.get(url);
assert.equal(server.requests.length, 1);
var request = server.requests[0];
assert.equal(request.method, 'GET');
assert.equal(request.url, url);
assert(!request.requestBody);
assert.deepEqual(request.requestHeaders, {});
var responseBody = 'Got';
request.respond(200, {}, responseBody);
return promise.should.eventually.equal(responseBody);
}
it('should use GET for sk.get', testGet);
function testPost() {
var url = '/test-url';
var obj = {
green: {tea: 'matcha'},
teas: ['chai', 'matcha', {tea: 'konacha'}]
};
var promise = sk.post(url, JSON.stringify(obj));
assert.equal(server.requests.length, 1);
var request = server.requests[0];
assert.equal(request.method, 'POST');
assert.equal(request.url, url);
assert.deepEqual(JSON.parse(request.requestBody), obj);
assert.deepEqual(request.requestHeaders,
{'Content-Type': 'application/json;charset=utf-8'});
var responseBody = JSON.stringify({ brewed: true });
request.respond(200, {}, responseBody);
return promise.should.eventually.equal(responseBody);
}
it('should use POST and application/json for sk.post', testPost);
function testDelete() {
var url = '/test-url';
var promise = sk.delete(url);
assert.equal(server.requests.length, 1);
var request = server.requests[0];
assert.equal(request.method, 'DELETE');
assert.equal(request.url, url);
assert(!request.requestBody);
// For some reason, Chrome automatically adds a Content-Type header even
// though there's no body. (We probably don't care.)
//assert.deepEqual(request.requestHeaders, {});
request.respond(200, {}, "");
return promise.should.eventually.equal("");
}
it('should use DELETE for sk.delete', testDelete);
}
);