| 
									
										
										
										
											2016-06-23 09:47:54 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright Google Inc. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-22 19:16:25 -07:00
										 |  |  | import {ɵgetDOM as getDOM} from '@angular/common'; | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  | import {Injectable} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  | import {afterEach, AsyncTestCompleter, beforeEach, beforeEachProviders, describe, expect, inject, it, SpyObject} from '@angular/core/testing/src/testing_internal'; | 
					
						
							| 
									
										
										
										
											2017-12-17 15:10:54 -08:00
										 |  |  | import {BrowserXhr} from '@angular/http/src/backends/browser_xhr'; | 
					
						
							|  |  |  | import {CookieXSRFStrategy, XHRBackend, XHRConnection} from '@angular/http/src/backends/xhr_backend'; | 
					
						
							|  |  |  | import {BaseRequestOptions, RequestOptions} from '@angular/http/src/base_request_options'; | 
					
						
							|  |  |  | import {BaseResponseOptions, ResponseOptions} from '@angular/http/src/base_response_options'; | 
					
						
							|  |  |  | import {ResponseContentType, ResponseType} from '@angular/http/src/enums'; | 
					
						
							|  |  |  | import {Headers} from '@angular/http/src/headers'; | 
					
						
							|  |  |  | import {XSRFStrategy} from '@angular/http/src/interfaces'; | 
					
						
							|  |  |  | import {Request} from '@angular/http/src/static_request'; | 
					
						
							|  |  |  | import {Response} from '@angular/http/src/static_response'; | 
					
						
							|  |  |  | import {URLSearchParams} from '@angular/http/src/url_search_params'; | 
					
						
							| 
									
										
										
										
											2019-08-22 16:14:18 -07:00
										 |  |  | import {setCookie} from '@angular/platform-browser/testing/src/browser_util'; | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  | let abortSpy: any; | 
					
						
							|  |  |  | let sendSpy: any; | 
					
						
							|  |  |  | let openSpy: any; | 
					
						
							|  |  |  | let setRequestHeaderSpy: any; | 
					
						
							|  |  |  | let existingXHRs: MockBrowserXHR[] = []; | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  | class MockBrowserXHR extends BrowserXhr { | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |   abort: any; | 
					
						
							|  |  |  |   send: any; | 
					
						
							|  |  |  |   open: any; | 
					
						
							|  |  |  |   response: any; | 
					
						
							| 
									
										
										
										
											2016-02-24 16:37:18 +01:00
										 |  |  |   responseType: string; | 
					
						
							| 
									
										
										
										
											2018-06-18 16:38:33 -07:00
										 |  |  |   // TODO(issue/24571): remove '!'.
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   responseText!: string; | 
					
						
							| 
									
										
										
										
											2015-07-02 01:20:09 +03:00
										 |  |  |   setRequestHeader: any; | 
					
						
							| 
									
										
										
										
											2015-09-29 11:11:06 -07:00
										 |  |  |   callbacks = new Map<string, Function>(); | 
					
						
							| 
									
										
										
										
											2018-06-18 16:38:33 -07:00
										 |  |  |   // TODO(issue/24571): remove '!'.
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   status!: number; | 
					
						
							| 
									
										
										
										
											2018-06-18 16:38:33 -07:00
										 |  |  |   // TODO(issue/24571): remove '!'.
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   responseHeaders!: string; | 
					
						
							| 
									
										
										
										
											2018-06-18 16:38:33 -07:00
										 |  |  |   // TODO(issue/24571): remove '!'.
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   responseURL!: string; | 
					
						
							| 
									
										
										
										
											2018-06-18 16:38:33 -07:00
										 |  |  |   // TODO(issue/24571): remove '!'.
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   statusText!: string; | 
					
						
							| 
									
										
										
										
											2018-06-18 16:38:33 -07:00
										 |  |  |   // TODO(issue/24571): remove '!'.
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   withCredentials!: boolean; | 
					
						
							| 
									
										
										
										
											2015-09-13 19:31:56 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |   constructor() { | 
					
						
							|  |  |  |     super(); | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |     const spy = new SpyObject(); | 
					
						
							| 
									
										
										
										
											2015-06-19 12:14:12 -07:00
										 |  |  |     this.abort = abortSpy = spy.spy('abort'); | 
					
						
							|  |  |  |     this.send = sendSpy = spy.spy('send'); | 
					
						
							|  |  |  |     this.open = openSpy = spy.spy('open'); | 
					
						
							| 
									
										
										
										
											2015-07-02 01:20:09 +03:00
										 |  |  |     this.setRequestHeader = setRequestHeaderSpy = spy.spy('setRequestHeader'); | 
					
						
							| 
									
										
										
										
											2016-07-21 22:44:38 +02:00
										 |  |  |     // If responseType is supported by the browser, then it should be set to an empty string.
 | 
					
						
							|  |  |  |     // (https://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute)
 | 
					
						
							|  |  |  |     this.responseType = ''; | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-06-19 12:14:12 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   setStatusCode(status: number) { | 
					
						
							|  |  |  |     this.status = status; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-07-27 17:01:05 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   setStatusText(statusText: string) { | 
					
						
							|  |  |  |     this.statusText = statusText; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-09-13 19:31:56 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   setResponse(value: string) { | 
					
						
							|  |  |  |     this.response = value; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-07-27 17:01:05 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   setResponseText(value: string) { | 
					
						
							|  |  |  |     this.responseText = value; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-07-27 17:01:05 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   setResponseURL(value: string) { | 
					
						
							|  |  |  |     this.responseURL = value; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-11-19 18:47:29 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   setResponseHeaders(value: string) { | 
					
						
							|  |  |  |     this.responseHeaders = value; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-11-19 17:51:00 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   getAllResponseHeaders() { | 
					
						
							|  |  |  |     return this.responseHeaders || ''; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-11-19 17:51:00 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |   getResponseHeader(key: string) { | 
					
						
							|  |  |  |     return Headers.fromResponseHeaderString(this.responseHeaders).get(key); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-11-19 18:47:29 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   addEventListener(type: string, cb: Function) { | 
					
						
							|  |  |  |     this.callbacks.set(type, cb); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   removeEventListener(type: string, cb: Function) { | 
					
						
							|  |  |  |     this.callbacks.delete(type); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-09-25 18:53:32 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   dispatchEvent(type: string) { | 
					
						
							|  |  |  |     this.callbacks.get(type)!({}); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   build() { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |     const xhr = new MockBrowserXHR(); | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  |     existingXHRs.push(xhr); | 
					
						
							|  |  |  |     return xhr; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-16 14:42:55 -08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |   describe('XHRBackend', () => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |     let backend: XHRBackend; | 
					
						
							|  |  |  |     let sampleRequest: Request; | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-27 20:15:40 -07:00
										 |  |  |     beforeEachProviders( | 
					
						
							|  |  |  |         () => | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |             [{provide: ResponseOptions, useClass: BaseResponseOptions}, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |              {provide: BrowserXhr, useClass: MockBrowserXHR}, | 
					
						
							|  |  |  |              XHRBackend, | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              {provide: XSRFStrategy, useValue: new CookieXSRFStrategy()}, | 
					
						
							| 
									
										
										
										
											2016-05-27 20:15:40 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     beforeEach(inject([XHRBackend], (be: XHRBackend) => { | 
					
						
							|  |  |  |       backend = be; | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |       const base = new BaseRequestOptions(); | 
					
						
							| 
									
										
										
										
											2017-04-17 11:12:53 -07:00
										 |  |  |       sampleRequest = | 
					
						
							|  |  |  |           new Request(base.merge(new RequestOptions({url: 'https://google.com'})) as any); | 
					
						
							| 
									
										
										
										
											2016-05-27 20:15:40 -07:00
										 |  |  |     })); | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |     afterEach(() => { | 
					
						
							|  |  |  |       existingXHRs = []; | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-27 20:15:40 -07:00
										 |  |  |     describe('creating a connection', () => { | 
					
						
							|  |  |  |       @Injectable() | 
					
						
							|  |  |  |       class NoopXsrfStrategy implements XSRFStrategy { | 
					
						
							|  |  |  |         configureRequest(req: Request) {} | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-06-02 17:30:40 -07:00
										 |  |  |       beforeEachProviders(() => [{provide: XSRFStrategy, useClass: NoopXsrfStrategy}]); | 
					
						
							| 
									
										
										
										
											2016-05-27 20:15:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |       it('succeeds', () => { | 
					
						
							|  |  |  |         expect(() => backend.createConnection(sampleRequest)).not.toThrow(); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-05-27 20:15:40 -07:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-27 20:15:40 -07:00
										 |  |  |     if (getDOM().supportsCookies()) { | 
					
						
							|  |  |  |       describe('XSRF support', () => { | 
					
						
							|  |  |  |         it('sets an XSRF header by default', () => { | 
					
						
							| 
									
										
										
										
											2019-08-22 16:14:18 -07:00
										 |  |  |           setCookie('XSRF-TOKEN', 'magic XSRF value'); | 
					
						
							| 
									
										
										
										
											2016-05-27 20:15:40 -07:00
										 |  |  |           backend.createConnection(sampleRequest); | 
					
						
							|  |  |  |           expect(sampleRequest.headers.get('X-XSRF-TOKEN')).toBe('magic XSRF value'); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2016-08-19 09:07:48 +02:00
										 |  |  |         it('should allow overwriting of existing headers', () => { | 
					
						
							| 
									
										
										
										
											2019-08-22 16:14:18 -07:00
										 |  |  |           setCookie('XSRF-TOKEN', 'magic XSRF value'); | 
					
						
							| 
									
										
										
										
											2016-05-27 20:15:40 -07:00
										 |  |  |           sampleRequest.headers.set('X-XSRF-TOKEN', 'already set'); | 
					
						
							|  |  |  |           backend.createConnection(sampleRequest); | 
					
						
							| 
									
										
										
										
											2016-08-19 09:07:48 +02:00
										 |  |  |           expect(sampleRequest.headers.get('X-XSRF-TOKEN')).toBe('magic XSRF value'); | 
					
						
							| 
									
										
										
										
											2016-05-27 20:15:40 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         describe('configuration', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |           beforeEachProviders(() => [{ | 
					
						
							|  |  |  |                                 provide: XSRFStrategy, | 
					
						
							|  |  |  |                                 useValue: new CookieXSRFStrategy('my cookie', 'X-MY-HEADER') | 
					
						
							|  |  |  |                               }]); | 
					
						
							| 
									
										
										
										
											2016-05-27 20:15:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |           it('uses the configured names', () => { | 
					
						
							| 
									
										
										
										
											2019-08-22 16:14:18 -07:00
										 |  |  |             setCookie('my cookie', 'XSRF value'); | 
					
						
							| 
									
										
										
										
											2016-05-27 20:15:40 -07:00
										 |  |  |             backend.createConnection(sampleRequest); | 
					
						
							|  |  |  |             expect(sampleRequest.headers.get('X-MY-HEADER')).toBe('XSRF value'); | 
					
						
							|  |  |  |           }); | 
					
						
							| 
									
										
										
										
											2016-07-21 17:12:00 -07:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2016-05-27 20:15:40 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     describe('XHRConnection', () => { | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  |       it('should use the injected BaseResponseOptions to create the response', | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                sampleRequest, new MockBrowserXHR(), | 
					
						
							|  |  |  |                new ResponseOptions({type: ResponseType.Error})); | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |            connection.response.subscribe((res: Response) => { | 
					
						
							| 
									
										
										
										
											2015-12-03 22:44:14 +01:00
										 |  |  |              expect(res.type).toBe(ResponseType.Error); | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-11-19 17:29:41 -08:00
										 |  |  |            existingXHRs[0].setStatusCode(200); | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |       it('should complete a request', inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                sampleRequest, new MockBrowserXHR(), | 
					
						
							|  |  |  |                new ResponseOptions({type: ResponseType.Error})); | 
					
						
							|  |  |  |            connection.response.subscribe( | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                (res: Response) => { | 
					
						
							|  |  |  |                  expect(res.type).toBe(ResponseType.Error); | 
					
						
							|  |  |  |                }, | 
					
						
							|  |  |  |                null!, | 
					
						
							|  |  |  |                () => { | 
					
						
							|  |  |  |                  async.done(); | 
					
						
							|  |  |  |                }); | 
					
						
							| 
									
										
										
										
											2015-11-19 17:29:41 -08:00
										 |  |  |            existingXHRs[0].setStatusCode(200); | 
					
						
							| 
									
										
										
										
											2015-07-27 16:59:09 -07:00
										 |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |       it('should call abort when disposed', () => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |         const connection = new XHRConnection(sampleRequest, new MockBrowserXHR()); | 
					
						
							|  |  |  |         const request = connection.response.subscribe(); | 
					
						
							| 
									
										
										
										
											2015-09-25 18:53:32 -04:00
										 |  |  |         request.unsubscribe(); | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |         expect(abortSpy).toHaveBeenCalled(); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |       it('should create an error Response on error', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                sampleRequest, new MockBrowserXHR(), | 
					
						
							|  |  |  |                new ResponseOptions({type: ResponseType.Error})); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |            connection.response.subscribe(null!, (res: Response) => { | 
					
						
							| 
									
										
										
										
											2015-12-03 22:44:14 +01:00
										 |  |  |              expect(res.type).toBe(ResponseType.Error); | 
					
						
							| 
									
										
										
										
											2015-08-08 14:17:43 -07:00
										 |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('error'); | 
					
						
							|  |  |  |          })); | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-20 15:02:14 -07:00
										 |  |  |       it('should set the status text and status code on error', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-06-20 15:02:14 -07:00
										 |  |  |                sampleRequest, new MockBrowserXHR(), | 
					
						
							|  |  |  |                new ResponseOptions({type: ResponseType.Error})); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |            connection.response.subscribe(null!, (res: Response) => { | 
					
						
							| 
									
										
										
										
											2016-06-20 15:02:14 -07:00
										 |  |  |              expect(res.type).toBe(ResponseType.Error); | 
					
						
							|  |  |  |              expect(res.status).toEqual(0); | 
					
						
							|  |  |  |              expect(res.statusText).toEqual(''); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  |            const xhr = existingXHRs[0]; | 
					
						
							|  |  |  |            // status=0 with a text='' is common for CORS errors
 | 
					
						
							|  |  |  |            xhr.setStatusCode(0); | 
					
						
							|  |  |  |            xhr.setStatusText(''); | 
					
						
							|  |  |  |            xhr.dispatchEvent('error'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-25 18:53:32 -04:00
										 |  |  |       it('should call open with method and url when subscribed to', () => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |         const connection = new XHRConnection(sampleRequest, new MockBrowserXHR()); | 
					
						
							| 
									
										
										
										
											2015-09-25 18:53:32 -04:00
										 |  |  |         expect(openSpy).not.toHaveBeenCalled(); | 
					
						
							|  |  |  |         connection.response.subscribe(); | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |         expect(openSpy).toHaveBeenCalledWith('GET', sampleRequest.url); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-25 18:53:32 -04:00
										 |  |  |       it('should call send on the backend with request body when subscribed to', () => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |         const body = 'Some body to love'; | 
					
						
							|  |  |  |         const base = new BaseRequestOptions(); | 
					
						
							|  |  |  |         const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2017-04-17 11:12:53 -07:00
										 |  |  |             new Request(base.merge(new RequestOptions({body: body})) as any), new MockBrowserXHR()); | 
					
						
							| 
									
										
										
										
											2015-09-25 18:53:32 -04:00
										 |  |  |         expect(sendSpy).not.toHaveBeenCalled(); | 
					
						
							|  |  |  |         connection.response.subscribe(); | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |         expect(sendSpy).toHaveBeenCalledWith(body); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2015-07-02 01:20:09 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should attach headers to the request', () => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |         const headers = | 
					
						
							| 
									
										
										
										
											2015-10-07 14:56:18 -07:00
										 |  |  |             new Headers({'Content-Type': 'text/xml', 'Breaking-Bad': '<3', 'X-Multi': ['a', 'b']}); | 
					
						
							| 
									
										
										
										
											2015-07-02 01:20:09 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |         const base = new BaseRequestOptions(); | 
					
						
							|  |  |  |         const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2017-04-17 11:12:53 -07:00
										 |  |  |             new Request(base.merge(new RequestOptions({headers: headers})) as any), | 
					
						
							|  |  |  |             new MockBrowserXHR()); | 
					
						
							| 
									
										
										
										
											2015-09-25 18:53:32 -04:00
										 |  |  |         connection.response.subscribe(); | 
					
						
							| 
									
										
										
										
											2016-11-04 13:26:38 -07:00
										 |  |  |         expect(setRequestHeaderSpy).toHaveBeenCalledWith('Content-Type', 'text/xml'); | 
					
						
							|  |  |  |         expect(setRequestHeaderSpy).toHaveBeenCalledWith('Breaking-Bad', '<3'); | 
					
						
							|  |  |  |         expect(setRequestHeaderSpy).toHaveBeenCalledWith('X-Multi', 'a,b'); | 
					
						
							| 
									
										
										
										
											2015-07-02 01:20:09 +03:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2015-07-05 01:58:37 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-07 03:20:43 +03:00
										 |  |  |       it('should attach default Accept header', () => { | 
					
						
							|  |  |  |         const headers = new Headers(); | 
					
						
							|  |  |  |         const base = new BaseRequestOptions(); | 
					
						
							|  |  |  |         const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2017-04-17 11:12:53 -07:00
										 |  |  |             new Request(base.merge(new RequestOptions({headers})) as any), new MockBrowserXHR()); | 
					
						
							| 
									
										
										
										
											2016-12-07 03:20:43 +03:00
										 |  |  |         connection.response.subscribe(); | 
					
						
							|  |  |  |         expect(setRequestHeaderSpy) | 
					
						
							|  |  |  |             .toHaveBeenCalledWith('Accept', 'application/json, text/plain, */*'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should not override user provided Accept header', () => { | 
					
						
							|  |  |  |         const headers = new Headers({'Accept': 'text/xml'}); | 
					
						
							|  |  |  |         const base = new BaseRequestOptions(); | 
					
						
							|  |  |  |         const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2017-04-17 11:12:53 -07:00
										 |  |  |             new Request(base.merge(new RequestOptions({headers})) as any), new MockBrowserXHR()); | 
					
						
							| 
									
										
										
										
											2016-12-07 03:20:43 +03:00
										 |  |  |         connection.response.subscribe(); | 
					
						
							|  |  |  |         expect(setRequestHeaderSpy).toHaveBeenCalledWith('Accept', 'text/xml'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 17:18:49 +02:00
										 |  |  |       it('should skip content type detection if custom content type header is set', () => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |         const headers = new Headers({'Content-Type': 'text/plain'}); | 
					
						
							|  |  |  |         const body = {test: 'val'}; | 
					
						
							|  |  |  |         const base = new BaseRequestOptions(); | 
					
						
							|  |  |  |         const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2017-04-17 11:12:53 -07:00
										 |  |  |             new Request(base.merge(new RequestOptions({body: body, headers: headers})) as any), | 
					
						
							| 
									
										
										
										
											2016-06-10 17:18:49 +02:00
										 |  |  |             new MockBrowserXHR()); | 
					
						
							|  |  |  |         connection.response.subscribe(); | 
					
						
							| 
									
										
										
										
											2016-11-04 13:26:38 -07:00
										 |  |  |         expect(setRequestHeaderSpy).toHaveBeenCalledWith('Content-Type', 'text/plain'); | 
					
						
							|  |  |  |         expect(setRequestHeaderSpy).not.toHaveBeenCalledWith('Content-Type', 'application/json'); | 
					
						
							| 
									
										
										
										
											2016-07-26 12:30:43 +08:00
										 |  |  |         expect(setRequestHeaderSpy).not.toHaveBeenCalledWith('content-type', 'application/json'); | 
					
						
							| 
									
										
										
										
											2016-06-10 17:18:49 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |       it('should use object body and detect content type header to the request', () => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |         const body = {test: 'val'}; | 
					
						
							|  |  |  |         const base = new BaseRequestOptions(); | 
					
						
							|  |  |  |         const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2017-04-17 11:12:53 -07:00
										 |  |  |             new Request(base.merge(new RequestOptions({body: body})) as any), new MockBrowserXHR()); | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |         connection.response.subscribe(); | 
					
						
							| 
									
										
										
										
											2016-10-19 13:42:39 -07:00
										 |  |  |         expect(sendSpy).toHaveBeenCalledWith(JSON.stringify(body, null, 2)); | 
					
						
							| 
									
										
										
										
											2016-07-26 12:30:43 +08:00
										 |  |  |         expect(setRequestHeaderSpy).toHaveBeenCalledWith('content-type', 'application/json'); | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should use number body and detect content type header to the request', () => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |         const body = 23; | 
					
						
							|  |  |  |         const base = new BaseRequestOptions(); | 
					
						
							|  |  |  |         const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2017-04-17 11:12:53 -07:00
										 |  |  |             new Request(base.merge(new RequestOptions({body: body})) as any), new MockBrowserXHR()); | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |         connection.response.subscribe(); | 
					
						
							|  |  |  |         expect(sendSpy).toHaveBeenCalledWith('23'); | 
					
						
							| 
									
										
										
										
											2016-07-26 12:30:43 +08:00
										 |  |  |         expect(setRequestHeaderSpy).toHaveBeenCalledWith('content-type', 'text/plain'); | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should use string body and detect content type header to the request', () => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |         const body = 'some string'; | 
					
						
							|  |  |  |         const base = new BaseRequestOptions(); | 
					
						
							|  |  |  |         const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2017-04-17 11:12:53 -07:00
										 |  |  |             new Request(base.merge(new RequestOptions({body: body})) as any), new MockBrowserXHR()); | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |         connection.response.subscribe(); | 
					
						
							|  |  |  |         expect(sendSpy).toHaveBeenCalledWith(body); | 
					
						
							| 
									
										
										
										
											2016-07-26 12:30:43 +08:00
										 |  |  |         expect(setRequestHeaderSpy).toHaveBeenCalledWith('content-type', 'text/plain'); | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should use URLSearchParams body and detect content type header to the request', () => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |         const body = new URLSearchParams(); | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |         body.set('test1', 'val1'); | 
					
						
							|  |  |  |         body.set('test2', 'val2'); | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |         const base = new BaseRequestOptions(); | 
					
						
							|  |  |  |         const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2017-04-17 11:12:53 -07:00
										 |  |  |             new Request(base.merge(new RequestOptions({body: body})) as any), new MockBrowserXHR()); | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |         connection.response.subscribe(); | 
					
						
							|  |  |  |         expect(sendSpy).toHaveBeenCalledWith('test1=val1&test2=val2'); | 
					
						
							|  |  |  |         expect(setRequestHeaderSpy) | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |             .toHaveBeenCalledWith( | 
					
						
							| 
									
										
										
										
											2016-07-26 12:30:43 +08:00
										 |  |  |                 'content-type', 'application/x-www-form-urlencoded;charset=UTF-8'); | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |       if ((global as any /** TODO #9100 */)['Blob']) { | 
					
						
							| 
									
										
										
										
											2016-07-29 14:37:37 +02:00
										 |  |  |         // `new Blob(...)` throws an 'Illegal constructor' exception in Android browser <= 4.3,
 | 
					
						
							|  |  |  |         // but a BlobBuilder can be used instead
 | 
					
						
							|  |  |  |         const createBlob = (data: Array<string>, datatype: string) => { | 
					
						
							|  |  |  |           let newBlob: Blob; | 
					
						
							|  |  |  |           try { | 
					
						
							|  |  |  |             newBlob = new Blob(data || [], datatype ? {type: datatype} : {}); | 
					
						
							| 
									
										
										
										
											2018-08-14 15:34:51 +02:00
										 |  |  |           } catch { | 
					
						
							| 
									
										
										
										
											2016-07-29 14:37:37 +02:00
										 |  |  |             const BlobBuilder = (<any>global).BlobBuilder || (<any>global).WebKitBlobBuilder || | 
					
						
							|  |  |  |                 (<any>global).MozBlobBuilder || (<any>global).MSBlobBuilder; | 
					
						
							|  |  |  |             const builder = new BlobBuilder(); | 
					
						
							|  |  |  |             builder.append(data); | 
					
						
							|  |  |  |             newBlob = builder.getBlob(datatype); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           return newBlob; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |         it('should use FormData body and detect content type header to the request', () => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |           const body = new FormData(); | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |           body.append('test1', 'val1'); | 
					
						
							| 
									
										
										
										
											2017-05-16 13:29:38 -07:00
										 |  |  |           body.append('test2', '123456'); | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |           const blob = createBlob(['body { color: red; }'], 'text/css'); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |           body.append('userfile', blob); | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |           const base = new BaseRequestOptions(); | 
					
						
							|  |  |  |           const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2017-04-17 11:12:53 -07:00
										 |  |  |               new Request(base.merge(new RequestOptions({body: body})) as any), | 
					
						
							|  |  |  |               new MockBrowserXHR()); | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |           connection.response.subscribe(); | 
					
						
							|  |  |  |           expect(sendSpy).toHaveBeenCalledWith(body); | 
					
						
							|  |  |  |           expect(setRequestHeaderSpy).not.toHaveBeenCalledWith(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should use blob body and detect content type header to the request', () => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |           const body = createBlob(['body { color: red; }'], 'text/css'); | 
					
						
							|  |  |  |           const base = new BaseRequestOptions(); | 
					
						
							|  |  |  |           const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2017-04-17 11:12:53 -07:00
										 |  |  |               new Request(base.merge(new RequestOptions({body: body})) as any), | 
					
						
							|  |  |  |               new MockBrowserXHR()); | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |           connection.response.subscribe(); | 
					
						
							|  |  |  |           expect(sendSpy).toHaveBeenCalledWith(body); | 
					
						
							| 
									
										
										
										
											2016-07-26 12:30:43 +08:00
										 |  |  |           expect(setRequestHeaderSpy).toHaveBeenCalledWith('content-type', 'text/css'); | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should use blob body without type to the request', () => { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |           const body = createBlob(['body { color: red; }'], null!); | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |           const base = new BaseRequestOptions(); | 
					
						
							|  |  |  |           const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |               new Request(base.merge(new RequestOptions({body: body}))), new MockBrowserXHR()); | 
					
						
							|  |  |  |           connection.response.subscribe(); | 
					
						
							|  |  |  |           expect(sendSpy).toHaveBeenCalledWith(body); | 
					
						
							|  |  |  |           expect(setRequestHeaderSpy).not.toHaveBeenCalledWith(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('should use blob body without type with custom content type header to the request', | 
					
						
							|  |  |  |            () => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |              const headers = new Headers({'Content-Type': 'text/css'}); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |              const body = createBlob(['body { color: red; }'], null!); | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |              const base = new BaseRequestOptions(); | 
					
						
							|  |  |  |              const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                  new Request(base.merge(new RequestOptions({body: body, headers: headers}))), | 
					
						
							|  |  |  |                  new MockBrowserXHR()); | 
					
						
							|  |  |  |              connection.response.subscribe(); | 
					
						
							|  |  |  |              expect(sendSpy).toHaveBeenCalledWith(body); | 
					
						
							| 
									
										
										
										
											2016-11-04 13:26:38 -07:00
										 |  |  |              expect(setRequestHeaderSpy).toHaveBeenCalledWith('Content-Type', 'text/css'); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            }); | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         it('should use array buffer body to the request', () => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |           const body = new ArrayBuffer(512); | 
					
						
							|  |  |  |           const longInt8View = new Uint8Array(body); | 
					
						
							|  |  |  |           for (let i = 0; i < longInt8View.length; i++) { | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |             longInt8View[i] = i % 255; | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |           const base = new BaseRequestOptions(); | 
					
						
							|  |  |  |           const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |               new Request(base.merge(new RequestOptions({body: body}))), new MockBrowserXHR()); | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |           connection.response.subscribe(); | 
					
						
							|  |  |  |           expect(sendSpy).toHaveBeenCalledWith(body); | 
					
						
							|  |  |  |           expect(setRequestHeaderSpy).not.toHaveBeenCalledWith(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should use array buffer body without type with custom content type header to the request', | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            () => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |              const headers = new Headers({'Content-Type': 'text/css'}); | 
					
						
							|  |  |  |              const body = new ArrayBuffer(512); | 
					
						
							|  |  |  |              const longInt8View = new Uint8Array(body); | 
					
						
							|  |  |  |              for (let i = 0; i < longInt8View.length; i++) { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                longInt8View[i] = i % 255; | 
					
						
							|  |  |  |              } | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |              const base = new BaseRequestOptions(); | 
					
						
							|  |  |  |              const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                  new Request(base.merge(new RequestOptions({body: body, headers: headers}))), | 
					
						
							|  |  |  |                  new MockBrowserXHR()); | 
					
						
							|  |  |  |              connection.response.subscribe(); | 
					
						
							|  |  |  |              expect(sendSpy).toHaveBeenCalledWith(body); | 
					
						
							| 
									
										
										
										
											2016-11-04 13:26:38 -07:00
										 |  |  |              expect(setRequestHeaderSpy).toHaveBeenCalledWith('Content-Type', 'text/css'); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            }); | 
					
						
							| 
									
										
										
										
											2016-02-26 12:25:55 +01:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |       it('should return the correct status code', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const statusCode = 418; | 
					
						
							|  |  |  |            const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                sampleRequest, new MockBrowserXHR(), new ResponseOptions({status: statusCode})); | 
					
						
							| 
									
										
										
										
											2015-07-05 01:58:37 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-19 17:29:41 -08:00
										 |  |  |            connection.response.subscribe( | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |                (res: Response) => { | 
					
						
							| 
									
										
										
										
											2015-11-19 17:29:41 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |                }, | 
					
						
							| 
									
										
										
										
											2017-12-17 15:10:54 -08:00
										 |  |  |                (errRes: Response) => { | 
					
						
							| 
									
										
										
										
											2015-11-19 17:29:41 -08:00
										 |  |  |                  expect(errRes.status).toBe(statusCode); | 
					
						
							|  |  |  |                  async.done(); | 
					
						
							|  |  |  |                }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(statusCode); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |       it('should call next and complete on 200 codes', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            let nextCalled = false; | 
					
						
							|  |  |  |            let errorCalled = false; | 
					
						
							|  |  |  |            const statusCode = 200; | 
					
						
							|  |  |  |            const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                sampleRequest, new MockBrowserXHR(), new ResponseOptions({status: statusCode})); | 
					
						
							| 
									
										
										
										
											2015-11-19 17:29:41 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |            connection.response.subscribe( | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |                (res: Response) => { | 
					
						
							| 
									
										
										
										
											2015-11-19 17:29:41 -08:00
										 |  |  |                  nextCalled = true; | 
					
						
							|  |  |  |                  expect(res.status).toBe(statusCode); | 
					
						
							|  |  |  |                }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                (errRes: Response) => { | 
					
						
							|  |  |  |                  errorCalled = true; | 
					
						
							|  |  |  |                }, | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                () => { | 
					
						
							| 
									
										
										
										
											2015-11-19 17:29:41 -08:00
										 |  |  |                  expect(nextCalled).toBe(true); | 
					
						
							|  |  |  |                  expect(errorCalled).toBe(false); | 
					
						
							|  |  |  |                  async.done(); | 
					
						
							|  |  |  |                }); | 
					
						
							| 
									
										
										
										
											2015-07-05 01:58:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(statusCode); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should set ok to true on 200 return', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const statusCode = 200; | 
					
						
							|  |  |  |            const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                sampleRequest, new MockBrowserXHR(), new ResponseOptions({status: statusCode})); | 
					
						
							| 
									
										
										
										
											2016-01-15 05:49:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-17 15:10:54 -08:00
										 |  |  |            connection.response.subscribe((res: Response) => { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              expect(res.ok).toBe(true); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2016-01-15 05:49:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            existingXHRs[0].setStatusCode(statusCode); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							| 
									
										
										
										
											2016-01-15 05:49:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should set ok to false on 300 return', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const statusCode = 300; | 
					
						
							|  |  |  |            const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                sampleRequest, new MockBrowserXHR(), new ResponseOptions({status: statusCode})); | 
					
						
							| 
									
										
										
										
											2016-01-15 05:49:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            connection.response.subscribe( | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                (res: Response) => { | 
					
						
							|  |  |  |                  throw 'should not be called'; | 
					
						
							|  |  |  |                }, | 
					
						
							| 
									
										
										
										
											2017-12-17 15:10:54 -08:00
										 |  |  |                (errRes: Response) => { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                  expect(errRes.ok).toBe(false); | 
					
						
							|  |  |  |                  async.done(); | 
					
						
							|  |  |  |                }); | 
					
						
							| 
									
										
										
										
											2016-01-15 05:49:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            existingXHRs[0].setStatusCode(statusCode); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							| 
									
										
										
										
											2016-01-15 05:49:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |       it('should call error and not complete on 300+ codes', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            let nextCalled = false; | 
					
						
							|  |  |  |            const errorCalled = false; | 
					
						
							|  |  |  |            const statusCode = 301; | 
					
						
							|  |  |  |            const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                sampleRequest, new MockBrowserXHR(), new ResponseOptions({status: statusCode})); | 
					
						
							| 
									
										
										
										
											2015-11-19 17:29:41 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            connection.response.subscribe( | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                (res: Response) => { | 
					
						
							|  |  |  |                  nextCalled = true; | 
					
						
							|  |  |  |                }, | 
					
						
							| 
									
										
										
										
											2017-12-17 15:10:54 -08:00
										 |  |  |                (errRes: Response) => { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                  expect(errRes.status).toBe(statusCode); | 
					
						
							|  |  |  |                  expect(nextCalled).toBe(false); | 
					
						
							|  |  |  |                  async.done(); | 
					
						
							|  |  |  |                }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                () => { | 
					
						
							|  |  |  |                  throw 'should not be called'; | 
					
						
							|  |  |  |                }); | 
					
						
							| 
									
										
										
										
											2015-11-19 17:29:41 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(statusCode); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							| 
									
										
										
										
											2016-11-12 12:15:12 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |       it('should normalize IE\'s 1223 status code into 204', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const statusCode = 1223; | 
					
						
							|  |  |  |            const normalizedCode = 204; | 
					
						
							|  |  |  |            const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                sampleRequest, new MockBrowserXHR(), new ResponseOptions({status: statusCode})); | 
					
						
							| 
									
										
										
										
											2015-07-05 01:58:37 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |            connection.response.subscribe((res: Response) => { | 
					
						
							| 
									
										
										
										
											2015-07-05 01:58:37 -07:00
										 |  |  |              expect(res.status).toBe(normalizedCode); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(statusCode); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							| 
									
										
										
										
											2015-07-27 17:01:05 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-12 12:15:12 +03:00
										 |  |  |       it('should ignore response body for 204 status code', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							|  |  |  |            const statusCode = 204; | 
					
						
							|  |  |  |            const connection = new XHRConnection( | 
					
						
							|  |  |  |                sampleRequest, new MockBrowserXHR(), new ResponseOptions({status: statusCode})); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            connection.response.subscribe((res: Response) => { | 
					
						
							|  |  |  |              expect(res.text()).toBe(''); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(statusCode); | 
					
						
							|  |  |  |            existingXHRs[0].setResponseText('Doge'); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |       it('should normalize responseText and response', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const responseBody = 'Doge'; | 
					
						
							| 
									
										
										
										
											2015-07-27 17:01:05 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const connection1 = | 
					
						
							| 
									
										
										
										
											2015-07-27 17:01:05 -07:00
										 |  |  |                new XHRConnection(sampleRequest, new MockBrowserXHR(), new ResponseOptions()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const connection2 = | 
					
						
							| 
									
										
										
										
											2015-07-27 17:01:05 -07:00
										 |  |  |                new XHRConnection(sampleRequest, new MockBrowserXHR(), new ResponseOptions()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |            connection1.response.subscribe((res: Response) => { | 
					
						
							| 
									
										
										
										
											2015-07-27 17:01:05 -07:00
										 |  |  |              expect(res.text()).toBe(responseBody); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-17 15:10:54 -08:00
										 |  |  |              connection2.response.subscribe((res: Response) => { | 
					
						
							|  |  |  |                expect(res.text()).toBe(responseBody); | 
					
						
							| 
									
										
										
										
											2015-07-27 17:01:05 -07:00
										 |  |  |                async.done(); | 
					
						
							|  |  |  |              }); | 
					
						
							| 
									
										
										
										
											2015-11-19 17:29:41 -08:00
										 |  |  |              existingXHRs[1].setStatusCode(200); | 
					
						
							| 
									
										
										
										
											2015-09-25 18:53:32 -04:00
										 |  |  |              existingXHRs[1].setResponse(responseBody); | 
					
						
							| 
									
										
										
										
											2015-07-27 17:01:05 -07:00
										 |  |  |              existingXHRs[1].dispatchEvent('load'); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-11-19 17:29:41 -08:00
										 |  |  |            existingXHRs[0].setStatusCode(200); | 
					
						
							| 
									
										
										
										
											2015-07-27 17:01:05 -07:00
										 |  |  |            existingXHRs[0].setResponseText(responseBody); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 20:50:58 -07:00
										 |  |  |       it('should strip XSSI prefixes', inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const conn = | 
					
						
							|  |  |  |                new XHRConnection(sampleRequest, new MockBrowserXHR(), new ResponseOptions()); | 
					
						
							| 
									
										
										
										
											2016-06-08 20:50:58 -07:00
										 |  |  |            conn.response.subscribe((res: Response) => { | 
					
						
							|  |  |  |              expect(res.text()).toBe('{json: "object"}'); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(200); | 
					
						
							|  |  |  |            existingXHRs[0].setResponseText(')]}\'\n{json: "object"}'); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-05 14:25:44 -07:00
										 |  |  |       it('should strip XSSI prefixes', inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const conn = | 
					
						
							|  |  |  |                new XHRConnection(sampleRequest, new MockBrowserXHR(), new ResponseOptions()); | 
					
						
							| 
									
										
										
										
											2016-05-05 14:25:44 -07:00
										 |  |  |            conn.response.subscribe((res: Response) => { | 
					
						
							|  |  |  |              expect(res.text()).toBe('{json: "object"}'); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(200); | 
					
						
							|  |  |  |            existingXHRs[0].setResponseText(')]}\',\n{json: "object"}'); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should strip XSSI prefix from errors', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const conn = | 
					
						
							|  |  |  |                new XHRConnection(sampleRequest, new MockBrowserXHR(), new ResponseOptions()); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |            conn.response.subscribe(null!, (res: Response) => { | 
					
						
							| 
									
										
										
										
											2016-05-05 14:25:44 -07:00
										 |  |  |              expect(res.text()).toBe('{json: "object"}'); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(404); | 
					
						
							| 
									
										
										
										
											2016-06-08 20:50:58 -07:00
										 |  |  |            existingXHRs[0].setResponseText(')]}\'\n{json: "object"}'); | 
					
						
							| 
									
										
										
										
											2016-05-05 14:25:44 -07:00
										 |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-19 17:51:00 -08:00
										 |  |  |       it('should parse response headers and add them to the response', | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const statusCode = 200; | 
					
						
							|  |  |  |            const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                sampleRequest, new MockBrowserXHR(), new ResponseOptions({status: statusCode})); | 
					
						
							| 
									
										
										
										
											2015-11-19 17:51:00 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const responseHeaderString = `Date: Fri, 20 Nov 2015 01:45:26 GMT
 | 
					
						
							| 
									
										
										
										
											2016-07-29 13:19:49 +08:00
										 |  |  | Content-Type: application/json; charset=utf-8 | 
					
						
							|  |  |  | Transfer-Encoding: chunked | 
					
						
							|  |  |  | Connection: keep-alive`;
 | 
					
						
							| 
									
										
										
										
											2015-11-19 17:51:00 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            connection.response.subscribe((res: Response) => { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |              expect(res.headers!.get('Date')).toEqual('Fri, 20 Nov 2015 01:45:26 GMT'); | 
					
						
							|  |  |  |              expect(res.headers!.get('Content-Type')).toEqual('application/json; charset=utf-8'); | 
					
						
							|  |  |  |              expect(res.headers!.get('Transfer-Encoding')).toEqual('chunked'); | 
					
						
							|  |  |  |              expect(res.headers!.get('Connection')).toEqual('keep-alive'); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-11-19 17:51:00 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].setResponseHeaders(responseHeaderString); | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(statusCode); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							| 
									
										
										
										
											2015-11-19 18:47:29 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |       it('should add the responseURL to the response', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const statusCode = 200; | 
					
						
							|  |  |  |            const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                sampleRequest, new MockBrowserXHR(), new ResponseOptions({status: statusCode})); | 
					
						
							| 
									
										
										
										
											2015-11-19 18:47:29 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |            connection.response.subscribe((res: Response) => { | 
					
						
							| 
									
										
										
										
											2015-11-19 18:47:29 -08:00
										 |  |  |              expect(res.url).toEqual('http://google.com'); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].setResponseURL('http://google.com'); | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(statusCode); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should add use the X-Request-URL in CORS situations', | 
					
						
							| 
									
										
										
										
											2016-02-01 17:05:50 -08:00
										 |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const statusCode = 200; | 
					
						
							|  |  |  |            const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                sampleRequest, new MockBrowserXHR(), new ResponseOptions({status: statusCode})); | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const responseHeaders = `X-Request-URL: http://somedomain.com
 | 
					
						
							| 
									
										
										
										
											2016-07-21 17:12:00 -07:00
										 |  |  |            Foo: Bar`;
 | 
					
						
							| 
									
										
										
										
											2015-11-19 18:47:29 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            connection.response.subscribe((res: Response) => { | 
					
						
							|  |  |  |              expect(res.url).toEqual('http://somedomain.com'); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-11-19 18:47:29 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].setResponseHeaders(responseHeaders); | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(statusCode); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							| 
									
										
										
										
											2015-09-13 19:31:56 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-12 20:20:50 +03:00
										 |  |  |       it('should return request url if it cannot be retrieved from response', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							|  |  |  |            const statusCode = 200; | 
					
						
							|  |  |  |            const connection = new XHRConnection( | 
					
						
							|  |  |  |                sampleRequest, new MockBrowserXHR(), new ResponseOptions({status: statusCode})); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            connection.response.subscribe((res: Response) => { | 
					
						
							|  |  |  |              expect(res.url).toEqual('https://google.com'); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(statusCode); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-13 19:31:56 +03:00
										 |  |  |       it('should set the status text property from the XMLHttpRequest instance if present', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const statusText = 'test'; | 
					
						
							|  |  |  |            const connection = new XHRConnection(sampleRequest, new MockBrowserXHR()); | 
					
						
							| 
									
										
										
										
											2015-09-13 19:31:56 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |            connection.response.subscribe((res: Response) => { | 
					
						
							|  |  |  |              expect(res.statusText).toBe(statusText); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].setStatusText(statusText); | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(200); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should set status text to "OK" if it is not present in XMLHttpRequest instance', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const connection = new XHRConnection(sampleRequest, new MockBrowserXHR()); | 
					
						
							| 
									
										
										
										
											2015-09-13 19:31:56 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |            connection.response.subscribe((res: Response) => { | 
					
						
							|  |  |  |              expect(res.statusText).toBe('OK'); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(200); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-24 22:57:35 +01:00
										 |  |  |       it('should set withCredentials to true when defined in request options for CORS situations', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const statusCode = 200; | 
					
						
							| 
									
										
										
										
											2016-02-24 22:57:35 +01:00
										 |  |  |            sampleRequest.withCredentials = true; | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const mockXhr = new MockBrowserXHR(); | 
					
						
							|  |  |  |            const connection = | 
					
						
							| 
									
										
										
										
											2016-02-24 22:57:35 +01:00
										 |  |  |                new XHRConnection(sampleRequest, mockXhr, new ResponseOptions({status: statusCode})); | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const responseHeaders = `X-Request-URL: http://somedomain.com
 | 
					
						
							| 
									
										
										
										
											2016-07-21 17:12:00 -07:00
										 |  |  |            Foo: Bar`;
 | 
					
						
							| 
									
										
										
										
											2016-02-24 22:57:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            connection.response.subscribe((res: Response) => { | 
					
						
							|  |  |  |              expect(res.url).toEqual('http://somedomain.com'); | 
					
						
							|  |  |  |              expect(existingXHRs[0].withCredentials).toBeTruthy(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2016-02-24 22:57:35 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].setResponseHeaders(responseHeaders); | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(statusCode); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							| 
									
										
										
										
											2016-07-21 22:44:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should set the responseType attribute to blob when the corresponding response content type is present', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |            const statusCode = 200; | 
					
						
							|  |  |  |            const base = new BaseRequestOptions(); | 
					
						
							|  |  |  |            const connection = new XHRConnection( | 
					
						
							| 
									
										
										
										
											2016-07-21 22:44:38 +02:00
										 |  |  |                new Request( | 
					
						
							|  |  |  |                    base.merge(new RequestOptions({responseType: ResponseContentType.Blob}))), | 
					
						
							|  |  |  |                new MockBrowserXHR()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            connection.response.subscribe((res: Response) => { | 
					
						
							|  |  |  |              expect(existingXHRs[0].responseType).toBe('blob'); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(statusCode); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							| 
									
										
										
										
											2016-09-23 22:44:01 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should not throw invalidStateError if response without body and responseType not equal to text', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							|  |  |  |            const base = new BaseRequestOptions(); | 
					
						
							|  |  |  |            const connection = new XHRConnection( | 
					
						
							|  |  |  |                new Request( | 
					
						
							|  |  |  |                    base.merge(new RequestOptions({responseType: ResponseContentType.Json}))), | 
					
						
							|  |  |  |                new MockBrowserXHR()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            connection.response.subscribe((res: Response) => { | 
					
						
							|  |  |  |              expect(res.json()).toBe(null); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(204); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } |