1
1
import { act , renderHook } from '@testing-library/react-hooks/dom' ;
2
- import { afterEach , beforeEach , describe , expect , it , vi } from 'vitest' ;
2
+ import { type Mock , afterEach , beforeEach , describe , expect , it , vi } from 'vitest' ;
3
3
import { useMediaQuery } from '../index.js' ;
4
4
5
5
describe ( 'useMediaQuery' , ( ) => {
6
- const matchMediaMock = vi . fn ( ( query : string ) => ( {
7
- matches : false ,
8
- media : query ,
9
- onchange : null ,
10
- addEventListener : vi . fn ( ) ,
11
- removeEventListener : vi . fn ( ) ,
12
- dispatchEvent : vi . fn ( ) ,
13
- } ) ) ;
6
+ const matchMediaMock = vi . fn ( ( query : string ) => (
7
+ query === '(orientation: unsupported)' ?
8
+ undefined :
9
+ {
10
+ matches : false ,
11
+ media : query ,
12
+ onchange : null ,
13
+ addEventListener : vi . fn ( ) ,
14
+ removeEventListener : vi . fn ( ) ,
15
+ dispatchEvent : vi . fn ( ) ,
16
+ } ) as unknown as MediaQueryList & {
17
+ matches : boolean ;
18
+ addEventListener : Mock ;
19
+ removeEventListener : Mock ;
20
+ dispatchEvent : Mock ;
21
+ } ) ;
14
22
15
23
vi . stubGlobal ( 'matchMedia' , matchMediaMock ) ;
16
24
@@ -30,6 +38,34 @@ describe('useMediaQuery', () => {
30
38
expect ( result . error ) . toBeUndefined ( ) ;
31
39
} ) ;
32
40
41
+ it ( 'should return undefined and not thrown on unsupported when not enabled' , ( ) => {
42
+ vi . stubGlobal ( 'console' , {
43
+ error ( error : string ) {
44
+ throw new Error ( error ) ;
45
+ } ,
46
+ } ) ;
47
+ const { result, rerender, unmount} = renderHook ( ( ) => useMediaQuery ( 'max-width : 768px' , { enabled : false } ) ) ;
48
+ const { result : result2 , rerender : rerender2 , unmount : unmount2 } = renderHook ( ( ) => useMediaQuery ( '(orientation: unsupported)' , { enabled : false } ) ) ;
49
+ expect ( result . error ) . toBeUndefined ( ) ;
50
+ expect ( result . current ) . toBe ( undefined ) ;
51
+ expect ( result2 . error ) . toBeUndefined ( ) ;
52
+ expect ( result2 . current ) . toBe ( undefined ) ;
53
+ rerender ( 'max-width : 768px' ) ;
54
+ rerender2 ( '(orientation: unsupported)' ) ;
55
+ expect ( result . error ) . toBeUndefined ( ) ;
56
+ expect ( result . current ) . toBe ( undefined ) ;
57
+ expect ( result2 . current ) . toBe ( undefined ) ;
58
+ expect ( result2 . error ) . toBeUndefined ( ) ;
59
+ unmount ( ) ;
60
+ unmount2 ( ) ;
61
+ expect ( result . error ) . toBeUndefined ( ) ;
62
+ expect ( result . current ) . toBe ( undefined ) ;
63
+ expect ( result2 . error ) . toBeUndefined ( ) ;
64
+ expect ( result2 . current ) . toBe ( undefined ) ;
65
+ vi . unstubAllGlobals ( ) ;
66
+ vi . stubGlobal ( 'matchMedia' , matchMediaMock ) ;
67
+ } ) ;
68
+
33
69
it ( 'should return undefined on first render, if initializeWithValue is false' , ( ) => {
34
70
const { result} = renderHook ( ( ) =>
35
71
useMediaQuery ( 'max-width : 768px' , { initializeWithValue : false } ) ) ;
@@ -147,4 +183,16 @@ describe('useMediaQuery', () => {
147
183
unmount1 ( ) ;
148
184
expect ( mql . removeEventListener ) . toHaveBeenCalledTimes ( 1 ) ;
149
185
} ) ;
186
+
187
+ it ( 'should not throw when media query is not supported' , ( ) => {
188
+ const { result, unmount, rerender} = renderHook ( ( ) => useMediaQuery ( '(orientation: unsupported)' , { initializeWithValue : true } ) ) ;
189
+ expect ( result . error ) . toBeUndefined ( ) ;
190
+ expect ( result . current ) . toBe ( undefined ) ;
191
+ rerender ( ) ;
192
+ expect ( result . error ) . toBeUndefined ( ) ;
193
+ expect ( result . current ) . toBe ( undefined ) ;
194
+ unmount ( ) ;
195
+ expect ( result . error ) . toBeUndefined ( ) ;
196
+ expect ( result . current ) . toBe ( undefined ) ;
197
+ } ) ;
150
198
} ) ;
0 commit comments