11import { A11yModule , CDK_DESCRIBEDBY_HOST_ATTRIBUTE } from '../index' ;
22import { 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' ;
56
67describe ( 'AriaDescriber' , ( ) => {
78 let ariaDescriber : AriaDescriber ;
89 let component : TestApp ;
910 let fixture : ComponentFixture < TestApp > ;
1011
11- beforeEach ( async ( ( ) => {
12+ function createFixture ( providers : Provider [ ] = [ ] ) {
1213 TestBed . configureTestingModule ( {
1314 imports : [ A11yModule ] ,
1415 declarations : [ TestApp ] ,
15- providers : [ AriaDescriber ] ,
16+ providers : [ AriaDescriber , ... providers ] ,
1617 } ) . compileComponents ( ) ;
17- } ) ) ;
1818
19- beforeEach ( ( ) => {
2019 fixture = TestBed . createComponent ( TestApp ) ;
2120 component = fixture . componentInstance ;
2221 ariaDescriber = component . ariaDescriber ;
2322 fixture . detectChanges ( ) ;
24- } ) ;
23+ }
2524
2625 afterEach ( ( ) => {
2726 ariaDescriber . ngOnDestroy ( ) ;
2827 } ) ;
2928
3029 it ( 'should initialize without the message container' , ( ) => {
30+ createFixture ( ) ;
3131 expect ( getMessagesContainer ( ) ) . toBeNull ( ) ;
3232 } ) ;
3333
3434 it ( 'should be able to create a message element' , ( ) => {
35+ createFixture ( ) ;
3536 ariaDescriber . describe ( component . element1 , 'My Message' ) ;
3637 expectMessages ( [ 'My Message' ] ) ;
3738 } ) ;
3839
3940 it ( 'should be able to describe using an element' , ( ) => {
41+ createFixture ( ) ;
4042 const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
4143 ariaDescriber . describe ( component . element1 , descriptionNode ) ;
4244 expectMessage ( component . element1 , 'Hello' ) ;
4345 } ) ;
4446
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+
4553 it ( 'should not register empty strings' , ( ) => {
54+ createFixture ( ) ;
4655 ariaDescriber . describe ( component . element1 , '' ) ;
4756 expect ( getMessageElements ( ) ) . toBe ( null ) ;
4857 } ) ;
4958
5059 it ( 'should not register non-string values' , ( ) => {
60+ createFixture ( ) ;
5161 expect ( ( ) => ariaDescriber . describe ( component . element1 , null ! ) ) . not . toThrow ( ) ;
5262 expect ( getMessageElements ( ) ) . toBe ( null ) ;
5363 } ) ;
5464
5565 it ( 'should not throw when trying to remove non-string value' , ( ) => {
66+ createFixture ( ) ;
5667 expect ( ( ) => ariaDescriber . removeDescription ( component . element1 , null ! ) ) . not . toThrow ( ) ;
5768 } ) ;
5869
5970 it ( 'should de-dupe a message registered multiple times' , ( ) => {
71+ createFixture ( ) ;
6072 ariaDescriber . describe ( component . element1 , 'My Message' ) ;
6173 ariaDescriber . describe ( component . element2 , 'My Message' ) ;
6274 ariaDescriber . describe ( component . element3 , 'My Message' ) ;
@@ -67,6 +79,7 @@ describe('AriaDescriber', () => {
6779 } ) ;
6880
6981 it ( 'should de-dupe a message registered multiple via an element node' , ( ) => {
82+ createFixture ( ) ;
7083 const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
7184 ariaDescriber . describe ( component . element1 , descriptionNode ) ;
7285 ariaDescriber . describe ( component . element2 , descriptionNode ) ;
@@ -77,6 +90,7 @@ describe('AriaDescriber', () => {
7790 } ) ;
7891
7992 it ( 'should be able to register multiple messages' , ( ) => {
93+ createFixture ( ) ;
8094 ariaDescriber . describe ( component . element1 , 'First Message' ) ;
8195 ariaDescriber . describe ( component . element2 , 'Second Message' ) ;
8296 expectMessages ( [ 'First Message' , 'Second Message' ] ) ;
@@ -85,6 +99,7 @@ describe('AriaDescriber', () => {
8599 } ) ;
86100
87101 it ( 'should be able to unregister messages' , ( ) => {
102+ createFixture ( ) ;
88103 ariaDescriber . describe ( component . element1 , 'My Message' ) ;
89104 expectMessages ( [ 'My Message' ] ) ;
90105
@@ -104,6 +119,7 @@ describe('AriaDescriber', () => {
104119 } ) ;
105120
106121 it ( 'should not remove nodes that were set as messages when unregistering' , ( ) => {
122+ createFixture ( ) ;
107123 const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
108124
109125 expect ( document . body . contains ( descriptionNode ) )
@@ -123,6 +139,7 @@ describe('AriaDescriber', () => {
123139 } ) ;
124140
125141 it ( 'should keep nodes set as descriptions inside their original position in the DOM' , ( ) => {
142+ createFixture ( ) ;
126143 const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
127144 const initialParent = descriptionNode . parentNode ;
128145
@@ -141,6 +158,7 @@ describe('AriaDescriber', () => {
141158 } ) ;
142159
143160 it ( 'should be able to unregister messages while having others registered' , ( ) => {
161+ createFixture ( ) ;
144162 ariaDescriber . describe ( component . element1 , 'Persistent Message' ) ;
145163 ariaDescriber . describe ( component . element2 , 'My Message' ) ;
146164 expectMessages ( [ 'Persistent Message' , 'My Message' ] ) ;
@@ -159,24 +177,28 @@ describe('AriaDescriber', () => {
159177 } ) ;
160178
161179 it ( 'should be able to append to an existing list of aria describedby' , ( ) => {
180+ createFixture ( ) ;
162181 ariaDescriber . describe ( component . element4 , 'My Message' ) ;
163182 expectMessages ( [ 'My Message' ] ) ;
164183 expectMessage ( component . element4 , 'My Message' ) ;
165184 } ) ;
166185
167186 it ( 'should be able to handle multiple regisitrations of the same message to an element' , ( ) => {
187+ createFixture ( ) ;
168188 ariaDescriber . describe ( component . element1 , 'My Message' ) ;
169189 ariaDescriber . describe ( component . element1 , 'My Message' ) ;
170190 expectMessages ( [ 'My Message' ] ) ;
171191 expectMessage ( component . element1 , 'My Message' ) ;
172192 } ) ;
173193
174194 it ( 'should not throw when attempting to describe a non-element node' , ( ) => {
195+ createFixture ( ) ;
175196 const node : any = document . createComment ( 'Not an element node' ) ;
176197 expect ( ( ) => ariaDescriber . describe ( node , 'This looks like an element' ) ) . not . toThrow ( ) ;
177198 } ) ;
178199
179200 it ( 'should clear any pre-existing containers' , ( ) => {
201+ createFixture ( ) ;
180202 const extraContainer = document . createElement ( 'div' ) ;
181203 extraContainer . id = MESSAGES_CONTAINER_ID ;
182204 document . body . appendChild ( extraContainer ) ;
@@ -192,27 +214,31 @@ describe('AriaDescriber', () => {
192214 } ) ;
193215
194216 it ( 'should not describe messages that match up with the aria-label of the element' , ( ) => {
217+ createFixture ( ) ;
195218 component . element1 . setAttribute ( 'aria-label' , 'Hello' ) ;
196219 ariaDescriber . describe ( component . element1 , 'Hello' ) ;
197220 ariaDescriber . describe ( component . element1 , 'Hi' ) ;
198221 expectMessages ( [ 'Hi' ] ) ;
199222 } ) ;
200223
201224 it ( 'should assign an id to the description element, if it does not have one' , ( ) => {
225+ createFixture ( ) ;
202226 const descriptionNode = fixture . nativeElement . querySelector ( '[description-without-id]' ) ;
203227 expect ( descriptionNode . getAttribute ( 'id' ) ) . toBeFalsy ( ) ;
204228 ariaDescriber . describe ( component . element1 , descriptionNode ) ;
205229 expect ( descriptionNode . getAttribute ( 'id' ) ) . toBeTruthy ( ) ;
206230 } ) ;
207231
208232 it ( 'should not overwrite the existing id of the description element' , ( ) => {
233+ createFixture ( ) ;
209234 const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
210235 expect ( descriptionNode . id ) . toBe ( 'description-with-existing-id' ) ;
211236 ariaDescriber . describe ( component . element1 , descriptionNode ) ;
212237 expect ( descriptionNode . id ) . toBe ( 'description-with-existing-id' ) ;
213238 } ) ;
214239
215240 it ( 'should not remove pre-existing description nodes on destroy' , ( ) => {
241+ createFixture ( ) ;
216242 const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
217243
218244 expect ( document . body . contains ( descriptionNode ) )
@@ -231,6 +257,7 @@ describe('AriaDescriber', () => {
231257 } ) ;
232258
233259 it ( 'should remove the aria-describedby attribute if there are no more messages' , ( ) => {
260+ createFixture ( ) ;
234261 const element = component . element1 ;
235262
236263 expect ( element . hasAttribute ( 'aria-describedby' ) ) . toBe ( false ) ;
@@ -242,10 +269,27 @@ describe('AriaDescriber', () => {
242269 expect ( element . hasAttribute ( 'aria-describedby' ) ) . toBe ( false ) ;
243270 } ) ;
244271
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+ } ) ;
245289} ) ;
246290
247291function getMessagesContainer ( ) {
248- return document . querySelector ( `#${ MESSAGES_CONTAINER_ID } ` ) ;
292+ return document . querySelector ( `#${ MESSAGES_CONTAINER_ID } ` ) ! ;
249293}
250294
251295function getMessageElements ( ) : Node [ ] | null {
0 commit comments