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 } ) ;
@@ -42,21 +43,31 @@ describe('AriaDescriber', () => {
4243 expectMessage ( component . element1 , 'Hello' ) ;
4344 } ) ;
4445
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+
4552 it ( 'should not register empty strings' , ( ) => {
53+ createFixture ( ) ;
4654 ariaDescriber . describe ( component . element1 , '' ) ;
4755 expect ( getMessageElements ( ) ) . toBe ( null ) ;
4856 } ) ;
4957
5058 it ( 'should not register non-string values' , ( ) => {
59+ createFixture ( ) ;
5160 expect ( ( ) => ariaDescriber . describe ( component . element1 , null ! ) ) . not . toThrow ( ) ;
5261 expect ( getMessageElements ( ) ) . toBe ( null ) ;
5362 } ) ;
5463
5564 it ( 'should not throw when trying to remove non-string value' , ( ) => {
65+ createFixture ( ) ;
5666 expect ( ( ) => ariaDescriber . removeDescription ( component . element1 , null ! ) ) . not . toThrow ( ) ;
5767 } ) ;
5868
5969 it ( 'should de-dupe a message registered multiple times' , ( ) => {
70+ createFixture ( ) ;
6071 ariaDescriber . describe ( component . element1 , 'My Message' ) ;
6172 ariaDescriber . describe ( component . element2 , 'My Message' ) ;
6273 ariaDescriber . describe ( component . element3 , 'My Message' ) ;
@@ -67,6 +78,7 @@ describe('AriaDescriber', () => {
6778 } ) ;
6879
6980 it ( 'should de-dupe a message registered multiple via an element node' , ( ) => {
81+ createFixture ( ) ;
7082 const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
7183 ariaDescriber . describe ( component . element1 , descriptionNode ) ;
7284 ariaDescriber . describe ( component . element2 , descriptionNode ) ;
@@ -77,6 +89,7 @@ describe('AriaDescriber', () => {
7789 } ) ;
7890
7991 it ( 'should be able to register multiple messages' , ( ) => {
92+ createFixture ( ) ;
8093 ariaDescriber . describe ( component . element1 , 'First Message' ) ;
8194 ariaDescriber . describe ( component . element2 , 'Second Message' ) ;
8295 expectMessages ( [ 'First Message' , 'Second Message' ] ) ;
@@ -85,6 +98,7 @@ describe('AriaDescriber', () => {
8598 } ) ;
8699
87100 it ( 'should be able to unregister messages' , ( ) => {
101+ createFixture ( ) ;
88102 ariaDescriber . describe ( component . element1 , 'My Message' ) ;
89103 expectMessages ( [ 'My Message' ] ) ;
90104
@@ -141,6 +155,7 @@ describe('AriaDescriber', () => {
141155 } ) ;
142156
143157 it ( 'should be able to unregister messages while having others registered' , ( ) => {
158+ createFixture ( ) ;
144159 ariaDescriber . describe ( component . element1 , 'Persistent Message' ) ;
145160 ariaDescriber . describe ( component . element2 , 'My Message' ) ;
146161 expectMessages ( [ 'Persistent Message' , 'My Message' ] ) ;
@@ -159,24 +174,28 @@ describe('AriaDescriber', () => {
159174 } ) ;
160175
161176 it ( 'should be able to append to an existing list of aria describedby' , ( ) => {
177+ createFixture ( ) ;
162178 ariaDescriber . describe ( component . element4 , 'My Message' ) ;
163179 expectMessages ( [ 'My Message' ] ) ;
164180 expectMessage ( component . element4 , 'My Message' ) ;
165181 } ) ;
166182
167183 it ( 'should be able to handle multiple regisitrations of the same message to an element' , ( ) => {
184+ createFixture ( ) ;
168185 ariaDescriber . describe ( component . element1 , 'My Message' ) ;
169186 ariaDescriber . describe ( component . element1 , 'My Message' ) ;
170187 expectMessages ( [ 'My Message' ] ) ;
171188 expectMessage ( component . element1 , 'My Message' ) ;
172189 } ) ;
173190
174191 it ( 'should not throw when attempting to describe a non-element node' , ( ) => {
192+ createFixture ( ) ;
175193 const node : any = document . createComment ( 'Not an element node' ) ;
176194 expect ( ( ) => ariaDescriber . describe ( node , 'This looks like an element' ) ) . not . toThrow ( ) ;
177195 } ) ;
178196
179197 it ( 'should clear any pre-existing containers' , ( ) => {
198+ createFixture ( ) ;
180199 const extraContainer = document . createElement ( 'div' ) ;
181200 extraContainer . id = MESSAGES_CONTAINER_ID ;
182201 document . body . appendChild ( extraContainer ) ;
@@ -206,13 +225,15 @@ describe('AriaDescriber', () => {
206225 } ) ;
207226
208227 it ( 'should not overwrite the existing id of the description element' , ( ) => {
228+ createFixture ( ) ;
209229 const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
210230 expect ( descriptionNode . id ) . toBe ( 'description-with-existing-id' ) ;
211231 ariaDescriber . describe ( component . element1 , descriptionNode ) ;
212232 expect ( descriptionNode . id ) . toBe ( 'description-with-existing-id' ) ;
213233 } ) ;
214234
215235 it ( 'should not remove pre-existing description nodes on destroy' , ( ) => {
236+ createFixture ( ) ;
216237 const descriptionNode = fixture . nativeElement . querySelector ( '#description-with-existing-id' ) ;
217238
218239 expect ( document . body . contains ( descriptionNode ) )
@@ -231,6 +252,7 @@ describe('AriaDescriber', () => {
231252 } ) ;
232253
233254 it ( 'should remove the aria-describedby attribute if there are no more messages' , ( ) => {
255+ createFixture ( ) ;
234256 const element = component . element1 ;
235257
236258 expect ( element . hasAttribute ( 'aria-describedby' ) ) . toBe ( false ) ;
@@ -242,10 +264,27 @@ describe('AriaDescriber', () => {
242264 expect ( element . hasAttribute ( 'aria-describedby' ) ) . toBe ( false ) ;
243265 } ) ;
244266
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+ } ) ;
245284} ) ;
246285
247286function getMessagesContainer ( ) {
248- return document . querySelector ( `#${ MESSAGES_CONTAINER_ID } ` ) ;
287+ return document . querySelector ( `#${ MESSAGES_CONTAINER_ID } ` ) ! ;
249288}
250289
251290function getMessageElements ( ) : Node [ ] | null {
0 commit comments