| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  | /* tslint:disable:no-unused-variable */ | 
					
						
							|  |  |  | import { | 
					
						
							| 
									
										
										
										
											2016-04-14 10:36:38 -07:00
										 |  |  |   beforeEach, beforeEachProviders, withProviders, | 
					
						
							|  |  |  |   describe, ddescribe, xdescribe, | 
					
						
							|  |  |  |   expect, it, iit, xit, | 
					
						
							| 
									
										
										
										
											2016-04-26 16:15:40 -07:00
										 |  |  |   async, inject, TestComponentBuilder | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  | } from 'angular2/testing'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import { provide } from 'angular2/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import { | 
					
						
							|  |  |  |   MockBackend, | 
					
						
							|  |  |  |   MockConnection } from 'angular2/src/http/backends/mock_backend'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import { | 
					
						
							| 
									
										
										
										
											2016-04-14 10:36:38 -07:00
										 |  |  |   Http, HTTP_PROVIDERS, | 
					
						
							|  |  |  |   ConnectionBackend, XHRBackend, | 
					
						
							|  |  |  |   Request, RequestMethod, BaseRequestOptions, RequestOptions, | 
					
						
							|  |  |  |   Response, ResponseOptions, | 
					
						
							|  |  |  |   URLSearchParams | 
					
						
							|  |  |  | } from 'angular2/http'; | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Add all operators to Observable
 | 
					
						
							|  |  |  | import 'rxjs/Rx'; | 
					
						
							|  |  |  | import { Observable } from 'rxjs/Observable'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import { Hero }        from './hero'; | 
					
						
							|  |  |  | import { HeroService } from './http-hero.service'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type HeroData = {id: string, name: string} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const makeHeroData = () => [ | 
					
						
							| 
									
										
										
										
											2016-04-14 10:36:38 -07:00
										 |  |  |   { id: '1', name: 'Windstorm' }, | 
					
						
							|  |  |  |   { id: '2', name: 'Bombasto' }, | 
					
						
							|  |  |  |   { id: '3', name: 'Magneta' }, | 
					
						
							|  |  |  |   { id: '4', name: 'Tornado' } | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  | ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // HeroService expects response data like {data: {the-data}}
 | 
					
						
							|  |  |  | const makeResponseData = (data: {}) => {return { data }; }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ////////  SPECS  /////////////
 | 
					
						
							|  |  |  | describe('Http-HeroService (mockBackend)', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   beforeEachProviders(() => [ | 
					
						
							|  |  |  |     HTTP_PROVIDERS, | 
					
						
							|  |  |  |     provide(XHRBackend, {useClass: MockBackend}) | 
					
						
							|  |  |  |   ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('can instantiate service when inject service', | 
					
						
							|  |  |  |     withProviders(() => [HeroService]) | 
					
						
							|  |  |  |       .inject([HeroService], (service: HeroService) => { | 
					
						
							|  |  |  |         expect(service instanceof HeroService).toBe(true); | 
					
						
							|  |  |  |   })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('can instantiate service with "new"', inject([Http], (http: Http) => { | 
					
						
							|  |  |  |     expect(http).not.toBeNull('http should be provided'); | 
					
						
							|  |  |  |     let service = new HeroService(http); | 
					
						
							|  |  |  |     expect(service instanceof HeroService).toBe(true, 'new service should be ok'); | 
					
						
							|  |  |  |   })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('can provide the mockBackend as XHRBackend', | 
					
						
							|  |  |  |     inject([XHRBackend], (backend: MockBackend) => { | 
					
						
							|  |  |  |       expect(backend).not.toBeNull('backend should be provided'); | 
					
						
							|  |  |  |   })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('when getHeroes', () => { | 
					
						
							|  |  |  |       let backend: MockBackend; | 
					
						
							|  |  |  |       let service: HeroService; | 
					
						
							|  |  |  |       let fakeHeroes: HeroData[]; | 
					
						
							|  |  |  |       let response: Response; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => { | 
					
						
							|  |  |  |         backend = be; | 
					
						
							|  |  |  |         service = new HeroService(http); | 
					
						
							|  |  |  |         fakeHeroes = makeHeroData(); | 
					
						
							|  |  |  |         let options = new ResponseOptions({status: 200, body: {data: fakeHeroes}}); | 
					
						
							|  |  |  |         response = new Response(options); | 
					
						
							|  |  |  |       })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 16:15:40 -07:00
										 |  |  |       it('should have expected fake heroes (then)', async(inject([], () => { | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  |         backend.connections.subscribe((c: MockConnection) => c.mockRespond(response)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 16:15:40 -07:00
										 |  |  |         service.getHeroes().toPromise() | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  |         // .then(() => Promise.reject('deliberate'))
 | 
					
						
							|  |  |  |           .then(heroes => { | 
					
						
							|  |  |  |             expect(heroes.length).toEqual(fakeHeroes.length, | 
					
						
							|  |  |  |               'should have expected no. of heroes'); | 
					
						
							|  |  |  |           }); | 
					
						
							| 
									
										
										
										
											2016-04-26 16:15:40 -07:00
										 |  |  |       }))); | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 16:15:40 -07:00
										 |  |  |       it('should have expected fake heroes (Observable.do)', async(inject([], () => { | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  |         backend.connections.subscribe((c: MockConnection) => c.mockRespond(response)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 16:15:40 -07:00
										 |  |  |         service.getHeroes() | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  |           .do(heroes => { | 
					
						
							|  |  |  |             expect(heroes.length).toEqual(fakeHeroes.length, | 
					
						
							|  |  |  |               'should have expected no. of heroes'); | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |           .toPromise(); | 
					
						
							| 
									
										
										
										
											2016-04-26 16:15:40 -07:00
										 |  |  |       }))); | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 16:15:40 -07:00
										 |  |  |       it('should be OK returning no heroes', async(inject([], () => { | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  |         let resp = new Response(new ResponseOptions({status: 200, body: {data: []}})); | 
					
						
							|  |  |  |         backend.connections.subscribe((c: MockConnection) => c.mockRespond(resp)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 16:15:40 -07:00
										 |  |  |         service.getHeroes() | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  |           .do(heroes => { | 
					
						
							|  |  |  |             expect(heroes.length).toEqual(0, 'should have no heroes'); | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |           .toPromise(); | 
					
						
							| 
									
										
										
										
											2016-04-26 16:15:40 -07:00
										 |  |  |       }))); | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 16:15:40 -07:00
										 |  |  |       it('should treat 404 as an Observable error', async(inject([], () => { | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  |         let resp = new Response(new ResponseOptions({status: 404})); | 
					
						
							|  |  |  |         backend.connections.subscribe((c: MockConnection) => c.mockRespond(resp)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 16:15:40 -07:00
										 |  |  |         service.getHeroes() | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  |           .do(heroes => { | 
					
						
							|  |  |  |             fail('should not respond with heroes'); | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |           .catch(err => { | 
					
						
							|  |  |  |             expect(err).toMatch(/Bad response status/, 'should catch bad response status code'); | 
					
						
							|  |  |  |             return Observable.of(null); // failure is the expected test result
 | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |           .toPromise(); | 
					
						
							| 
									
										
										
										
											2016-04-26 16:15:40 -07:00
										 |  |  |       }))); | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | }); |