11import { act , renderHook } from '@testing-library/react' ;
2- import { describe , expect , it , vi } from 'vitest' ;
32
3+ import { renderHookServer } from '@/tests' ;
44import { target } from '@/utils/helpers' ;
55
66import type { StateRef } from '../useRefState/useRefState' ;
77
8- import { renderHookServer } from '../../../tests/renderHookServer' ;
98import { useKeyboard } from './useKeyboard' ;
109
1110type UseKeyboardReturn = StateRef < HTMLDivElement > ;
@@ -28,33 +27,42 @@ targets.forEach((target) => {
2827 describe ( `${ target } ` , ( ) => {
2928 it ( 'Should use keyboard' , ( ) => {
3029 const { result } = renderHook ( ( ) => {
31- if ( target ) return useKeyboard ( target , ( ) => { } ) as unknown as UseKeyboardReturn ;
30+ if ( target )
31+ return useKeyboard ( target , ( ) => { } ) as unknown as UseKeyboardReturn & {
32+ ref : StateRef < HTMLDivElement > ;
33+ } ;
3234 return useKeyboard < HTMLDivElement > ( ( ) => { } ) ;
3335 } ) ;
3436
3537 if ( target ) expect ( result . current ) . toBeUndefined ( ) ;
36- if ( ! target ) expect ( result . current ) . toBeTypeOf ( 'function' ) ;
38+ if ( ! target ) expect ( result . current . ref ) . toBeTypeOf ( 'function' ) ;
3739 } ) ;
3840
3941 it ( 'Should use keyboard on server side' , ( ) => {
4042 const { result } = renderHookServer ( ( ) => {
41- if ( target ) return useKeyboard ( target , ( ) => { } ) as unknown as UseKeyboardReturn ;
43+ if ( target )
44+ return useKeyboard ( target , ( ) => { } ) as unknown as UseKeyboardReturn & {
45+ ref : StateRef < HTMLDivElement > ;
46+ } ;
4247 return useKeyboard < HTMLDivElement > ( ( ) => { } ) ;
4348 } ) ;
4449
4550 if ( target ) expect ( result . current ) . toBeUndefined ( ) ;
46- if ( ! target ) expect ( result . current ) . toBeTypeOf ( 'function' ) ;
51+ if ( ! target ) expect ( result . current . ref ) . toBeTypeOf ( 'function' ) ;
4752 } ) ;
4853
4954 it ( 'Should call callback on key down' , ( ) => {
5055 const callback = vi . fn ( ) ;
5156
5257 const { result } = renderHook ( ( ) => {
53- if ( target ) return useKeyboard ( target , callback ) as unknown as UseKeyboardReturn ;
58+ if ( target )
59+ return useKeyboard ( target , callback ) as unknown as UseKeyboardReturn & {
60+ ref : StateRef < HTMLDivElement > ;
61+ } ;
5462 return useKeyboard < HTMLDivElement > ( callback ) ;
5563 } ) ;
5664
57- if ( ! target ) act ( ( ) => ( result . current as UseKeyboardReturn ) ( element ) ) ;
65+ if ( ! target ) act ( ( ) => result . current . ref ( element ) ) ;
5866
5967 act ( ( ) => {
6068 element . dispatchEvent ( new KeyboardEvent ( 'keydown' , { bubbles : true , key : 'Enter' } ) ) ;
@@ -68,11 +76,16 @@ targets.forEach((target) => {
6876 const onKeyDown = vi . fn ( ) ;
6977
7078 const { result } = renderHook ( ( ) => {
71- if ( target ) return useKeyboard ( target , { onKeyDown } ) as unknown as UseKeyboardReturn ;
79+ if ( target )
80+ return useKeyboard ( target , {
81+ onKeyDown
82+ } ) as unknown as UseKeyboardReturn & {
83+ ref : StateRef < HTMLDivElement > ;
84+ } ;
7285 return useKeyboard < HTMLDivElement > ( { onKeyDown } ) ;
7386 } ) ;
7487
75- if ( ! target ) act ( ( ) => ( result . current as UseKeyboardReturn ) ( element ) ) ;
88+ if ( ! target ) act ( ( ) => result . current . ref ( element ) ) ;
7689
7790 act ( ( ) => {
7891 element . dispatchEvent ( new KeyboardEvent ( 'keydown' , { bubbles : true , key : 'a' } ) ) ;
@@ -86,11 +99,16 @@ targets.forEach((target) => {
8699 const onKeyUp = vi . fn ( ) ;
87100
88101 const { result } = renderHook ( ( ) => {
89- if ( target ) return useKeyboard ( target , { onKeyUp } ) as unknown as UseKeyboardReturn ;
102+ if ( target )
103+ return useKeyboard ( target , {
104+ onKeyUp
105+ } ) as unknown as UseKeyboardReturn & {
106+ ref : StateRef < HTMLDivElement > ;
107+ } ;
90108 return useKeyboard < HTMLDivElement > ( { onKeyUp } ) ;
91109 } ) ;
92110
93- if ( ! target ) act ( ( ) => ( result . current as UseKeyboardReturn ) ( element ) ) ;
111+ if ( ! target ) act ( ( ) => result . current . ref ( element ) ) ;
94112
95113 act ( ( ) => {
96114 element . dispatchEvent ( new KeyboardEvent ( 'keyup' , { bubbles : true , key : 'Escape' } ) ) ;
@@ -106,11 +124,16 @@ targets.forEach((target) => {
106124
107125 const { result } = renderHook ( ( ) => {
108126 if ( target )
109- return useKeyboard ( target , { onKeyDown, onKeyUp } ) as unknown as UseKeyboardReturn ;
127+ return useKeyboard ( target , {
128+ onKeyDown,
129+ onKeyUp
130+ } ) as unknown as UseKeyboardReturn & {
131+ ref : StateRef < HTMLDivElement > ;
132+ } ;
110133 return useKeyboard < HTMLDivElement > ( { onKeyDown, onKeyUp } ) ;
111134 } ) ;
112135
113- if ( ! target ) act ( ( ) => ( result . current as UseKeyboardReturn ) ( element ) ) ;
136+ if ( ! target ) act ( ( ) => result . current . ref ( element ) ) ;
114137
115138 act ( ( ) => {
116139 element . dispatchEvent ( new KeyboardEvent ( 'keydown' , { bubbles : true , key : 'Tab' } ) ) ;
@@ -121,31 +144,18 @@ targets.forEach((target) => {
121144 expect ( onKeyUp ) . toHaveBeenCalledOnce ( ) ;
122145 } ) ;
123146
124- it ( 'Should cleanup on unmount' , ( ) => {
125- const removeEventListenerSpy = vi . spyOn ( element , 'removeEventListener' ) ;
126-
127- const { result, unmount } = renderHook ( ( ) => {
128- if ( target ) return useKeyboard ( target , ( ) => { } ) as unknown as UseKeyboardReturn ;
129- return useKeyboard < HTMLDivElement > ( ( ) => { } ) ;
130- } ) ;
131-
132- if ( ! target ) act ( ( ) => ( result . current as UseKeyboardReturn ) ( element ) ) ;
133-
134- unmount ( ) ;
135-
136- expect ( removeEventListenerSpy ) . toHaveBeenCalledWith ( 'keydown' , expect . any ( Function ) ) ;
137- expect ( removeEventListenerSpy ) . toHaveBeenCalledWith ( 'keyup' , expect . any ( Function ) ) ;
138- } ) ;
139-
140147 it ( 'Should pass correct key in keyboard event' , ( ) => {
141148 const callback = vi . fn ( ) ;
142149
143150 const { result } = renderHook ( ( ) => {
144- if ( target ) return useKeyboard ( target , callback ) as unknown as UseKeyboardReturn ;
151+ if ( target )
152+ return useKeyboard ( target , callback ) as unknown as UseKeyboardReturn & {
153+ ref : StateRef < HTMLDivElement > ;
154+ } ;
145155 return useKeyboard < HTMLDivElement > ( callback ) ;
146156 } ) ;
147157
148- if ( ! target ) act ( ( ) => ( result . current as UseKeyboardReturn ) ( element ) ) ;
158+ if ( ! target ) act ( ( ) => result . current . ref ( element ) ) ;
149159
150160 act ( ( ) => {
151161 element . dispatchEvent ( new KeyboardEvent ( 'keydown' , { bubbles : true , key : 'Enter' } ) ) ;
@@ -154,45 +164,24 @@ targets.forEach((target) => {
154164 expect ( callback ) . toHaveBeenCalledOnce ( ) ;
155165 expect ( callback . mock . calls [ 0 ] [ 0 ] . key ) . toBe ( 'Enter' ) ;
156166 } ) ;
167+ } ) ;
157168
158- it ( 'Should attach listener to window when no target provided' , ( ) => {
159- const callback = vi . fn ( ) ;
160-
161- renderHook ( ( ) => useKeyboard ( callback ) ) ;
162-
163- act ( ( ) => {
164- window . dispatchEvent ( new KeyboardEvent ( 'keydown' , { key : 'Enter' } ) ) ;
165- } ) ;
169+ it ( 'Should cleanup on unmount' , ( ) => {
170+ const removeEventListenerSpy = vi . spyOn ( element , 'removeEventListener' ) ;
166171
167- expect ( callback ) . toHaveBeenCalledOnce ( ) ;
172+ const { result, unmount } = renderHook ( ( ) => {
173+ if ( target )
174+ return useKeyboard ( target , ( ) => { } ) as unknown as UseKeyboardReturn & {
175+ ref : StateRef < HTMLDivElement > ;
176+ } ;
177+ return useKeyboard < HTMLDivElement > ( ( ) => { } ) ;
168178 } ) ;
169179
170- it ( 'Should update options after rerender' , ( ) => {
171- if ( target ) return ;
172-
173- const onKeyDown1 = vi . fn ( ) ;
174- const onKeyDown2 = vi . fn ( ) ;
175-
176- const { result, rerender } = renderHook (
177- ( { handler } ) => useKeyboard < HTMLDivElement > ( { onKeyDown : handler } ) ,
178- { initialProps : { handler : onKeyDown1 } }
179- ) ;
180-
181- act ( ( ) => ( result . current as unknown as UseKeyboardReturn ) ( element ) ) ;
180+ if ( ! target ) act ( ( ) => result . current . ref ( element ) ) ;
182181
183- act ( ( ) => {
184- element . dispatchEvent ( new KeyboardEvent ( 'keydown' , { key : 'Enter' } ) ) ;
185- } ) ;
186-
187- expect ( onKeyDown1 ) . toHaveBeenCalledOnce ( ) ;
188-
189- rerender ( { handler : onKeyDown2 } ) ;
182+ unmount ( ) ;
190183
191- act ( ( ) => {
192- element . dispatchEvent ( new KeyboardEvent ( 'keydown' , { key : 'Enter' } ) ) ;
193- } ) ;
194-
195- expect ( onKeyDown2 ) . toHaveBeenCalledOnce ( ) ;
196- } ) ;
184+ expect ( removeEventListenerSpy ) . toHaveBeenCalledWith ( 'keydown' , expect . any ( Function ) ) ;
185+ expect ( removeEventListenerSpy ) . toHaveBeenCalledWith ( 'keyup' , expect . any ( Function ) ) ;
197186 } ) ;
198187} ) ;
0 commit comments