UNPKG

spincycle

Version:

A reactive message router and object manager that lets clients subscribe to object property changes on the server

312 lines (252 loc) 9.64 kB
<!doctype html> <!-- @license Copyright (c) 2015 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt --> <html> <head> <title>iron-request</title> <script src="../../webcomponentsjs/webcomponents.js"></script> <script src="../../web-component-tester/browser.js"></script> <link rel="import" href="../../polymer/polymer.html"> <link rel="import" href="../iron-request.html"> </head> <body> <test-fixture id="TrivialRequest"> <template> <iron-request></iron-request> </template> </test-fixture> <script> suite('<iron-request>', function () { var jsonResponseHeaders; var successfulRequestOptions; var request; var server; setup(function () { jsonResponseHeaders = { 'Content-Type': 'application/json' }; server = sinon.fakeServer.create(); server.respondWith('GET', '/responds_to_get_with_json', [ 200, jsonResponseHeaders, '{"success":true}' ]); server.respondWith('GET', '/responds_to_get_with_prefixed_json', [ 200, jsonResponseHeaders, '])}while(1);</x>{"success":true}' ]); server.respondWith('GET', '/responds_to_get_with_500', [ 500, {}, '' ]); server.respondWith('GET', '/responds_to_get_with_100', [ 100, {}, '' ]); server.respondWith('GET', '/responds_to_get_with_0', [ 0, jsonResponseHeaders, '{"success":true}' ]); request = fixture('TrivialRequest'); successfulRequestOptions = { url: '/responds_to_get_with_json' }; synchronousSuccessfulRequestOptions = { url: '/responds_to_get_with_json', async: false, timeout: 100 }; asynchronousSuccessfulRequestOptions = { url: '/responds_to_get_with_json', async: true, timeout: 100 }; }); teardown(function () { server.restore(); }); suite('basic usage', function () { test('creates network requests, requiring only `url`', function () { request.send(successfulRequestOptions); server.respond(); expect(request.response).to.be.ok; }); test('timeout not set if synchronous', function () { request.send(synchronousSuccessfulRequestOptions); expect(request.xhr.async).to.be.eql(false); expect(request.xhr.timeout).to.be.eql(undefined); }); test('timeout set if asynchronous', function () { request.send(asynchronousSuccessfulRequestOptions); expect(request.xhr.async).to.be.eql(true); expect(request.xhr.timeout).to.be.eql(100); }); test('sets async to true by default', function () { request.send(successfulRequestOptions); expect(request.xhr.async).to.be.eql(true); }); test('can be aborted', function () { request.send(successfulRequestOptions); request.abort(); server.respond(); return request.completes.then(function () { throw new Error('Request did not abort appropriately!'); }).catch(function (e) { expect(request.response).to.not.be.ok; }); }); test('default responseType is text', function () { request.send(successfulRequestOptions); server.respond(); return request.completes.then(function() { expect(request.response).to.be.an('string') }); }); test('default responseType of text is not applied, when async is false', function () { var options = Object.create(successfulRequestOptions); options.async = false; request.send(options); server.respond(); return request.completes.then(function() { expect(request.xhr.responseType).to.be.empty; }); }); test('responseType can be configured via handleAs option', function () { var options = Object.create(successfulRequestOptions); options.handleAs = 'json'; request.send(options); expect(server.requests.length).to.be.equal(1); expect(server.requests[0].requestHeaders['accept']).to.be.equal( 'application/json'); server.respond(); return request.completes.then(function() { expect(request.response).to.be.an('object'); }); }); test('setting jsonPrefix correctly strips it from the response', function () { var options = { url: '/responds_to_get_with_prefixed_json', handleAs: 'json', jsonPrefix: '])}while(1);</x>' }; request.send(options); expect(server.requests.length).to.be.equal(1); expect(server.requests[0].requestHeaders['accept']).to.be.equal( 'application/json'); server.respond(); return request.completes.then(function() { expect(request.response).to.deep.eq({success: true}); }); }); test('responseType cannot be configured via handleAs option, when async is false', function () { var options = Object.create(successfulRequestOptions); options.handleAs = 'json'; options.async = false; request.send(options); expect(server.requests.length).to.be.equal(1); expect(server.requests[0].requestHeaders['accept']).to.be.equal( 'application/json'); server.respond(); return request.completes.then(function() { expect(request.response).to.be.a('string'); }); }); test('headers are sent up', function() { var options = Object.create(successfulRequestOptions); options.headers = { 'foo': 'bar', 'accept': 'this should override the default' }; request.send(options); expect(server.requests.length).to.be.equal(1); var fakeXhr = server.requests[0] expect(fakeXhr.requestHeaders['foo']).to.be.equal( 'bar'); expect(fakeXhr.requestHeaders['accept']).to.be.equal( 'this should override the default'); }); test('headers are deduped by lowercasing', function() { var options = Object.create(successfulRequestOptions); options.headers = { 'foo': 'bar', 'Foo': 'bar', 'fOo': 'bar', 'Accept': 'this should also override the default' }; request.send(options); expect(server.requests.length).to.be.equal(1); var fakeXhr = server.requests[0] expect(Object.keys(fakeXhr.requestHeaders).length).to.be.equal(2); expect(fakeXhr.requestHeaders['foo']).to.be.equal( 'bar'); expect(fakeXhr.requestHeaders['accept']).to.be.equal( 'this should also override the default'); }); }); suite('special cases', function() { test('treats status code 0 as success, though the outcome is ambiguous', function() { // Note: file:// status code will probably be 0 no matter what happened. request.send({ url: '/responds_to_get_with_0' }); server.respond(); expect(request.succeeded).to.be.equal(true); }); }); suite('errors', function() { test('treats status codes between 1 and 199 as errors', function() { request.send({ url: '/responds_to_get_with_100' }); server.respond(); expect(request.succeeded).to.be.equal(false); }); test('treats status codes between 300 and ∞ as errors', function() { request.send({ url: '/responds_to_get_with_500' }); server.respond(); expect(request.succeeded).to.be.equal(false); }); }); suite('status codes', function() { test('status and statusText is set after a ambiguous request', function() { request.send({ url: '/responds_to_get_with_0' }); server.respond(); expect(request.status).to.be.equal(0); expect(request.statusText).to.be.equal(''); }); test('status and statusText is set after a request that succeeded', function() { request.send({ url: '/responds_to_get_with_json' }); server.respond(); expect(request.status).to.be.equal(200); expect(request.statusText).to.be.equal('OK'); }); test('status and statusText is set after a request that failed', function() { request.send({ url: '/responds_to_get_with_500' }); server.respond(); expect(request.status).to.be.equal(500); expect(request.statusText).to.be.equal('Internal Server Error'); }); }); }); </script> </body> </html>