| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  | import { | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |    async, inject, TestBed | 
					
						
							| 
									
										
										
										
											2016-05-20 01:09:45 -07:00
										 |  |  | } from '@angular/core/testing'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  | import { | 
					
						
							|  |  |  |   MockBackend, | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |   MockConnection | 
					
						
							|  |  |  | } from '@angular/http/testing'; | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | import { | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |   HttpModule, Http, XHRBackend, Response, ResponseOptions | 
					
						
							| 
									
										
										
										
											2016-04-27 11:28:22 -07:00
										 |  |  | } from '@angular/http'; | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | import { Observable } from 'rxjs/Observable'; | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  | import 'rxjs/add/observable/of'; | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  | import 'rxjs/add/operator/catch'; | 
					
						
							|  |  |  | import 'rxjs/add/operator/do'; | 
					
						
							|  |  |  | import 'rxjs/add/operator/toPromise'; | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  | import { Hero } from './hero'; | 
					
						
							|  |  |  | import { HttpHeroService as HeroService } from './http-hero.service'; | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | const makeHeroData = () => [ | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |   { id: 1, name: 'Windstorm' }, | 
					
						
							|  |  |  |   { id: 2, name: 'Bombasto' }, | 
					
						
							|  |  |  |   { id: 3, name: 'Magneta' }, | 
					
						
							|  |  |  |   { id: 4, name: 'Tornado' } | 
					
						
							|  |  |  | ] as Hero[]; | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  | ////////  Tests  /////////////
 | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  | describe('Http-HeroService (mockBackend)', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |   beforeEach( async(() => { | 
					
						
							|  |  |  |     TestBed.configureTestingModule({ | 
					
						
							|  |  |  |       imports: [ HttpModule ], | 
					
						
							|  |  |  |       providers: [ | 
					
						
							|  |  |  |         HeroService, | 
					
						
							|  |  |  |         { provide: XHRBackend, useClass: MockBackend } | 
					
						
							|  |  |  |       ] | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |     .compileComponents(); | 
					
						
							|  |  |  |   })); | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   it('can instantiate service when inject service', | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |     inject([HeroService], (service: HeroService) => { | 
					
						
							|  |  |  |       expect(service instanceof HeroService).toBe(true); | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  |   })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  |   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; | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |       let fakeHeroes: Hero[]; | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  |       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 => { | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |             expect(heroes.length).toBe(fakeHeroes.length, | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  |               '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 => { | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |             expect(heroes.length).toBe(fakeHeroes.length, | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  |               '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 => { | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |             expect(heroes.length).toBe(0, 'should have no heroes'); | 
					
						
							| 
									
										
										
										
											2016-04-10 15:04:04 -07:00
										 |  |  |           }) | 
					
						
							|  |  |  |           .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
										 |  |  |   }); | 
					
						
							|  |  |  | }); |