3
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
4
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7
Code distributed by Google as part of the polymer project is also
8
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
12
<title>iron-request</title>
14
<script src="../../webcomponentsjs/webcomponents.js"></script>
15
<script src="../../web-component-tester/browser.js"></script>
17
<link rel="import" href="../../polymer/polymer.html">
18
<link rel="import" href="../iron-request.html">
21
<test-fixture id="TrivialRequest">
23
<iron-request></iron-request>
27
suite('<iron-request>', function () {
28
var jsonResponseHeaders;
29
var successfulRequestOptions;
34
jsonResponseHeaders = {
35
'Content-Type': 'application/json'
37
server = sinon.fakeServer.create();
38
server.respondWith('GET', '/responds_to_get_with_json', [
44
server.respondWith('GET', '/responds_to_get_with_prefixed_json', [
47
'])}while(1);</x>{"success":true}'
50
server.respondWith('GET', '/responds_to_get_with_500', [
56
server.respondWith('GET', '/responds_to_get_with_100', [
62
server.respondWith('GET', '/responds_to_get_with_0', [
69
request = fixture('TrivialRequest');
70
successfulRequestOptions = {
71
url: '/responds_to_get_with_json'
75
teardown(function () {
79
suite('basic usage', function () {
80
test('creates network requests, requiring only `url`', function () {
81
request.send(successfulRequestOptions);
85
expect(request.response).to.be.ok;
88
test('sets async to true by default', function () {
89
request.send(successfulRequestOptions);
90
expect(request.xhr.async).to.be.eql(true);
93
test('can be aborted', function () {
94
request.send(successfulRequestOptions);
100
return request.completes.then(function () {
101
throw new Error('Request did not abort appropriately!');
102
}).catch(function (e) {
103
expect(request.response).to.not.be.ok;
107
test('default responseType is text', function () {
108
request.send(successfulRequestOptions);
111
return request.completes.then(function() {
112
expect(request.response).to.be.an('string')
116
test('default responseType of text is not applied, when async is false', function () {
117
var options = Object.create(successfulRequestOptions);
118
options.async = false;
120
request.send(options);
123
return request.completes.then(function() {
124
expect(request.xhr.responseType).to.be.empty;
128
test('responseType can be configured via handleAs option', function () {
129
var options = Object.create(successfulRequestOptions);
130
options.handleAs = 'json';
132
request.send(options);
133
expect(server.requests.length).to.be.equal(1);
134
expect(server.requests[0].requestHeaders['accept']).to.be.equal(
138
return request.completes.then(function() {
139
expect(request.response).to.be.an('object');
143
test('setting jsonPrefix correctly strips it from the response', function () {
145
url: '/responds_to_get_with_prefixed_json',
147
jsonPrefix: '])}while(1);</x>'
150
request.send(options);
151
expect(server.requests.length).to.be.equal(1);
152
expect(server.requests[0].requestHeaders['accept']).to.be.equal(
156
return request.completes.then(function() {
157
expect(request.response).to.deep.eq({success: true});
161
test('responseType cannot be configured via handleAs option, when async is false', function () {
162
var options = Object.create(successfulRequestOptions);
163
options.handleAs = 'json';
164
options.async = false;
166
request.send(options);
167
expect(server.requests.length).to.be.equal(1);
168
expect(server.requests[0].requestHeaders['accept']).to.be.equal(
172
return request.completes.then(function() {
173
expect(request.response).to.be.a('string');
177
test('headers are sent up', function() {
178
var options = Object.create(successfulRequestOptions);
181
'accept': 'this should override the default'
183
request.send(options);
184
expect(server.requests.length).to.be.equal(1);
185
var fakeXhr = server.requests[0]
186
expect(fakeXhr.requestHeaders['foo']).to.be.equal(
188
expect(fakeXhr.requestHeaders['accept']).to.be.equal(
189
'this should override the default');
192
test('headers are deduped by lowercasing', function() {
193
var options = Object.create(successfulRequestOptions);
198
'Accept': 'this should also override the default'
200
request.send(options);
201
expect(server.requests.length).to.be.equal(1);
202
var fakeXhr = server.requests[0]
203
expect(Object.keys(fakeXhr.requestHeaders).length).to.be.equal(2);
204
expect(fakeXhr.requestHeaders['foo']).to.be.equal(
206
expect(fakeXhr.requestHeaders['accept']).to.be.equal(
207
'this should also override the default');
211
suite('special cases', function() {
212
test('treats status code 0 as success, though the outcome is ambiguous', function() {
213
// Note: file:// status code will probably be 0 no matter what happened.
215
url: '/responds_to_get_with_0'
220
expect(request.succeeded).to.be.equal(true);
224
suite('errors', function() {
225
test('treats status codes between 1 and 199 as errors', function() {
227
url: '/responds_to_get_with_100'
232
expect(request.succeeded).to.be.equal(false);
235
test('treats status codes between 300 and ∞ as errors', function() {
237
url: '/responds_to_get_with_500'
242
expect(request.succeeded).to.be.equal(false);
246
suite('status codes', function() {
247
test('status and statusText is set after a ambiguous request', function() {
249
url: '/responds_to_get_with_0'
254
expect(request.status).to.be.equal(0);
255
expect(request.statusText).to.be.equal('');
258
test('status and statusText is set after a request that succeeded', function() {
260
url: '/responds_to_get_with_json'
265
expect(request.status).to.be.equal(200);
266
expect(request.statusText).to.be.equal('OK');
269
test('status and statusText is set after a request that failed', function() {
271
url: '/responds_to_get_with_500'
276
expect(request.status).to.be.equal(500);
277
expect(request.statusText).to.be.equal('Internal Server Error');