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
} ) ;
38
39
39
40
it ( 'should be able to describe using an element' , ( ) => {
41
+ createFixture ( ) ;
40
42
const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
41
43
ariaDescriber . describe ( component . element1 , descriptionNode ) ;
42
44
expectMessage ( component . element1 , 'Hello' ) ;
43
45
} ) ;
44
46
47
+ it ( 'should hide the message container' , ( ) => {
48
+ createFixture ( ) ;
49
+ ariaDescriber . describe ( component . element1 , 'My Message' ) ;
50
+ expect ( getMessagesContainer ( ) . classList ) . toContain ( 'cdk-visually-hidden' ) ;
51
+ } ) ;
52
+
45
53
it ( 'should not register empty strings' , ( ) => {
54
+ createFixture ( ) ;
46
55
ariaDescriber . describe ( component . element1 , '' ) ;
47
56
expect ( getMessageElements ( ) ) . toBe ( null ) ;
48
57
} ) ;
49
58
50
59
it ( 'should not register non-string values' , ( ) => {
60
+ createFixture ( ) ;
51
61
expect ( ( ) => ariaDescriber . describe ( component . element1 , null ! ) ) . not . toThrow ( ) ;
52
62
expect ( getMessageElements ( ) ) . toBe ( null ) ;
53
63
} ) ;
54
64
55
65
it ( 'should not throw when trying to remove non-string value' , ( ) => {
66
+ createFixture ( ) ;
56
67
expect ( ( ) => ariaDescriber . removeDescription ( component . element1 , null ! ) ) . not . toThrow ( ) ;
57
68
} ) ;
58
69
59
70
it ( 'should de-dupe a message registered multiple times' , ( ) => {
71
+ createFixture ( ) ;
60
72
ariaDescriber . describe ( component . element1 , 'My Message' ) ;
61
73
ariaDescriber . describe ( component . element2 , 'My Message' ) ;
62
74
ariaDescriber . describe ( component . element3 , 'My Message' ) ;
@@ -67,6 +79,7 @@ describe('AriaDescriber', () => {
67
79
} ) ;
68
80
69
81
it ( 'should de-dupe a message registered multiple via an element node' , ( ) => {
82
+ createFixture ( ) ;
70
83
const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
71
84
ariaDescriber . describe ( component . element1 , descriptionNode ) ;
72
85
ariaDescriber . describe ( component . element2 , descriptionNode ) ;
@@ -77,6 +90,7 @@ describe('AriaDescriber', () => {
77
90
} ) ;
78
91
79
92
it ( 'should be able to register multiple messages' , ( ) => {
93
+ createFixture ( ) ;
80
94
ariaDescriber . describe ( component . element1 , 'First Message' ) ;
81
95
ariaDescriber . describe ( component . element2 , 'Second Message' ) ;
82
96
expectMessages ( [ 'First Message' , 'Second Message' ] ) ;
@@ -85,6 +99,7 @@ describe('AriaDescriber', () => {
85
99
} ) ;
86
100
87
101
it ( 'should be able to unregister messages' , ( ) => {
102
+ createFixture ( ) ;
88
103
ariaDescriber . describe ( component . element1 , 'My Message' ) ;
89
104
expectMessages ( [ 'My Message' ] ) ;
90
105
@@ -104,6 +119,7 @@ describe('AriaDescriber', () => {
104
119
} ) ;
105
120
106
121
it ( 'should not remove nodes that were set as messages when unregistering' , ( ) => {
122
+ createFixture ( ) ;
107
123
const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
108
124
109
125
expect ( document . body . contains ( descriptionNode ) )
@@ -123,6 +139,7 @@ describe('AriaDescriber', () => {
123
139
} ) ;
124
140
125
141
it ( 'should keep nodes set as descriptions inside their original position in the DOM' , ( ) => {
142
+ createFixture ( ) ;
126
143
const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
127
144
const initialParent = descriptionNode . parentNode ;
128
145
@@ -141,6 +158,7 @@ describe('AriaDescriber', () => {
141
158
} ) ;
142
159
143
160
it ( 'should be able to unregister messages while having others registered' , ( ) => {
161
+ createFixture ( ) ;
144
162
ariaDescriber . describe ( component . element1 , 'Persistent Message' ) ;
145
163
ariaDescriber . describe ( component . element2 , 'My Message' ) ;
146
164
expectMessages ( [ 'Persistent Message' , 'My Message' ] ) ;
@@ -159,24 +177,28 @@ describe('AriaDescriber', () => {
159
177
} ) ;
160
178
161
179
it ( 'should be able to append to an existing list of aria describedby' , ( ) => {
180
+ createFixture ( ) ;
162
181
ariaDescriber . describe ( component . element4 , 'My Message' ) ;
163
182
expectMessages ( [ 'My Message' ] ) ;
164
183
expectMessage ( component . element4 , 'My Message' ) ;
165
184
} ) ;
166
185
167
186
it ( 'should be able to handle multiple regisitrations of the same message to an element' , ( ) => {
187
+ createFixture ( ) ;
168
188
ariaDescriber . describe ( component . element1 , 'My Message' ) ;
169
189
ariaDescriber . describe ( component . element1 , 'My Message' ) ;
170
190
expectMessages ( [ 'My Message' ] ) ;
171
191
expectMessage ( component . element1 , 'My Message' ) ;
172
192
} ) ;
173
193
174
194
it ( 'should not throw when attempting to describe a non-element node' , ( ) => {
195
+ createFixture ( ) ;
175
196
const node : any = document . createComment ( 'Not an element node' ) ;
176
197
expect ( ( ) => ariaDescriber . describe ( node , 'This looks like an element' ) ) . not . toThrow ( ) ;
177
198
} ) ;
178
199
179
200
it ( 'should clear any pre-existing containers' , ( ) => {
201
+ createFixture ( ) ;
180
202
const extraContainer = document . createElement ( 'div' ) ;
181
203
extraContainer . id = MESSAGES_CONTAINER_ID ;
182
204
document . body . appendChild ( extraContainer ) ;
@@ -192,27 +214,31 @@ describe('AriaDescriber', () => {
192
214
} ) ;
193
215
194
216
it ( 'should not describe messages that match up with the aria-label of the element' , ( ) => {
217
+ createFixture ( ) ;
195
218
component . element1 . setAttribute ( 'aria-label' , 'Hello' ) ;
196
219
ariaDescriber . describe ( component . element1 , 'Hello' ) ;
197
220
ariaDescriber . describe ( component . element1 , 'Hi' ) ;
198
221
expectMessages ( [ 'Hi' ] ) ;
199
222
} ) ;
200
223
201
224
it ( 'should assign an id to the description element, if it does not have one' , ( ) => {
225
+ createFixture ( ) ;
202
226
const descriptionNode = fixture . nativeElement . querySelector ( '[description-without-id]' ) ;
203
227
expect ( descriptionNode . getAttribute ( 'id' ) ) . toBeFalsy ( ) ;
204
228
ariaDescriber . describe ( component . element1 , descriptionNode ) ;
205
229
expect ( descriptionNode . getAttribute ( 'id' ) ) . toBeTruthy ( ) ;
206
230
} ) ;
207
231
208
232
it ( 'should not overwrite the existing id of the description element' , ( ) => {
233
+ createFixture ( ) ;
209
234
const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
210
235
expect ( descriptionNode . id ) . toBe ( 'description-with-existing-id' ) ;
211
236
ariaDescriber . describe ( component . element1 , descriptionNode ) ;
212
237
expect ( descriptionNode . id ) . toBe ( 'description-with-existing-id' ) ;
213
238
} ) ;
214
239
215
240
it ( 'should not remove pre-existing description nodes on destroy' , ( ) => {
241
+ createFixture ( ) ;
216
242
const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
217
243
218
244
expect ( document . body . contains ( descriptionNode ) )
@@ -231,6 +257,7 @@ describe('AriaDescriber', () => {
231
257
} ) ;
232
258
233
259
it ( 'should remove the aria-describedby attribute if there are no more messages' , ( ) => {
260
+ createFixture ( ) ;
234
261
const element = component . element1 ;
235
262
236
263
expect ( element . hasAttribute ( 'aria-describedby' ) ) . toBe ( false ) ;
@@ -242,10 +269,27 @@ describe('AriaDescriber', () => {
242
269
expect ( element . hasAttribute ( 'aria-describedby' ) ) . toBe ( false ) ;
243
270
} ) ;
244
271
272
+ it ( 'should set `aria-hidden` on the container by default' , ( ) => {
273
+ createFixture ( [ { provide : Platform , useValue : { BLINK : true } } ] ) ;
274
+ ariaDescriber . describe ( component . element1 , 'My Message' ) ;
275
+ expect ( getMessagesContainer ( ) . getAttribute ( 'aria-hidden' ) ) . toBe ( 'true' ) ;
276
+ } ) ;
277
+
278
+ it ( 'should disable `aria-hidden` on the container in IE' , ( ) => {
279
+ createFixture ( [ { provide : Platform , useValue : { TRIDENT : true } } ] ) ;
280
+ ariaDescriber . describe ( component . element1 , 'My Message' ) ;
281
+ expect ( getMessagesContainer ( ) . getAttribute ( 'aria-hidden' ) ) . toBe ( 'false' ) ;
282
+ } ) ;
283
+
284
+ it ( 'should disable `aria-hidden` on the container in Edge' , ( ) => {
285
+ createFixture ( [ { provide : Platform , useValue : { EDGE : true } } ] ) ;
286
+ ariaDescriber . describe ( component . element1 , 'My Message' ) ;
287
+ expect ( getMessagesContainer ( ) . getAttribute ( 'aria-hidden' ) ) . toBe ( 'false' ) ;
288
+ } ) ;
245
289
} ) ;
246
290
247
291
function getMessagesContainer ( ) {
248
- return document . querySelector ( `#${ MESSAGES_CONTAINER_ID } ` ) ;
292
+ return document . querySelector ( `#${ MESSAGES_CONTAINER_ID } ` ) ! ;
249
293
}
250
294
251
295
function getMessageElements ( ) : Node [ ] | null {
0 commit comments