2
2
import { Component } from '@angular/core' ;
3
3
import { fakeAsync , TestBed , tick } from '@angular/core/testing' ;
4
4
5
- import { BsDropdownConfig , BsDropdownModule } from './ ' ;
5
+ import { BsDropdownConfig , BsDropdownModule } from '../dropdown/index ' ;
6
6
7
7
const defaultHtml = `
8
8
<div dropdown>
@@ -14,6 +14,16 @@ const defaultHtml = `
14
14
</div>
15
15
` ;
16
16
17
+ const htmlWithBinding = `
18
+ <div dropdown [(isOpen)]="isOpen">
19
+ <button dropdownToggle>Dropdown</button>
20
+ <ul *dropdownMenu>
21
+ <li><a href="#">One</a></li>
22
+ <li><a href="#">Two</a></li>
23
+ </ul>
24
+ </div>
25
+ ` ;
26
+
17
27
describe ( 'Directive: Dropdown' , ( ) => {
18
28
19
29
it ( 'should be closed by default' , ( ) => {
@@ -25,37 +35,28 @@ describe('Directive: Dropdown', () => {
25
35
let fixture = TestBed . createComponent ( TestDropdownComponent ) ;
26
36
fixture . detectChanges ( ) ;
27
37
const element = fixture . nativeElement ;
28
- expect ( element . querySelector ( '. dropdown' ) . classList ) . not . toContain ( 'open' ) ;
38
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . not . toContain ( 'open' ) ;
29
39
} ) ;
30
40
31
41
it ( 'should be opened if isOpen === true and toggle on isOpen changes' , ( ) => {
32
- const html = `
33
- <div dropdown [(isOpen)]="isOpen">
34
- <button dropdownToggle>Dropdown</button>
35
- <ul *dropdownMenu>
36
- <li><a href="#">One</a></li>
37
- <li><a href="#">Two</a></li>
38
- </ul>
39
- </div>
40
- ` ;
41
42
TestBed . configureTestingModule ( {
42
43
declarations : [ TestDropdownComponent ] ,
43
44
imports : [ BsDropdownModule . forRoot ( ) ]
44
45
} ) ;
45
- TestBed . overrideComponent ( TestDropdownComponent , { set : { template : html } } ) ;
46
+ TestBed . overrideComponent ( TestDropdownComponent , { set : { template : htmlWithBinding } } ) ;
46
47
let fixture = TestBed . createComponent ( TestDropdownComponent ) ;
47
48
fixture . detectChanges ( ) ;
48
49
const element = fixture . nativeElement ;
49
50
const context = fixture . componentInstance ;
50
51
context . isOpen = true ;
51
52
fixture . detectChanges ( ) ;
52
- expect ( element . querySelector ( '. dropdown' ) . classList ) . toContain ( 'open' ) ;
53
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . toContain ( 'open' ) ;
53
54
context . isOpen = false ;
54
55
fixture . detectChanges ( ) ;
55
- expect ( element . querySelector ( '. dropdown' ) . classList ) . not . toContain ( 'open' ) ;
56
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . not . toContain ( 'open' ) ;
56
57
context . isOpen = true ;
57
58
fixture . detectChanges ( ) ;
58
- expect ( element . querySelector ( '. dropdown' ) . classList ) . toContain ( 'open' ) ;
59
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . toContain ( 'open' ) ;
59
60
} ) ;
60
61
61
62
it ( 'should toggle by click' , ( ) => {
@@ -67,15 +68,56 @@ describe('Directive: Dropdown', () => {
67
68
let fixture = TestBed . createComponent ( TestDropdownComponent ) ;
68
69
fixture . detectChanges ( ) ;
69
70
const element = fixture . nativeElement ;
70
- expect ( element . querySelector ( '. dropdown' ) . classList ) . not . toContain ( 'open' ) ;
71
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . not . toContain ( 'open' ) ;
71
72
element . querySelector ( 'button' ) . click ( ) ;
72
73
fixture . detectChanges ( ) ;
73
- expect ( element . querySelector ( '. dropdown' ) . classList ) . toContain ( 'open' ) ;
74
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . toContain ( 'open' ) ;
74
75
element . querySelector ( 'button' ) . click ( ) ;
75
76
fixture . detectChanges ( ) ;
76
- expect ( element . querySelector ( '. dropdown' ) . classList ) . not . toContain ( 'open' ) ;
77
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . not . toContain ( 'open' ) ;
77
78
} ) ;
78
79
80
+ it ( 'should be closed if was opened by click and then isOpen === false was set' , ( ) => {
81
+ TestBed . configureTestingModule ( {
82
+ declarations : [ TestDropdownComponent ] ,
83
+ imports : [ BsDropdownModule . forRoot ( ) ]
84
+ } ) ;
85
+ TestBed . overrideComponent ( TestDropdownComponent , { set : { template : htmlWithBinding } } ) ;
86
+ let fixture = TestBed . createComponent ( TestDropdownComponent ) ;
87
+ fixture . detectChanges ( ) ;
88
+ const element = fixture . nativeElement ;
89
+ const context = fixture . componentInstance ;
90
+ expect ( element . querySelector ( '[dropdown]' ) . classList ) . not . toContain ( 'open' ) ;
91
+ element . querySelector ( 'button' ) . click ( ) ;
92
+ fixture . detectChanges ( ) ;
93
+ expect ( element . querySelector ( '[dropdown]' ) . classList ) . toContain ( 'open' ) ;
94
+ context . isOpen = false ;
95
+ fixture . detectChanges ( ) ;
96
+ expect ( element . querySelector ( '[dropdown]' ) . classList ) . not . toContain ( 'open' ) ;
97
+ } ) ;
98
+
99
+ it ( 'should change and update isOpen when it is opened or closed' , fakeAsync ( ( ) => {
100
+ TestBed . configureTestingModule ( {
101
+ declarations : [ TestDropdownComponent ] ,
102
+ imports : [ BsDropdownModule . forRoot ( ) ]
103
+ } ) ;
104
+ TestBed . overrideComponent ( TestDropdownComponent , { set : { template : htmlWithBinding } } ) ;
105
+ let fixture = TestBed . createComponent ( TestDropdownComponent ) ;
106
+ fixture . detectChanges ( ) ;
107
+ tick ( ) ;
108
+ const element = fixture . nativeElement ;
109
+ const context = fixture . componentInstance ;
110
+ fixture . detectChanges ( ) ;
111
+ element . querySelector ( 'button' ) . click ( ) ;
112
+ fixture . detectChanges ( ) ;
113
+ expect ( element . querySelector ( '[dropdown]' ) . classList ) . toContain ( 'open' ) ;
114
+ expect ( context . isOpen ) . toBe ( true ) ;
115
+ element . querySelector ( 'li' ) . click ( ) ;
116
+ fixture . detectChanges ( ) ;
117
+ expect ( element . querySelector ( '[dropdown]' ) . classList ) . not . toContain ( 'open' ) ;
118
+ expect ( context . isOpen ) . toBe ( false ) ;
119
+ } ) ) ;
120
+
79
121
it ( 'should close by click on nonInput menu item' , fakeAsync ( ( ) => {
80
122
const html = `
81
123
<div dropdown>
@@ -93,18 +135,18 @@ describe('Directive: Dropdown', () => {
93
135
TestBed . overrideComponent ( TestDropdownComponent , { set : { template : html } } ) ;
94
136
let fixture = TestBed . createComponent ( TestDropdownComponent ) ;
95
137
fixture . detectChanges ( ) ;
138
+ tick ( ) ;
96
139
const element = fixture . nativeElement ;
97
140
fixture . detectChanges ( ) ;
98
141
element . querySelector ( 'button' ) . click ( ) ;
99
142
fixture . detectChanges ( ) ;
100
- expect ( element . querySelector ( '. dropdown' ) . classList ) . toContain ( 'open' ) ;
143
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . toContain ( 'open' ) ;
101
144
element . querySelector ( 'li' ) . click ( ) ;
102
- tick ( ) ;
103
145
fixture . detectChanges ( ) ;
104
- expect ( element . querySelector ( '. dropdown' ) . classList ) . not . toContain ( 'open' ) ;
146
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . not . toContain ( 'open' ) ;
105
147
} ) ) ;
106
148
107
- it ( 'should not close by click on input or textarea menu item' , ( ) => {
149
+ xit ( 'should not close by click on input or textarea menu item' , fakeAsync ( ( ) => {
108
150
const html = `
109
151
<div dropdown>
110
152
<button dropdownToggle>Dropdown</button>
@@ -122,20 +164,21 @@ describe('Directive: Dropdown', () => {
122
164
TestBed . overrideComponent ( TestDropdownComponent , { set : { template : html } } ) ;
123
165
let fixture = TestBed . createComponent ( TestDropdownComponent ) ;
124
166
fixture . detectChanges ( ) ;
167
+ tick ( ) ;
125
168
const element = fixture . nativeElement ;
126
169
fixture . detectChanges ( ) ;
127
170
element . querySelector ( 'button' ) . click ( ) ;
128
171
fixture . detectChanges ( ) ;
129
- expect ( element . querySelector ( '. dropdown' ) . classList ) . toContain ( 'open' ) ;
172
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . toContain ( 'open' ) ;
130
173
element . querySelector ( 'input' ) . click ( ) ;
131
174
fixture . detectChanges ( ) ;
132
- expect ( element . querySelector ( '. dropdown' ) . classList ) . toContain ( 'open' ) ;
175
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . toContain ( 'open' ) ;
133
176
element . querySelector ( 'textarea' ) . click ( ) ;
134
177
fixture . detectChanges ( ) ;
135
- expect ( element . querySelector ( '. dropdown' ) . classList ) . toContain ( 'open' ) ;
136
- } ) ;
178
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . toContain ( 'open' ) ;
179
+ } ) ) ;
137
180
138
- it ( 'should not close by click on menu item if autoClose === disabled ' , ( ) => {
181
+ it ( 'should not close by click on menu item if autoClose === false ' , fakeAsync ( ( ) => {
139
182
const html = `
140
183
<div dropdown [autoClose]="autoClose">
141
184
<button dropdownToggle>Dropdown</button>
@@ -154,15 +197,16 @@ describe('Directive: Dropdown', () => {
154
197
fixture . detectChanges ( ) ;
155
198
const element = fixture . nativeElement ;
156
199
const context = fixture . componentInstance ;
157
- context . autoClose = 'disabled' ;
200
+ context . autoClose = false ;
201
+ tick ( ) ;
158
202
fixture . detectChanges ( ) ;
159
203
element . querySelector ( 'button' ) . click ( ) ;
160
204
fixture . detectChanges ( ) ;
161
- expect ( element . querySelector ( '. dropdown' ) . classList ) . toContain ( 'open' ) ;
205
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . toContain ( 'open' ) ;
162
206
element . querySelector ( 'li' ) . click ( ) ;
163
207
fixture . detectChanges ( ) ;
164
- expect ( element . querySelector ( '. dropdown' ) . classList ) . toContain ( 'open' ) ;
165
- } ) ;
208
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . toContain ( 'open' ) ;
209
+ } ) ) ;
166
210
167
211
xit ( 'should close by click on input in menu if autoClose === always' , ( ) => {
168
212
const html = `
@@ -183,14 +227,14 @@ describe('Directive: Dropdown', () => {
183
227
fixture . detectChanges ( ) ;
184
228
const element = fixture . nativeElement ;
185
229
const context = fixture . componentInstance ;
186
- context . autoClose = 'always' ;
230
+ context . autoClose = true ;
187
231
fixture . detectChanges ( ) ;
188
232
element . querySelector ( 'button' ) . click ( ) ;
189
233
fixture . detectChanges ( ) ;
190
- expect ( element . querySelector ( '. dropdown' ) . classList ) . toContain ( 'open' ) ;
234
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . toContain ( 'open' ) ;
191
235
element . querySelector ( 'input' ) . click ( ) ;
192
236
fixture . detectChanges ( ) ;
193
- expect ( element . querySelector ( '. dropdown' ) . classList ) . not . toContain ( 'open' ) ;
237
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . not . toContain ( 'open' ) ;
194
238
} ) ;
195
239
196
240
xit ( 'should close by click on any element outside the dropdown' , ( ) => {
@@ -213,17 +257,17 @@ describe('Directive: Dropdown', () => {
213
257
fixture . detectChanges ( ) ;
214
258
const element = fixture . nativeElement ;
215
259
const context = fixture . componentInstance ;
216
- context . autoClose = 'outsideClick' ;
260
+ context . autoClose = true ;
217
261
fixture . detectChanges ( ) ;
218
262
element . querySelector ( 'button' ) . click ( ) ;
219
263
fixture . detectChanges ( ) ;
220
- expect ( element . querySelector ( '. dropdown' ) . classList ) . toContain ( 'open' ) ;
264
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . toContain ( 'open' ) ;
221
265
element . querySelector ( 'li' ) . click ( ) ;
222
266
fixture . detectChanges ( ) ;
223
- expect ( element . querySelector ( '. dropdown' ) . classList ) . toContain ( 'open' ) ;
267
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . toContain ( 'open' ) ;
224
268
element . querySelector ( 'span' ) . click ( ) ;
225
269
fixture . detectChanges ( ) ;
226
- expect ( element . querySelector ( '. dropdown' ) . classList ) . not . toContain ( 'open' ) ;
270
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . not . toContain ( 'open' ) ;
227
271
} ) ;
228
272
229
273
xit ( 'should enable navigation of dropdown list elements with the arrow keys if keyboardNav is true' , ( ) => {
@@ -249,15 +293,15 @@ describe('Directive: Dropdown', () => {
249
293
fixture . detectChanges ( ) ;
250
294
element . querySelector ( 'button' ) . click ( ) ;
251
295
fixture . detectChanges ( ) ;
252
- expect ( element . querySelector ( '. dropdown' ) . classList ) . toContain ( 'open' ) ;
296
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . toContain ( 'open' ) ;
253
297
// todo: emulate keypress, check if item has hover
254
298
} ) ;
255
-
256
- describe ( 'Directive: dropdownToggle' , ( ) => {
299
+ } ) ;
300
+ describe ( 'Directive: dropdownToggle' , ( ) => {
257
301
it ( 'should not open if toggle isDisabled' , ( ) => {
258
302
const html = `
259
- <div dropdown>
260
- <button dropdownToggle [isDisabled]="isDisabled" >Dropdown</button>
303
+ <div dropdown [isDisabled]="isDisabled" >
304
+ <button dropdownToggle>Dropdown</button>
261
305
<ul *dropdownMenu>
262
306
<li><a href="#">One</a></li>
263
307
<li><a href="#">Two</a></li>
@@ -275,74 +319,31 @@ describe('Directive: Dropdown', () => {
275
319
const context = fixture . componentInstance ;
276
320
context . isDisabled = true ;
277
321
fixture . detectChanges ( ) ;
278
- expect ( element . querySelector ( '. dropdown' ) . classList ) . not . toContain ( 'open' ) ;
322
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . not . toContain ( 'open' ) ;
279
323
element . querySelector ( 'button' ) . click ( ) ;
280
324
fixture . detectChanges ( ) ;
281
- expect ( element . querySelector ( '. dropdown' ) . classList ) . not . toContain ( 'open' ) ;
325
+ expect ( element . querySelector ( '[ dropdown] ' ) . classList ) . not . toContain ( 'open' ) ;
282
326
context . isDisabled = false ;
283
327
fixture . detectChanges ( ) ;
284
328
element . querySelector ( 'button' ) . click ( ) ;
285
329
fixture . detectChanges ( ) ;
286
- expect ( element . querySelector ( '.dropdown' ) . classList ) . toContain ( 'open' ) ;
287
- } ) ;
288
-
289
- it ( 'should have dropdown-toggle class by default' , ( ) => {
290
- const html = `
291
- <div dropdown>
292
- <button dropdownToggle>Dropdown</button>
293
- <ul *dropdownMenu>
294
- <li><a href="#">One</a></li>
295
- <li><a href="#">Two</a></li>
296
- </ul>
297
- </div>
298
- ` ;
299
- TestBed . configureTestingModule ( {
300
- declarations : [ TestDropdownComponent ] ,
301
- imports : [ BsDropdownModule . forRoot ( ) ]
302
- } ) ;
303
- TestBed . overrideComponent ( TestDropdownComponent , { set : { template : html } } ) ;
304
- let fixture = TestBed . createComponent ( TestDropdownComponent ) ;
305
- fixture . detectChanges ( ) ;
306
- const element = fixture . nativeElement ;
307
- expect ( element . querySelector ( 'button' ) . classList ) . toContain ( 'dropdown-toggle' ) ;
308
- } ) ;
309
-
310
- it ( 'should not add dropdown-toggle class if addToggleClass is false' , ( ) => {
311
- const html = `
312
- <div dropdown>
313
- <button dropdownToggle [addToggleClass]="addToggleClass">Dropdown</button>
314
- <ul *dropdownMenu>
315
- <li><a href="#">One</a></li>
316
- <li><a href="#">Two</a></li>
317
- </ul>
318
- </div>
319
- ` ;
320
- TestBed . configureTestingModule ( {
321
- declarations : [ TestDropdownComponent ] ,
322
- imports : [ BsDropdownModule . forRoot ( ) ]
323
- } ) ;
324
- TestBed . overrideComponent ( TestDropdownComponent , { set : { template : html } } ) ;
325
- let fixture = TestBed . createComponent ( TestDropdownComponent ) ;
326
- fixture . detectChanges ( ) ;
327
- const element = fixture . nativeElement ;
328
- expect ( element . querySelector ( 'button' ) . classList ) . not . toContain ( 'dropdown-toggle' ) ;
330
+ expect ( element . querySelector ( '[dropdown]' ) . classList ) . toContain ( 'open' ) ;
329
331
} ) ;
330
332
} ) ;
331
- } ) ;
332
333
333
- @Component ( {
334
- selector : 'dropdown-test' ,
335
- template : ''
336
- } )
334
+ @Component ( {
335
+ selector : 'dropdown-test' ,
336
+ template : ''
337
+ } )
337
338
338
- class TestDropdownComponent {
339
- public isOpen : Boolean = false ;
340
- public isDisabled : Boolean = false ;
341
- public addToggleClass : Boolean = false ;
342
- public autoClose : string = 'nonInput' ;
343
- public keyboardNav : Boolean = false ;
339
+ class TestDropdownComponent {
340
+ public isOpen : Boolean = false ;
341
+ public isDisabled : Boolean = false ;
342
+ public addToggleClass : Boolean = false ;
343
+ public autoClose : boolean = false ;
344
+ public keyboardNav : Boolean = false ;
344
345
345
- public constructor ( config : BsDropdownConfig ) {
346
- Object . assign ( this , config ) ;
346
+ public constructor ( config : BsDropdownConfig ) {
347
+ Object . assign ( this , config ) ;
348
+ }
347
349
}
348
- }
0 commit comments