11import { 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' ;
33import { useMediaQuery } from '../index.js' ;
44
55describe ( '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+ } ) ;
1422
1523 vi . stubGlobal ( 'matchMedia' , matchMediaMock ) ;
1624
@@ -30,6 +38,34 @@ describe('useMediaQuery', () => {
3038 expect ( result . error ) . toBeUndefined ( ) ;
3139 } ) ;
3240
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+
3369 it ( 'should return undefined on first render, if initializeWithValue is false' , ( ) => {
3470 const { result} = renderHook ( ( ) =>
3571 useMediaQuery ( 'max-width : 768px' , { initializeWithValue : false } ) ) ;
@@ -147,4 +183,16 @@ describe('useMediaQuery', () => {
147183 unmount1 ( ) ;
148184 expect ( mql . removeEventListener ) . toHaveBeenCalledTimes ( 1 ) ;
149185 } ) ;
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+ } ) ;
150198} ) ;
0 commit comments