11import { ComponentFixture , fakeAsync , flush , inject , TestBed } from '@angular/core/testing' ;
2- import { Component , DebugElement } from '@angular/core' ;
2+ import { Component , DebugElement , Directive } from '@angular/core' ;
33import { MdbDropdownModule } from './index' ;
44import { MdbDropdownDirective } from './index' ;
55import { By } from '@angular/platform-browser' ;
66import { NoopAnimationsModule } from '@angular/platform-browser/animations' ;
77import { OverlayContainer } from '@angular/cdk/overlay' ;
88
99describe ( 'MDB Dropdown' , ( ) => {
10- describe ( 'after init' , ( ) => {
11- let fixture : ComponentFixture < TestDropdownComponent > ;
12- let element : any ;
13- let component : TestDropdownComponent ;
14- let directive : any ;
15- let debugElement : DebugElement ;
16- let overlayContainer : OverlayContainer ;
17- let overlayContainerElement : HTMLElement ;
18-
19- beforeEach ( async ( ) => {
20- await TestBed . configureTestingModule ( {
21- imports : [ MdbDropdownModule , NoopAnimationsModule ] ,
22- declarations : [ TestDropdownComponent ] ,
23- teardown : { destroyAfterEach : false } ,
24- } ) ;
25-
26- inject ( [ OverlayContainer ] , ( container : OverlayContainer ) => {
27- overlayContainer = container ;
28- overlayContainerElement = container . getContainerElement ( ) ;
29- } ) ( ) ;
30-
31- fixture = TestBed . createComponent ( TestDropdownComponent ) ;
32- component = fixture . componentInstance ;
33- element = fixture . nativeElement ;
34- debugElement = fixture . debugElement ;
35-
36- fixture . detectChanges ( ) ;
10+ let fixture : ComponentFixture < TestDropdownComponent > ;
11+ let element : any ;
12+ let component : TestDropdownComponent ;
13+ let directive : any ;
14+ let debugElement : DebugElement ;
15+ let overlayContainer : OverlayContainer ;
16+ let overlayContainerElement : HTMLElement ;
17+
18+ beforeEach ( async ( ) => {
19+ await TestBed . configureTestingModule ( {
20+ imports : [ MdbDropdownModule , NoopAnimationsModule ] ,
21+ declarations : [ TestDropdownComponent ] ,
22+ teardown : { destroyAfterEach : false } ,
3723 } ) ;
3824
39- afterEach ( inject ( [ OverlayContainer ] , ( currentOverlayContainer : OverlayContainer ) => {
40- currentOverlayContainer . ngOnDestroy ( ) ;
41- overlayContainer . ngOnDestroy ( ) ;
42- } ) ) ;
25+ inject ( [ OverlayContainer ] , ( container : OverlayContainer ) => {
26+ overlayContainer = container ;
27+ overlayContainerElement = container . getContainerElement ( ) ;
28+ } ) ( ) ;
29+
30+ fixture = TestBed . createComponent ( TestDropdownComponent ) ;
31+ component = fixture . componentInstance ;
32+ element = fixture . nativeElement ;
33+ debugElement = fixture . debugElement ;
4334
35+ fixture . detectChanges ( ) ;
36+ } ) ;
37+
38+ afterEach ( inject ( [ OverlayContainer ] , ( currentOverlayContainer : OverlayContainer ) => {
39+ currentOverlayContainer . ngOnDestroy ( ) ;
40+ overlayContainer . ngOnDestroy ( ) ;
41+ } ) ) ;
42+
43+ describe ( 'after init' , ( ) => {
4444 it ( 'should create the component' , ( ) => {
4545 expect ( component ) . toBeTruthy ( ) ;
4646 } ) ;
@@ -151,6 +151,54 @@ describe('MDB Dropdown', () => {
151151 expect ( directive . _xPosition ) . toBe ( 'end' ) ;
152152 } ) ;
153153 } ) ;
154+
155+ describe ( 'Keyboard navigation' , ( ) => {
156+ it ( 'should correctly focus dropdown items when ArrowUp or ArrowDown key is used' , fakeAsync ( ( ) => {
157+ directive = fixture . debugElement
158+ . query ( By . directive ( MdbDropdownDirective ) )
159+ . injector . get ( MdbDropdownDirective ) as MdbDropdownDirective ;
160+
161+ directive . show ( ) ;
162+ fixture . detectChanges ( ) ;
163+ flush ( ) ;
164+
165+ const menu = document . querySelector ( '.dropdown-menu' ) ;
166+ const items = menu . querySelectorAll ( '.dropdown-item' ) ;
167+
168+ document . body . dispatchEvent ( new KeyboardEvent ( 'keydown' , { key : 'ArrowDown' } ) ) ;
169+ fixture . detectChanges ( ) ;
170+
171+ expect ( document . activeElement ) . toBe ( items [ 0 ] ) ;
172+
173+ document . body . dispatchEvent ( new KeyboardEvent ( 'keydown' , { key : 'ArrowDown' } ) ) ;
174+ fixture . detectChanges ( ) ;
175+
176+ expect ( document . activeElement ) . toBe ( items [ 1 ] ) ;
177+
178+ document . body . dispatchEvent ( new KeyboardEvent ( 'keydown' , { key : 'ArrowUp' } ) ) ;
179+ fixture . detectChanges ( ) ;
180+
181+ expect ( document . activeElement ) . toBe ( items [ 0 ] ) ;
182+ } ) ) ;
183+
184+ it ( 'should focus last option if ArrowUp is used and no item is selected' , fakeAsync ( ( ) => {
185+ directive = fixture . debugElement
186+ . query ( By . directive ( MdbDropdownDirective ) )
187+ . injector . get ( MdbDropdownDirective ) as MdbDropdownDirective ;
188+
189+ directive . show ( ) ;
190+ fixture . detectChanges ( ) ;
191+ flush ( ) ;
192+
193+ const menu = document . querySelector ( '.dropdown-menu' ) ;
194+ const items = menu . querySelectorAll ( '.dropdown-item' ) ;
195+
196+ document . body . dispatchEvent ( new KeyboardEvent ( 'keydown' , { key : 'ArrowUp' } ) ) ;
197+ fixture . detectChanges ( ) ;
198+
199+ expect ( document . activeElement ) . toBe ( items [ items . length - 1 ] ) ;
200+ } ) ) ;
201+ } ) ;
154202} ) ;
155203
156204@Component ( {
@@ -165,6 +213,8 @@ describe('MDB Dropdown', () => {
165213 aria-labelledby="dropdownMenuButton"
166214 >
167215 <li><a class="dropdown-item" href="#">Action</a></li>
216+ <li><a class="dropdown-item" href="#">Another action</a></li>
217+ <li><a class="dropdown-item" href="#">Something else here</a></li>
168218 </ul>
169219 </div>
170220 ` ,
0 commit comments