Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 /** | 5 /** |
| 6 * @fileoverview | 6 * @fileoverview |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 (function() { | 9 (function() { |
| 10 | 10 |
| 11 'use strict'; | 11 'use strict'; |
| 12 | 12 |
| 13 /** @type {sinon.FakeXhrCtrl} */ | |
| 14 var fakeXhrCtrl; | |
| 15 | |
| 13 /** @type {sinon.FakeXhr} */ | 16 /** @type {sinon.FakeXhr} */ |
| 14 var fakeXhr; | 17 var fakeXhr; |
| 15 | 18 |
| 16 QUnit.module('xhr', { | 19 QUnit.module('xhr', { |
| 17 beforeEach: function() { | 20 beforeEach: function() { |
| 18 fakeXhr = null; | 21 fakeXhr = null; |
| 19 sinon.useFakeXMLHttpRequest().onCreate = | 22 fakeXhrCtrl = sinon.useFakeXMLHttpRequest(); |
| 23 fakeXhrCtrl.onCreate = | |
| 20 function(/** sinon.FakeXhr */ xhr) { | 24 function(/** sinon.FakeXhr */ xhr) { |
| 21 fakeXhr = xhr; | 25 fakeXhr = xhr; |
| 22 }; | 26 }; |
| 27 }, | |
| 28 afterEach: function() { | |
| 29 remoting.identity = null; | |
| 23 } | 30 } |
| 24 }); | 31 }); |
| 25 | 32 |
| 26 QUnit.test('urlencodeParamHash', function(assert) { | 33 QUnit.test('urlencodeParamHash', function(assert) { |
| 27 assert.equal( | 34 assert.equal( |
| 28 remoting.Xhr.urlencodeParamHash({}), | 35 remoting.Xhr.urlencodeParamHash({}), |
| 29 ''); | 36 ''); |
| 30 assert.equal( | 37 assert.equal( |
| 31 remoting.Xhr.urlencodeParamHash({'key': 'value'}), | 38 remoting.Xhr.urlencodeParamHash({'key': 'value'}), |
| 32 'key=value'); | 39 'key=value'); |
| 33 assert.equal( | 40 assert.equal( |
| 34 remoting.Xhr.urlencodeParamHash({'key /?=&': 'value /?=&'}), | 41 remoting.Xhr.urlencodeParamHash({'key /?=&': 'value /?=&'}), |
| 35 'key%20%2F%3F%3D%26=value%20%2F%3F%3D%26'); | 42 'key%20%2F%3F%3D%26=value%20%2F%3F%3D%26'); |
| 36 assert.equal( | 43 assert.equal( |
| 37 remoting.Xhr.urlencodeParamHash({'k1': 'v1', 'k2': 'v2'}), | 44 remoting.Xhr.urlencodeParamHash({'k1': 'v1', 'k2': 'v2'}), |
| 38 'k1=v1&k2=v2'); | 45 'k1=v1&k2=v2'); |
| 39 }); | 46 }); |
| 40 | 47 |
| 41 QUnit.test('basic GET', function(assert) { | 48 // |
| 49 // Test for what happens when the parameters are specified | |
| 50 // incorrectly. | |
| 51 // | |
| 52 | |
| 53 QUnit.test('invalid *content parameters', function(assert) { | |
| 54 assert.throws(function() { | |
| 55 new remoting.Xhr({ | |
| 56 method: 'POST', | |
| 57 url: 'http://foo.com', | |
| 58 jsonContent: {}, | |
| 59 formContent: {} | |
| 60 }); | |
| 61 }); | |
| 62 | |
| 63 assert.throws(function() { | |
| 64 new remoting.Xhr({ | |
| 65 method: 'POST', | |
| 66 url: 'http://foo.com', | |
| 67 textContent: '', | |
| 68 formContent: {} | |
| 69 }); | |
| 70 }); | |
| 71 | |
| 72 assert.throws(function() { | |
| 73 new remoting.Xhr({ | |
| 74 method: 'POST', | |
| 75 url: 'http://foo.com', | |
| 76 textContent: '', | |
| 77 jsonContent: {} | |
| 78 }); | |
| 79 }); | |
| 80 }); | |
| 81 | |
| 82 | |
| 83 QUnit.test('invalid URL parameters', function(assert) { | |
| 84 assert.throws(function() { | |
| 85 new remoting.Xhr({ | |
| 86 method: 'POST', | |
| 87 url: 'http://foo.com?', | |
| 88 urlParams: {} | |
| 89 }); | |
| 90 }); | |
| 91 | |
| 92 assert.throws(function() { | |
| 93 new remoting.Xhr({ | |
| 94 method: 'POST', | |
| 95 url: 'http://foo.com#', | |
| 96 urlParams: {} | |
| 97 }); | |
| 98 }); | |
| 99 }); | |
| 100 | |
| 101 QUnit.test('invalid auth parameters', function(assert) { | |
| 102 assert.throws(function() { | |
| 103 new remoting.Xhr({ | |
| 104 method: 'POST', | |
| 105 url: 'http://foo.com', | |
| 106 useIdentity: false, | |
| 107 oauthToken: '', | |
| 108 headers: { | |
| 109 'Authorization': '' | |
| 110 } | |
| 111 }); | |
| 112 }); | |
| 113 | |
| 114 assert.throws(function() { | |
| 115 new remoting.Xhr({ | |
| 116 method: 'POST', | |
| 117 url: 'http://foo.com', | |
| 118 useIdentity: true, | |
| 119 headers: { | |
| 120 'Authorization': '' | |
| 121 } | |
| 122 }); | |
| 123 }); | |
| 124 | |
| 125 assert.throws(function() { | |
| 126 new remoting.Xhr({ | |
| 127 method: 'POST', | |
| 128 url: 'http://foo.com', | |
| 129 useIdentity: true, | |
| 130 oauthToken: '', | |
| 131 headers: {} | |
| 132 }); | |
| 133 }); | |
| 134 }); | |
| 135 | |
| 136 QUnit.test('invalid auth parameters', function(assert) { | |
| 137 assert.throws(function() { | |
| 138 new remoting.Xhr({ | |
| 139 method: 'POST', | |
| 140 url: 'http://foo.com', | |
| 141 useIdentity: false, | |
| 142 oauthToken: '', | |
| 143 headers: { | |
| 144 'Authorization': '' | |
| 145 } | |
| 146 }); | |
| 147 }); | |
| 148 | |
| 149 assert.throws(function() { | |
| 150 new remoting.Xhr({ | |
| 151 method: 'POST', | |
| 152 url: 'http://foo.com', | |
| 153 useIdentity: true, | |
| 154 headers: { | |
| 155 'Authorization': '' | |
| 156 } | |
| 157 }); | |
| 158 }); | |
| 159 | |
| 160 assert.throws(function() { | |
| 161 new remoting.Xhr({ | |
| 162 method: 'POST', | |
| 163 url: 'http://foo.com', | |
| 164 useIdentity: true, | |
| 165 oauthToken: '', | |
| 166 headers: {} | |
| 167 }); | |
| 168 }); | |
| 169 }); | |
| 170 | |
| 171 // | |
| 172 // The typical case. | |
| 173 // | |
| 174 | |
| 175 QUnit.test('successful GET', function(assert) { | |
| 42 var promise = new remoting.Xhr({ | 176 var promise = new remoting.Xhr({ |
| 43 method: 'GET', | 177 method: 'GET', |
| 44 url: 'http://foo.com', | 178 url: 'http://foo.com' |
| 45 responseType: remoting.Xhr.ResponseType.TEXT | |
| 46 }).start().then(function(response) { | 179 }).start().then(function(response) { |
| 47 assert.equal(response.status, 200); | 180 assert.equal(response.status, 200); |
| 48 assert.equal(response.getText(), 'body'); | 181 assert.equal(response.getText(), 'body'); |
| 49 }); | 182 }); |
| 50 assert.equal(fakeXhr.method, 'GET'); | 183 assert.equal(fakeXhr.method, 'GET'); |
| 51 assert.equal(fakeXhr.url, 'http://foo.com'); | 184 assert.equal(fakeXhr.url, 'http://foo.com'); |
| 52 assert.equal(fakeXhr.withCredentials, false); | 185 assert.equal(fakeXhr.withCredentials, false); |
| 53 assert.equal(fakeXhr.requestBody, null); | 186 assert.equal(fakeXhr.requestBody, null); |
| 54 assert.ok(!('Content-type' in fakeXhr.requestHeaders)); | 187 assert.ok(!('Content-type' in fakeXhr.requestHeaders)); |
| 55 fakeXhr.respond(200, {}, 'body'); | 188 fakeXhr.respond(200, {}, 'body'); |
| 56 return promise; | 189 return promise; |
| 57 }); | 190 }); |
| 58 | 191 |
| 59 QUnit.test('GET with param string', function(assert) { | 192 // |
| 193 // Handling of errors with different values of ignoreErrors. | |
| 194 // | |
| 195 | |
| 196 QUnit.test('failed GET', function(assert) { | |
| 197 var promise = new remoting.Xhr({ | |
| 198 method: 'GET', | |
| 199 url: 'http://foo.com' | |
| 200 }).start().then(function(response) { | |
| 201 assert.equal(response.status, 500); | |
| 202 assert.equal(response.getText(), 'body'); | |
| 203 }); | |
| 204 fakeXhr.respond(500, {}, 'body'); | |
| 205 return promise; | |
| 206 }); | |
| 207 | |
| 208 QUnit.test('failed GET with non-ignored error', function(assert) { | |
| 209 var expectedError = remoting.Error.fromHttpStatus(500); | |
| 210 assert.ok(!expectedError.isNone()); | |
| 211 | |
| 60 var promise = new remoting.Xhr({ | 212 var promise = new remoting.Xhr({ |
| 61 method: 'GET', | 213 method: 'GET', |
| 62 url: 'http://foo.com', | 214 url: 'http://foo.com', |
| 63 responseType: remoting.Xhr.ResponseType.TEXT, | 215 ignoreErrors: [] |
| 64 urlParams: 'the_param_string' | 216 }).start().then(function() { |
| 65 }).start().then(function(response) { | 217 assert.ok(false); |
| 66 assert.equal(response.status, 200); | 218 }, function(/** remoting.Error */ error) { |
| 67 assert.equal(response.getText(), 'body'); | 219 assert.equal(error.getTag(), expectedError.getTag()); |
| 68 }); | 220 }); |
| 69 assert.equal(fakeXhr.method, 'GET'); | 221 fakeXhr.respond(500, {}, 'body'); |
| 70 assert.equal(fakeXhr.url, 'http://foo.com?the_param_string'); | |
| 71 assert.equal(fakeXhr.withCredentials, false); | |
| 72 assert.equal(fakeXhr.requestBody, null); | |
| 73 assert.ok(!('Content-type' in fakeXhr.requestHeaders)); | |
| 74 fakeXhr.respond(200, {}, 'body'); | |
| 75 return promise; | 222 return promise; |
| 76 }); | 223 }); |
| 77 | 224 |
| 78 QUnit.test('GET with param object', function(assert) { | 225 |
| 226 QUnit.test('failed GET with ignored error', function(assert) { | |
| 227 var expectedError = remoting.Error.fromHttpStatus(500); | |
| 228 assert.ok(!expectedError.isNone()); | |
| 229 | |
| 79 var promise = new remoting.Xhr({ | 230 var promise = new remoting.Xhr({ |
| 80 method: 'GET', | 231 method: 'GET', |
| 81 url: 'http://foo.com', | 232 url: 'http://foo.com', |
| 82 responseType: remoting.Xhr.ResponseType.TEXT, | 233 ignoreErrors: [expectedError.getTag()] |
| 83 urlParams: {'a': 'b', 'c': 'd'} | 234 }).start(); |
| 84 }).start().then(function(response) { | 235 fakeXhr.respond(500, {}, 'body'); |
| 85 assert.equal(response.status, 200); | |
| 86 assert.equal(response.getText(), 'body'); | |
| 87 }); | |
| 88 assert.equal(fakeXhr.method, 'GET'); | |
| 89 assert.equal(fakeXhr.url, 'http://foo.com?a=b&c=d'); | |
| 90 assert.equal(fakeXhr.withCredentials, false); | |
| 91 assert.equal(fakeXhr.requestBody, null); | |
| 92 assert.ok(!('Content-type' in fakeXhr.requestHeaders)); | |
| 93 fakeXhr.respond(200, {}, 'body'); | |
| 94 return promise; | 236 return promise; |
| 95 }); | 237 }); |
| 96 | 238 |
| 97 QUnit.test('GET with headers', function(assert) { | 239 // |
| 240 // Tests for the effect of acceptJson. | |
| 241 // | |
| 242 | |
| 243 QUnit.test('acceptJson required', function(assert) { | |
| 244 var promise = new remoting.Xhr({ | |
| 245 method: 'GET', | |
| 246 url: 'http://foo.com' | |
| 247 }).start().then(function(response) { | |
| 248 assert.throws(response.getJson); | |
| 249 }); | |
| 250 fakeXhr.respond(200, {}, '{}'); | |
| 251 return promise; | |
| 252 }); | |
| 253 | |
| 254 QUnit.test('JSON response', function(assert) { | |
| 255 var responseJson = { | |
| 256 'myJsonData': [true] | |
| 257 }; | |
| 258 var responseText = JSON.stringify(jsonData); | |
| 98 var promise = new remoting.Xhr({ | 259 var promise = new remoting.Xhr({ |
| 99 method: 'GET', | 260 method: 'GET', |
| 100 url: 'http://foo.com', | 261 url: 'http://foo.com', |
| 101 responseType: remoting.Xhr.ResponseType.TEXT, | 262 acceptJson: true |
| 263 }).start().then(function(response) { | |
| 264 // Calling getText is still OK even when a JSON response is | |
| 265 // requested. | |
| 266 assert.equal( | |
| 267 response.getText(), | |
| 268 responseText); | |
| 269 // Check that getJson works as advertized. | |
| 270 assert.deepEqual( | |
| 271 response.getJson(), | |
| 272 responseJson); | |
| 273 // Calling getJson multiple times doesn't re-parse the response. | |
| 274 assert.strictEqual( | |
| 275 response.getJson(), | |
| 276 response.getJson()); | |
| 277 }); | |
| 278 fakeXhr.respond(200, {}, responseText); | |
| 279 return promise; | |
| 280 }); | |
| 281 | |
| 282 // | |
| 283 // Tests for various parameters that modify the HTTP request. | |
| 284 // | |
| 285 | |
| 286 QUnit.test('GET with param string', function(assert) { | |
|
rmsousa
2015/03/21 01:49:56
"Since you're here": could you add a unit test for
John Williams
2015/03/23 19:55:10
Done.
| |
| 287 new remoting.Xhr({ | |
| 288 method: 'GET', | |
| 289 url: 'http://foo.com', | |
| 290 urlParams: 'the_param_string' | |
| 291 }).start(); | |
| 292 assert.equal(fakeXhr.url, 'http://foo.com?the_param_string'); | |
| 293 }); | |
| 294 | |
| 295 QUnit.test('GET with param object', function(assert) { | |
| 296 new remoting.Xhr({ | |
| 297 method: 'GET', | |
| 298 url: 'http://foo.com', | |
| 299 urlParams: {'a': 'b', 'c': 'd'} | |
| 300 }).start(); | |
| 301 assert.equal(fakeXhr.url, 'http://foo.com?a=b&c=d'); | |
| 302 }); | |
| 303 | |
| 304 QUnit.test('GET with headers', function(assert) { | |
| 305 new remoting.Xhr({ | |
| 306 method: 'GET', | |
| 307 url: 'http://foo.com', | |
| 102 headers: {'Header1': 'headerValue1', 'Header2': 'headerValue2'} | 308 headers: {'Header1': 'headerValue1', 'Header2': 'headerValue2'} |
| 103 }).start().then(function(response) { | 309 }).start(); |
| 104 assert.equal(response.status, 200); | |
| 105 assert.equal(response.getText(), 'body'); | |
| 106 }); | |
| 107 assert.equal(fakeXhr.method, 'GET'); | |
| 108 assert.equal(fakeXhr.url, 'http://foo.com'); | |
| 109 assert.equal(fakeXhr.withCredentials, false); | |
| 110 assert.equal(fakeXhr.requestBody, null); | |
| 111 assert.equal( | 310 assert.equal( |
| 112 fakeXhr.requestHeaders['Header1'], | 311 fakeXhr.requestHeaders['Header1'], |
| 113 'headerValue1'); | 312 'headerValue1'); |
| 114 assert.equal( | 313 assert.equal( |
| 115 fakeXhr.requestHeaders['Header2'], | 314 fakeXhr.requestHeaders['Header2'], |
| 116 'headerValue2'); | 315 'headerValue2'); |
| 117 assert.ok(!('Content-type' in fakeXhr.requestHeaders)); | |
| 118 fakeXhr.respond(200, {}, 'body'); | |
| 119 return promise; | |
| 120 }); | 316 }); |
| 121 | 317 |
| 122 | 318 |
| 123 QUnit.test('GET with credentials', function(assert) { | 319 QUnit.test('GET with credentials', function(assert) { |
| 124 var promise = new remoting.Xhr({ | 320 new remoting.Xhr({ |
| 125 method: 'GET', | 321 method: 'GET', |
| 126 url: 'http://foo.com', | 322 url: 'http://foo.com', |
| 127 responseType: remoting.Xhr.ResponseType.TEXT, | |
| 128 withCredentials: true | 323 withCredentials: true |
| 129 }).start().then(function(response) { | 324 }).start(); |
| 130 assert.equal(response.status, 200); | |
| 131 assert.equal(response.getText(), 'body'); | |
| 132 }); | |
| 133 assert.equal(fakeXhr.method, 'GET'); | |
| 134 assert.equal(fakeXhr.url, 'http://foo.com'); | |
| 135 assert.equal(fakeXhr.withCredentials, true); | 325 assert.equal(fakeXhr.withCredentials, true); |
| 136 assert.equal(fakeXhr.requestBody, null); | |
| 137 assert.ok(!('Content-type' in fakeXhr.requestHeaders)); | |
| 138 fakeXhr.respond(200, {}, 'body'); | |
| 139 return promise; | |
| 140 }); | 326 }); |
| 141 | 327 |
| 328 // | |
| 329 // Checking that typical POST requests work. | |
| 330 // | |
| 331 | |
| 142 QUnit.test('POST with text content', function(assert) { | 332 QUnit.test('POST with text content', function(assert) { |
| 143 var done = assert.async(); | 333 var done = assert.async(); |
| 144 | 334 |
| 145 var promise = new remoting.Xhr({ | 335 var promise = new remoting.Xhr({ |
| 146 method: 'POST', | 336 method: 'POST', |
| 147 url: 'http://foo.com', | 337 url: 'http://foo.com', |
| 148 responseType: remoting.Xhr.ResponseType.TEXT, | |
| 149 textContent: 'the_content_string' | 338 textContent: 'the_content_string' |
| 150 }).start().then(function(response) { | 339 }).start().then(function(response) { |
| 151 assert.equal(response.status, 200); | 340 assert.equal(response.status, 200); |
| 152 assert.equal(response.getText(), 'body'); | 341 assert.equal(response.getText(), 'body'); |
| 153 done(); | 342 done(); |
| 154 }); | 343 }); |
| 155 assert.equal(fakeXhr.method, 'POST'); | 344 assert.equal(fakeXhr.method, 'POST'); |
| 156 assert.equal(fakeXhr.url, 'http://foo.com'); | 345 assert.equal(fakeXhr.url, 'http://foo.com'); |
| 157 assert.equal(fakeXhr.withCredentials, false); | 346 assert.equal(fakeXhr.withCredentials, false); |
| 158 assert.equal(fakeXhr.requestBody, 'the_content_string'); | 347 assert.equal(fakeXhr.requestBody, 'the_content_string'); |
| 159 assert.ok(!('Content-type' in fakeXhr.requestHeaders)); | 348 assert.equal(fakeXhr.requestHeaders['Content-type'], |
| 349 'text/plain; charset=UTF-8'); | |
| 160 fakeXhr.respond(200, {}, 'body'); | 350 fakeXhr.respond(200, {}, 'body'); |
| 161 return promise; | 351 return promise; |
| 162 }); | 352 }); |
| 163 | 353 |
| 164 QUnit.test('POST with form content', function(assert) { | 354 QUnit.test('POST with form content', function(assert) { |
| 165 var promise = new remoting.Xhr({ | 355 new remoting.Xhr({ |
| 166 method: 'POST', | 356 method: 'POST', |
| 167 url: 'http://foo.com', | 357 url: 'http://foo.com', |
| 168 responseType: remoting.Xhr.ResponseType.TEXT, | |
| 169 formContent: {'a': 'b', 'c': 'd'} | 358 formContent: {'a': 'b', 'c': 'd'} |
| 170 }).start().then(function(response) { | 359 }).start(); |
| 171 assert.equal(response.status, 200); | |
| 172 assert.equal(response.getText(), 'body'); | |
| 173 }); | |
| 174 assert.equal(fakeXhr.method, 'POST'); | |
| 175 assert.equal(fakeXhr.url, 'http://foo.com'); | |
| 176 assert.equal(fakeXhr.withCredentials, false); | |
| 177 assert.equal(fakeXhr.requestBody, 'a=b&c=d'); | 360 assert.equal(fakeXhr.requestBody, 'a=b&c=d'); |
| 178 assert.equal( | 361 assert.equal( |
| 179 fakeXhr.requestHeaders['Content-type'], | 362 fakeXhr.requestHeaders['Content-type'], |
| 180 'application/x-www-form-urlencoded'); | 363 'application/x-www-form-urlencoded; charset=UTF-8'); |
| 181 fakeXhr.respond(200, {}, 'body'); | |
| 182 return promise; | |
| 183 }); | 364 }); |
| 184 | 365 |
| 185 QUnit.test('defaultResponse 200', function(assert) { | 366 // |
| 186 var done = assert.async(); | 367 // Tests for authentication-related options. |
| 368 // | |
| 187 | 369 |
| 188 var onDone = function() { | 370 QUnit.test('GET with auth token', function(assert) { |
| 189 assert.ok(true); | 371 new remoting.Xhr({ |
| 190 done(); | 372 method: 'GET', |
| 191 }; | 373 url: 'http://foo.com', |
| 374 oauthToken: 'my_token' | |
| 375 }).start(); | |
| 376 assert.equal(fakeXhr.requestHeaders['Authorization'], | |
| 377 'Bearer my_token'); | |
| 378 }); | |
| 192 | 379 |
| 193 var onError = function(error) { | 380 QUnit.test('GET with useIdentity', function(assert) { |
| 194 assert.ok(false); | 381 var tokenPromise = Promise.resolve('my_token'); |
| 195 done(); | 382 |
| 196 }; | 383 remoting.identity = new remoting.Identity(); |
| 384 sinon.stub(remoting.identity, 'getToken').returns(tokenPromise); | |
| 197 | 385 |
| 198 new remoting.Xhr({ | 386 new remoting.Xhr({ |
| 199 method: 'POST', | 387 method: 'GET', |
| 200 url: 'http://foo.com' | 388 url: 'http://foo.com', |
| 201 }).start().then(remoting.Xhr.defaultResponse(onDone, onError)); | 389 useIdentity: true |
| 202 fakeXhr.respond(200, {}, ''); | 390 }).start(); |
| 203 }); | |
| 204 | 391 |
| 205 | 392 return tokenPromise.then(function() { |
| 206 QUnit.test('defaultResponse 404', function(assert) { | 393 assert.equal(fakeXhr.requestHeaders['Authorization'], |
| 207 var done = assert.async(); | 394 'Bearer my_token'); |
| 208 | 395 fakeXhr.respond(200, {}, ''); |
| 209 var onDone = function() { | 396 }); |
| 210 assert.ok(false); | |
| 211 done(); | |
| 212 }; | |
| 213 | |
| 214 var onError = function(error) { | |
| 215 assert.ok(true); | |
| 216 done(); | |
| 217 }; | |
| 218 | |
| 219 new remoting.Xhr({ | |
| 220 method: 'POST', | |
| 221 url: 'http://foo.com' | |
| 222 }).start().then(remoting.Xhr.defaultResponse(onDone, onError)); | |
| 223 fakeXhr.respond(404, {}, ''); | |
| 224 }); | 397 }); |
| 225 | 398 |
| 226 })(); | 399 })(); |
| OLD | NEW |