1
1
import { A11yModule , CDK_DESCRIBEDBY_HOST_ATTRIBUTE } from '../index' ;
2
2
import { AriaDescriber , MESSAGES_CONTAINER_ID } from './aria-describer' ;
3
- import { async , ComponentFixture , TestBed } from '@angular/core/testing' ;
4
- import { Component , ElementRef , ViewChild } from '@angular/core' ;
3
+ import { ComponentFixture , TestBed } from '@angular/core/testing' ;
4
+ import { Component , ElementRef , ViewChild , Provider } from '@angular/core' ;
5
+ import { Platform } from '@angular/cdk/platform' ;
5
6
6
7
describe ( 'AriaDescriber' , ( ) => {
7
8
let ariaDescriber : AriaDescriber ;
8
9
let component : TestApp ;
9
10
let fixture : ComponentFixture < TestApp > ;
10
11
11
- beforeEach ( async ( ( ) => {
12
+ function createFixture ( providers : Provider [ ] = [ ] ) {
12
13
TestBed . configureTestingModule ( {
13
14
imports : [ A11yModule ] ,
14
15
declarations : [ TestApp ] ,
15
- providers : [ AriaDescriber ] ,
16
+ providers : [ AriaDescriber , ... providers ] ,
16
17
} ) . compileComponents ( ) ;
17
- } ) ) ;
18
18
19
- beforeEach ( ( ) => {
20
19
fixture = TestBed . createComponent ( TestApp ) ;
21
20
component = fixture . componentInstance ;
22
21
ariaDescriber = component . ariaDescriber ;
23
22
fixture . detectChanges ( ) ;
24
- } ) ;
23
+ }
25
24
26
25
afterEach ( ( ) => {
27
26
ariaDescriber . ngOnDestroy ( ) ;
28
27
} ) ;
29
28
30
29
it ( 'should initialize without the message container' , ( ) => {
30
+ createFixture ( ) ;
31
31
expect ( getMessagesContainer ( ) ) . toBeNull ( ) ;
32
32
} ) ;
33
33
34
34
it ( 'should be able to create a message element' , ( ) => {
35
+ createFixture ( ) ;
35
36
ariaDescriber . describe ( component . element1 , 'My Message' ) ;
36
37
expectMessages ( [ 'My Message' ] ) ;
37
38
} ) ;
@@ -42,21 +43,31 @@ describe('AriaDescriber', () => {
42
43
expectMessage ( component . element1 , 'Hello' ) ;
43
44
} ) ;
44
45
46
+ it ( 'should hide the message container' , ( ) => {
47
+ createFixture ( ) ;
48
+ ariaDescriber . describe ( component . element1 , 'My Message' ) ;
49
+ expect ( getMessagesContainer ( ) . classList ) . toContain ( 'cdk-visually-hidden' ) ;
50
+ } ) ;
51
+
45
52
it ( 'should not register empty strings' , ( ) => {
53
+ createFixture ( ) ;
46
54
ariaDescriber . describe ( component . element1 , '' ) ;
47
55
expect ( getMessageElements ( ) ) . toBe ( null ) ;
48
56
} ) ;
49
57
50
58
it ( 'should not register non-string values' , ( ) => {
59
+ createFixture ( ) ;
51
60
expect ( ( ) => ariaDescriber . describe ( component . element1 , null ! ) ) . not . toThrow ( ) ;
52
61
expect ( getMessageElements ( ) ) . toBe ( null ) ;
53
62
} ) ;
54
63
55
64
it ( 'should not throw when trying to remove non-string value' , ( ) => {
65
+ createFixture ( ) ;
56
66
expect ( ( ) => ariaDescriber . removeDescription ( component . element1 , null ! ) ) . not . toThrow ( ) ;
57
67
} ) ;
58
68
59
69
it ( 'should de-dupe a message registered multiple times' , ( ) => {
70
+ createFixture ( ) ;
60
71
ariaDescriber . describe ( component . element1 , 'My Message' ) ;
61
72
ariaDescriber . describe ( component . element2 , 'My Message' ) ;
62
73
ariaDescriber . describe ( component . element3 , 'My Message' ) ;
@@ -67,6 +78,7 @@ describe('AriaDescriber', () => {
67
78
} ) ;
68
79
69
80
it ( 'should de-dupe a message registered multiple via an element node' , ( ) => {
81
+ createFixture ( ) ;
70
82
const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
71
83
ariaDescriber . describe ( component . element1 , descriptionNode ) ;
72
84
ariaDescriber . describe ( component . element2 , descriptionNode ) ;
@@ -77,6 +89,7 @@ describe('AriaDescriber', () => {
77
89
} ) ;
78
90
79
91
it ( 'should be able to register multiple messages' , ( ) => {
92
+ createFixture ( ) ;
80
93
ariaDescriber . describe ( component . element1 , 'First Message' ) ;
81
94
ariaDescriber . describe ( component . element2 , 'Second Message' ) ;
82
95
expectMessages ( [ 'First Message' , 'Second Message' ] ) ;
@@ -85,6 +98,7 @@ describe('AriaDescriber', () => {
85
98
} ) ;
86
99
87
100
it ( 'should be able to unregister messages' , ( ) => {
101
+ createFixture ( ) ;
88
102
ariaDescriber . describe ( component . element1 , 'My Message' ) ;
89
103
expectMessages ( [ 'My Message' ] ) ;
90
104
@@ -141,6 +155,7 @@ describe('AriaDescriber', () => {
141
155
} ) ;
142
156
143
157
it ( 'should be able to unregister messages while having others registered' , ( ) => {
158
+ createFixture ( ) ;
144
159
ariaDescriber . describe ( component . element1 , 'Persistent Message' ) ;
145
160
ariaDescriber . describe ( component . element2 , 'My Message' ) ;
146
161
expectMessages ( [ 'Persistent Message' , 'My Message' ] ) ;
@@ -159,24 +174,28 @@ describe('AriaDescriber', () => {
159
174
} ) ;
160
175
161
176
it ( 'should be able to append to an existing list of aria describedby' , ( ) => {
177
+ createFixture ( ) ;
162
178
ariaDescriber . describe ( component . element4 , 'My Message' ) ;
163
179
expectMessages ( [ 'My Message' ] ) ;
164
180
expectMessage ( component . element4 , 'My Message' ) ;
165
181
} ) ;
166
182
167
183
it ( 'should be able to handle multiple regisitrations of the same message to an element' , ( ) => {
184
+ createFixture ( ) ;
168
185
ariaDescriber . describe ( component . element1 , 'My Message' ) ;
169
186
ariaDescriber . describe ( component . element1 , 'My Message' ) ;
170
187
expectMessages ( [ 'My Message' ] ) ;
171
188
expectMessage ( component . element1 , 'My Message' ) ;
172
189
} ) ;
173
190
174
191
it ( 'should not throw when attempting to describe a non-element node' , ( ) => {
192
+ createFixture ( ) ;
175
193
const node : any = document . createComment ( 'Not an element node' ) ;
176
194
expect ( ( ) => ariaDescriber . describe ( node , 'This looks like an element' ) ) . not . toThrow ( ) ;
177
195
} ) ;
178
196
179
197
it ( 'should clear any pre-existing containers' , ( ) => {
198
+ createFixture ( ) ;
180
199
const extraContainer = document . createElement ( 'div' ) ;
181
200
extraContainer . id = MESSAGES_CONTAINER_ID ;
182
201
document . body . appendChild ( extraContainer ) ;
@@ -206,13 +225,15 @@ describe('AriaDescriber', () => {
206
225
} ) ;
207
226
208
227
it ( 'should not overwrite the existing id of the description element' , ( ) => {
228
+ createFixture ( ) ;
209
229
const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
210
230
expect ( descriptionNode . id ) . toBe ( 'description-with-existing-id' ) ;
211
231
ariaDescriber . describe ( component . element1 , descriptionNode ) ;
212
232
expect ( descriptionNode . id ) . toBe ( 'description-with-existing-id' ) ;
213
233
} ) ;
214
234
215
235
it ( 'should not remove pre-existing description nodes on destroy' , ( ) => {
236
+ createFixture ( ) ;
216
237
const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
217
238
218
239
expect ( document . body . contains ( descriptionNode ) )
@@ -231,6 +252,7 @@ describe('AriaDescriber', () => {
231
252
} ) ;
232
253
233
254
it ( 'should remove the aria-describedby attribute if there are no more messages' , ( ) => {
255
+ createFixture ( ) ;
234
256
const element = component . element1 ;
235
257
236
258
expect ( element . hasAttribute ( 'aria-describedby' ) ) . toBe ( false ) ;
@@ -242,10 +264,27 @@ describe('AriaDescriber', () => {
242
264
expect ( element . hasAttribute ( 'aria-describedby' ) ) . toBe ( false ) ;
243
265
} ) ;
244
266
267
+ it ( 'should set `aria-hidden` on the container by default' , ( ) => {
268
+ createFixture ( [ { provide : Platform , useValue : { BLINK : true } } ] ) ;
269
+ ariaDescriber . describe ( component . element1 , 'My Message' ) ;
270
+ expect ( getMessagesContainer ( ) . getAttribute ( 'aria-hidden' ) ) . toBe ( 'true' ) ;
271
+ } ) ;
272
+
273
+ it ( 'should disable `aria-hidden` on the container in IE' , ( ) => {
274
+ createFixture ( [ { provide : Platform , useValue : { TRIDENT : true } } ] ) ;
275
+ ariaDescriber . describe ( component . element1 , 'My Message' ) ;
276
+ expect ( getMessagesContainer ( ) . getAttribute ( 'aria-hidden' ) ) . toBe ( 'false' ) ;
277
+ } ) ;
278
+
279
+ it ( 'should disable `aria-hidden` on the container in Edge' , ( ) => {
280
+ createFixture ( [ { provide : Platform , useValue : { EDGE : true } } ] ) ;
281
+ ariaDescriber . describe ( component . element1 , 'My Message' ) ;
282
+ expect ( getMessagesContainer ( ) . getAttribute ( 'aria-hidden' ) ) . toBe ( 'false' ) ;
283
+ } ) ;
245
284
} ) ;
246
285
247
286
function getMessagesContainer ( ) {
248
- return document . querySelector ( `#${ MESSAGES_CONTAINER_ID } ` ) ;
287
+ return document . querySelector ( `#${ MESSAGES_CONTAINER_ID } ` ) ! ;
249
288
}
250
289
251
290
function getMessageElements ( ) : Node [ ] | null {
0 commit comments