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