1- import { async , ComponentFixture , TestBed } from '@angular/core/testing' ;
1+ import { ComponentFixture , TestBed } from '@angular/core/testing' ;
22
33import { MessagesComponent } from './messages.component' ;
44import { MessageService } from '../message.service' ;
@@ -7,25 +7,88 @@ describe('MessagesComponent', () => {
77 let component : MessagesComponent ;
88 let fixture : ComponentFixture < MessagesComponent > ;
99
10- beforeEach ( async ( ( ) => {
11- TestBed . configureTestingModule ( {
12- declarations : [
13- MessagesComponent
14- ] ,
15- providers : [
16- MessageService
17- ]
18- } )
19- . compileComponents ( ) ;
20- } ) ) ;
10+ /**
11+ * Configure `TestBed`
12+ * @param messageService Message service or mock
13+ * @return Promise
14+ */
15+ function configureTestingModule ( messageService : any = MessageService ) {
16+ return TestBed
17+ . configureTestingModule ( {
18+ declarations : [ MessagesComponent ] ,
19+ providers : [ { provide : MessageService , useClass : messageService } ]
20+ } )
21+ . compileComponents ( )
22+ . then ( ( ) => {
23+ fixture = TestBed . createComponent ( MessagesComponent ) ;
24+ component = fixture . componentInstance ;
25+ } ) ;
26+ }
2127
22- beforeEach ( ( ) => {
23- fixture = TestBed . createComponent ( MessagesComponent ) ;
24- component = fixture . componentInstance ;
28+ it ( 'should create' , ( ) => configureTestingModule ( ) . then ( ( ) => {
2529 fixture . detectChanges ( ) ;
30+ expect ( component ) . toBeTruthy ( ) ;
31+ } ) ) ;
32+
33+ describe ( 'when message service contains messages' , ( ) => {
34+ const messages = [ 'foo' , 'bar' ] ;
35+ beforeEach ( ( ) => configureTestingModule ( class { messages : String [ ] = messages ; } ) ) ;
36+
37+ it ( 'should display a "Messages" title' , ( ) => {
38+ fixture . detectChanges ( ) ;
39+
40+ const titleElement = fixture . nativeElement . querySelector ( 'h2' ) ;
41+ expect ( titleElement ) . toBeDefined ( ) ;
42+ expect ( titleElement . textContent ) . toBe ( 'Messages' ) ;
43+ } ) ;
44+
45+ it ( 'should display a "clear" button' , ( ) => {
46+ fixture . detectChanges ( ) ;
47+
48+ const clearButtonElement = fixture . nativeElement . querySelector ( 'button.clear' ) ;
49+ expect ( clearButtonElement ) . toBeDefined ( ) ;
50+ expect ( clearButtonElement . textContent ) . toBe ( 'clear' ) ;
51+ } ) ;
52+
53+ it ( 'should display messages from the message service' , ( ) => {
54+ fixture . detectChanges ( ) ;
55+
56+ const messageElements = fixture . nativeElement . querySelector ( 'div' ) . querySelectorAll ( 'div' ) ;
57+ expect ( messageElements . length ) . toBe ( 2 ) ;
58+
59+ const displayedMessages = Array . from ( messageElements ) . map ( ( d : HTMLElement ) => d . textContent ) ;
60+ expect ( displayedMessages ) . toEqual ( messages ) ;
61+ } ) ;
62+
63+ describe ( '#clear button' , ( ) => {
64+ it ( 'should empty the message list when clicked' , ( ) => {
65+ fixture . detectChanges ( ) ;
66+ component . messageService . clear = jasmine . createSpy ( 'clear' ) ;
67+
68+ const clearButtonElement = fixture . nativeElement . querySelector ( 'button.clear' ) ;
69+ clearButtonElement . click ( ) ;
70+ expect ( component . messageService . clear ) . toHaveBeenCalled ( ) ;
71+ } ) ;
72+ } ) ;
2673 } ) ;
2774
28- it ( 'should create' , ( ) => {
29- expect ( component ) . toBeTruthy ( ) ;
75+ describe ( 'when message service contains no message' , ( ) => {
76+ const messages = [ ] ;
77+ beforeEach ( ( ) => configureTestingModule ( class { messages : String [ ] = messages ; } ) ) ;
78+
79+ it ( 'should not display "Messages"' , ( ) => {
80+ fixture . detectChanges ( ) ;
81+ expect ( fixture . nativeElement ) . not . toContain ( 'Messages' ) ;
82+ } ) ;
83+
84+ it ( 'should not display any button' , ( ) => {
85+ fixture . detectChanges ( ) ;
86+ expect ( fixture . nativeElement . querySelectorAll ( 'button' ) . length ) . toBe ( 0 ) ;
87+ } ) ;
88+
89+ it ( 'should not display the container element' , ( ) => {
90+ fixture . detectChanges ( ) ;
91+ expect ( fixture . nativeElement . querySelector ( 'div' ) ) . toBe ( null ) ;
92+ } ) ;
3093 } ) ;
3194} ) ;
0 commit comments