| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  | import { | 
					
						
							|  |  |  |   AsyncTestCompleter, | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  |   afterEach, | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |   beforeEach, | 
					
						
							|  |  |  |   ddescribe, | 
					
						
							|  |  |  |   describe, | 
					
						
							|  |  |  |   expect, | 
					
						
							|  |  |  |   iit, | 
					
						
							|  |  |  |   inject, | 
					
						
							|  |  |  |   it, | 
					
						
							|  |  |  |   xit, | 
					
						
							|  |  |  |   SpyObject | 
					
						
							|  |  |  | } from 'angular2/test_lib'; | 
					
						
							| 
									
										
										
										
											2015-08-20 14:28:25 -07:00
										 |  |  | import {ObservableWrapper} from 'angular2/src/core/facade/async'; | 
					
						
							|  |  |  | import {BrowserXhr} from 'angular2/src/http/backends/browser_xhr'; | 
					
						
							|  |  |  | import {XHRConnection, XHRBackend} from 'angular2/src/http/backends/xhr_backend'; | 
					
						
							| 
									
										
										
										
											2015-09-03 22:01:36 -07:00
										 |  |  | import {bind, Injector} from 'angular2/core'; | 
					
						
							| 
									
										
										
										
											2015-08-20 14:28:25 -07:00
										 |  |  | import {Request} from 'angular2/src/http/static_request'; | 
					
						
							|  |  |  | import {Response} from 'angular2/src/http/static_response'; | 
					
						
							|  |  |  | import {Headers} from 'angular2/src/http/headers'; | 
					
						
							|  |  |  | import {Map} from 'angular2/src/core/facade/collection'; | 
					
						
							|  |  |  | import {RequestOptions, BaseRequestOptions} from 'angular2/src/http/base_request_options'; | 
					
						
							|  |  |  | import {BaseResponseOptions, ResponseOptions} from 'angular2/src/http/base_response_options'; | 
					
						
							|  |  |  | import {ResponseTypes} from 'angular2/src/http/enums'; | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | var abortSpy; | 
					
						
							|  |  |  | var sendSpy; | 
					
						
							|  |  |  | var openSpy; | 
					
						
							| 
									
										
										
										
											2015-07-02 01:20:09 +03:00
										 |  |  | var setRequestHeaderSpy; | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  | var addEventListenerSpy; | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  | var existingXHRs = []; | 
					
						
							| 
									
										
										
										
											2015-07-07 20:03:00 -07:00
										 |  |  | var unused: Response; | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  |   responseText: string; | 
					
						
							| 
									
										
										
										
											2015-07-02 01:20:09 +03:00
										 |  |  |   setRequestHeader: any; | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  |   callbacks: Map<string, Function>; | 
					
						
							| 
									
										
										
										
											2015-07-05 01:58:37 -07:00
										 |  |  |   status: number; | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |   constructor() { | 
					
						
							|  |  |  |     super(); | 
					
						
							| 
									
										
										
										
											2015-06-19 12:14:12 -07:00
										 |  |  |     var spy = new SpyObject(); | 
					
						
							|  |  |  |     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'); | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  |     this.callbacks = new Map(); | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-06-19 12:14:12 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-05 01:58:37 -07:00
										 |  |  |   setStatusCode(status) { this.status = status; } | 
					
						
							| 
									
										
										
										
											2015-07-27 17:01:05 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   setResponse(value) { this.response = value; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   setResponseText(value) { this.responseText = value; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  |   addEventListener(type: string, cb: Function) { this.callbacks.set(type, cb); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   dispatchEvent(type: string) { this.callbacks.get(type)({}); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   build() { | 
					
						
							|  |  |  |     var xhr = new MockBrowserXHR(); | 
					
						
							|  |  |  |     existingXHRs.push(xhr); | 
					
						
							|  |  |  |     return xhr; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function main() { | 
					
						
							|  |  |  |   describe('XHRBackend', () => { | 
					
						
							|  |  |  |     var backend; | 
					
						
							|  |  |  |     var sampleRequest; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     beforeEach(() => { | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  |       var injector = Injector.resolveAndCreate([ | 
					
						
							|  |  |  |         bind(ResponseOptions) | 
					
						
							|  |  |  |             .toClass(BaseResponseOptions), | 
					
						
							|  |  |  |         bind(BrowserXhr).toClass(MockBrowserXHR), | 
					
						
							|  |  |  |         XHRBackend | 
					
						
							|  |  |  |       ]); | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |       backend = injector.get(XHRBackend); | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  |       var base = new BaseRequestOptions(); | 
					
						
							|  |  |  |       sampleRequest = new Request(base.merge(new RequestOptions({url: 'https://google.com'}))); | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  |     afterEach(() => { existingXHRs = []; }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |     it('should create a connection', | 
					
						
							|  |  |  |        () => { expect(() => backend.createConnection(sampleRequest)).not.toThrow(); }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('XHRConnection', () => { | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  |       it('should use the injected BaseResponseOptions to create the response', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], async => { | 
					
						
							|  |  |  |            var connection = new XHRConnection(sampleRequest, new MockBrowserXHR(), | 
					
						
							|  |  |  |                                               new ResponseOptions({type: ResponseTypes.Error})); | 
					
						
							| 
									
										
										
										
											2015-07-07 20:03:00 -07:00
										 |  |  |            ObservableWrapper.subscribe<Response>(connection.response, res => { | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  |              expect(res.type).toBe(ResponseTypes.Error); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 16:59:09 -07:00
										 |  |  |       it('should complete a request', inject([AsyncTestCompleter], async => { | 
					
						
							|  |  |  |            var connection = new XHRConnection(sampleRequest, new MockBrowserXHR(), | 
					
						
							|  |  |  |                                               new ResponseOptions({type: ResponseTypes.Error})); | 
					
						
							|  |  |  |            ObservableWrapper.subscribe<Response>(connection.response, res => { | 
					
						
							|  |  |  |              expect(res.type).toBe(ResponseTypes.Error); | 
					
						
							|  |  |  |            }, null, () => { async.done(); }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |       it('should call abort when disposed', () => { | 
					
						
							| 
									
										
										
										
											2015-06-19 12:14:12 -07:00
										 |  |  |         var connection = new XHRConnection(sampleRequest, new MockBrowserXHR()); | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |         connection.dispose(); | 
					
						
							|  |  |  |         expect(abortSpy).toHaveBeenCalled(); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-08 14:17:43 -07:00
										 |  |  |       it('should create an error Response on error', inject([AsyncTestCompleter], async => { | 
					
						
							|  |  |  |            var connection = new XHRConnection(sampleRequest, new MockBrowserXHR(), | 
					
						
							|  |  |  |                                               new ResponseOptions({type: ResponseTypes.Error})); | 
					
						
							|  |  |  |            ObservableWrapper.subscribe(connection.response, null, res => { | 
					
						
							|  |  |  |              expect(res.type).toBe(ResponseTypes.Error); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('error'); | 
					
						
							|  |  |  |          })); | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should automatically call open with method and url', () => { | 
					
						
							| 
									
										
										
										
											2015-06-19 12:14:12 -07:00
										 |  |  |         new XHRConnection(sampleRequest, new MockBrowserXHR()); | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |         expect(openSpy).toHaveBeenCalledWith('GET', sampleRequest.url); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should automatically call send on the backend with request body', () => { | 
					
						
							|  |  |  |         var body = 'Some body to love'; | 
					
						
							| 
									
										
										
										
											2015-06-24 00:27:07 -07:00
										 |  |  |         var base = new BaseRequestOptions(); | 
					
						
							|  |  |  |         new XHRConnection(new Request(base.merge(new RequestOptions({body: body}))), | 
					
						
							|  |  |  |                           new MockBrowserXHR()); | 
					
						
							| 
									
										
										
										
											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', () => { | 
					
						
							|  |  |  |         var headers = new Headers({'Content-Type': 'text/xml', 'Breaking-Bad': '<3'}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         var base = new BaseRequestOptions(); | 
					
						
							|  |  |  |         new XHRConnection(new Request(base.merge(new RequestOptions({headers: headers}))), | 
					
						
							|  |  |  |                           new MockBrowserXHR()); | 
					
						
							|  |  |  |         expect(setRequestHeaderSpy).toHaveBeenCalledWith('Content-Type', ['text/xml']); | 
					
						
							|  |  |  |         expect(setRequestHeaderSpy).toHaveBeenCalledWith('Breaking-Bad', ['<3']); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2015-07-05 01:58:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should return the correct status code', inject([AsyncTestCompleter], async => { | 
					
						
							|  |  |  |            var statusCode = 418; | 
					
						
							|  |  |  |            var connection = new XHRConnection(sampleRequest, new MockBrowserXHR(), | 
					
						
							|  |  |  |                                               new ResponseOptions({status: statusCode})); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 17:01:05 -07:00
										 |  |  |            ObservableWrapper.subscribe<Response>(connection.response, res => { | 
					
						
							| 
									
										
										
										
											2015-07-05 01:58:37 -07:00
										 |  |  |              expect(res.status).toBe(statusCode); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].setStatusCode(statusCode); | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should normalize IE\'s 1223 status code into 204', inject([AsyncTestCompleter], async => { | 
					
						
							|  |  |  |            var statusCode = 1223; | 
					
						
							|  |  |  |            var normalizedCode = 204; | 
					
						
							|  |  |  |            var connection = new XHRConnection(sampleRequest, new MockBrowserXHR(), | 
					
						
							|  |  |  |                                               new ResponseOptions({status: statusCode})); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 17:01:05 -07:00
										 |  |  |            ObservableWrapper.subscribe<Response>(connection.response, res => { | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should normalize responseText and response', inject([AsyncTestCompleter], async => { | 
					
						
							|  |  |  |            var responseBody = 'Doge'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var connection1 = | 
					
						
							|  |  |  |                new XHRConnection(sampleRequest, new MockBrowserXHR(), new ResponseOptions()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var connection2 = | 
					
						
							|  |  |  |                new XHRConnection(sampleRequest, new MockBrowserXHR(), new ResponseOptions()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            ObservableWrapper.subscribe<Response>(connection1.response, res => { | 
					
						
							|  |  |  |              expect(res.text()).toBe(responseBody); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              ObservableWrapper.subscribe<Response>(connection2.response, ress => { | 
					
						
							|  |  |  |                expect(ress.text()).toBe(responseBody); | 
					
						
							|  |  |  |                async.done(); | 
					
						
							|  |  |  |              }); | 
					
						
							|  |  |  |              existingXHRs[1].dispatchEvent('load'); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].setResponseText(responseBody); | 
					
						
							|  |  |  |            existingXHRs[1].setResponse(responseBody); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            existingXHRs[0].dispatchEvent('load'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-28 23:07:55 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } |