| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  | // #docplaster
 | 
					
						
							|  |  |  | import { async, fakeAsync, ComponentFixture, TestBed, tick } from '@angular/core/testing'; | 
					
						
							|  |  |  | import { By }                        from '@angular/platform-browser'; | 
					
						
							|  |  |  | import { DebugElement }              from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import { TwainService }   from './twain.service'; | 
					
						
							|  |  |  | import { TwainComponent } from './twain.component'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe('TwainComponent', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let comp: TwainComponent; | 
					
						
							|  |  |  |   let fixture: ComponentFixture<TwainComponent>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let spy: jasmine.Spy; | 
					
						
							| 
									
										
										
										
											2016-09-23 02:03:20 -07:00
										 |  |  |   let de: DebugElement; | 
					
						
							|  |  |  |   let el: HTMLElement; | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |   let twainService: TwainService; // the actually injected service
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const testQuote = 'Test Quote'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // #docregion setup
 | 
					
						
							|  |  |  |   beforeEach(() => { | 
					
						
							|  |  |  |     TestBed.configureTestingModule({ | 
					
						
							|  |  |  |        declarations: [ TwainComponent ], | 
					
						
							|  |  |  |        providers:    [ TwainService ], | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     fixture = TestBed.createComponent(TwainComponent); | 
					
						
							|  |  |  |     comp    = fixture.componentInstance; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // TwainService actually injected into the component
 | 
					
						
							|  |  |  |     twainService = fixture.debugElement.injector.get(TwainService); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Setup spy on the `getQuote` method
 | 
					
						
							|  |  |  |     // #docregion spy
 | 
					
						
							|  |  |  |     spy = spyOn(twainService, 'getQuote') | 
					
						
							|  |  |  |           .and.returnValue(Promise.resolve(testQuote)); | 
					
						
							|  |  |  |     // #enddocregion spy
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Get the Twain quote element by CSS selector (e.g., by class name)
 | 
					
						
							| 
									
										
										
										
											2016-09-23 02:03:20 -07:00
										 |  |  |     de = fixture.debugElement.query(By.css('.twain')); | 
					
						
							|  |  |  |     el = de.nativeElement; | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  |   // #enddocregion setup
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // #docregion tests
 | 
					
						
							|  |  |  |   it('should not show quote before OnInit', () => { | 
					
						
							| 
									
										
										
										
											2016-09-23 02:03:20 -07:00
										 |  |  |     expect(el.textContent).toBe('', 'nothing displayed'); | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |     expect(spy.calls.any()).toBe(false, 'getQuote not yet called'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should still not show quote after component initialized', () => { | 
					
						
							| 
									
										
										
										
											2016-09-23 02:03:20 -07:00
										 |  |  |     fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |     // getQuote service is async => still has not returned with quote
 | 
					
						
							| 
									
										
										
										
											2016-09-23 02:03:20 -07:00
										 |  |  |     expect(el.textContent).toBe('...', 'no quote yet'); | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |     expect(spy.calls.any()).toBe(true, 'getQuote called'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // #docregion async-test
 | 
					
						
							|  |  |  |   it('should show quote after getQuote promise (async)', async(() => { | 
					
						
							| 
									
										
										
										
											2016-09-23 02:03:20 -07:00
										 |  |  |     fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     fixture.whenStable().then(() => { // wait for async getQuote
 | 
					
						
							|  |  |  |       fixture.detectChanges();        // update view with quote
 | 
					
						
							| 
									
										
										
										
											2016-09-23 02:03:20 -07:00
										 |  |  |       expect(el.textContent).toBe(testQuote); | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  |   })); | 
					
						
							|  |  |  |   // #enddocregion async-test
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // #docregion fake-async-test
 | 
					
						
							|  |  |  |   it('should show quote after getQuote promise (fakeAsync)', fakeAsync(() => { | 
					
						
							| 
									
										
										
										
											2016-09-23 02:03:20 -07:00
										 |  |  |     fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |     tick();                  // wait for async getQuote
 | 
					
						
							|  |  |  |     fixture.detectChanges(); // update view with quote
 | 
					
						
							| 
									
										
										
										
											2016-09-23 02:03:20 -07:00
										 |  |  |     expect(el.textContent).toBe(testQuote); | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |   })); | 
					
						
							|  |  |  |   // #enddocregion fake-async-test
 | 
					
						
							|  |  |  |   // #enddocregion tests
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // #docregion done-test
 | 
					
						
							|  |  |  |   it('should show quote after getQuote promise (done)', done => { | 
					
						
							| 
									
										
										
										
											2016-09-23 02:03:20 -07:00
										 |  |  |     fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // get the spy promise and wait for it to resolve
 | 
					
						
							|  |  |  |     spy.calls.mostRecent().returnValue.then(() => { | 
					
						
							|  |  |  |       fixture.detectChanges(); // update view with quote
 | 
					
						
							| 
									
										
										
										
											2016-09-23 02:03:20 -07:00
										 |  |  |       expect(el.textContent).toBe(testQuote); | 
					
						
							| 
									
										
										
										
											2016-09-13 14:39:39 -07:00
										 |  |  |       done(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   // #enddocregion done-test
 | 
					
						
							|  |  |  | }); |