@@ -2,12 +2,17 @@ import {
2
2
activateFocusTrap ,
3
3
connectFocusTrap ,
4
4
deactivateFocusTrap ,
5
+ FocusTrapComponent ,
5
6
updateFocusTrapElements ,
6
7
} from "./focusTrapComponent" ;
7
8
9
+ import { JSDOM } from "jsdom" ;
10
+ import { CalciteConfig } from "./config" ;
11
+ import { GlobalTestProps } from "../tests/utils" ;
12
+
8
13
describe ( "focusTrapComponent" , ( ) => {
9
14
it ( "focusTrapComponent lifecycle" , ( ) => {
10
- const fakeComponent = { } as any ;
15
+ const fakeComponent = { } as FocusTrapComponent ;
11
16
fakeComponent . el = document . createElement ( "div" ) ;
12
17
13
18
connectFocusTrap ( fakeComponent ) ;
@@ -35,7 +40,7 @@ describe("focusTrapComponent", () => {
35
40
} ) ;
36
41
37
42
it ( "supports passing options" , ( ) => {
38
- const fakeComponent = { } as any ;
43
+ const fakeComponent = { } as FocusTrapComponent ;
39
44
fakeComponent . el = document . createElement ( "div" ) ;
40
45
41
46
connectFocusTrap ( fakeComponent ) ;
@@ -54,4 +59,48 @@ describe("focusTrapComponent", () => {
54
59
deactivateFocusTrap ( fakeComponent , fakeDeactivateOptions ) ;
55
60
expect ( deactivateSpy ) . toHaveBeenCalledWith ( fakeDeactivateOptions ) ;
56
61
} ) ;
62
+
63
+ describe ( "configuration" , ( ) => {
64
+ beforeEach ( ( ) => jest . resetModules ( ) ) ;
65
+
66
+ it ( "supports custom global trap stack" , async ( ) => {
67
+ const customFocusTrapStack = [ ] ;
68
+
69
+ // we clobber Stencil's custom Mock document implementation
70
+ const { window : win } = new JSDOM ( ) ;
71
+ window = win ; // make window references use JSDOM
72
+ globalThis . MutationObserver = window . MutationObserver ; // needed for focus-trap
73
+
74
+ type TestGlobal = GlobalTestProps < { calciteConfig : CalciteConfig } > ;
75
+
76
+ ( globalThis as TestGlobal ) . calciteConfig = {
77
+ focusTrapStack : customFocusTrapStack ,
78
+ } ;
79
+
80
+ const focusTrap = await import ( "focus-trap" ) ;
81
+ const createFocusTrapSpy = jest . spyOn ( focusTrap , "createFocusTrap" ) ;
82
+
83
+ const focusTrapComponent = await import ( "./focusTrapComponent" ) ;
84
+ const fakeComponent = { } as FocusTrapComponent ;
85
+ fakeComponent . el = win . document . createElement ( "div" ) ;
86
+
87
+ focusTrapComponent . connectFocusTrap ( fakeComponent ) ;
88
+ expect ( createFocusTrapSpy ) . toHaveBeenLastCalledWith (
89
+ expect . anything ( ) ,
90
+ expect . objectContaining ( {
91
+ trapStack : customFocusTrapStack ,
92
+ } )
93
+ ) ;
94
+ expect ( customFocusTrapStack ) . toHaveLength ( 0 ) ;
95
+
96
+ focusTrapComponent . activateFocusTrap ( fakeComponent ) ;
97
+ expect ( customFocusTrapStack ) . toHaveLength ( 1 ) ;
98
+
99
+ focusTrapComponent . deactivateFocusTrap ( fakeComponent ) ;
100
+ expect ( customFocusTrapStack ) . toHaveLength ( 0 ) ;
101
+
102
+ focusTrapComponent . activateFocusTrap ( fakeComponent ) ;
103
+ expect ( customFocusTrapStack ) . toHaveLength ( 1 ) ;
104
+ } ) ;
105
+ } ) ;
57
106
} ) ;
0 commit comments