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,28 @@ 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} = renderHook ( ( ) => useMediaQuery ( 'max-width : 768px' , { enabled : false } ) ) ;
48+ const { result : result2 , rerender : rerender2 } = 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+ vi . unstubAllGlobals ( ) ;
60+ vi . stubGlobal ( 'matchMedia' , matchMediaMock ) ;
61+ } ) ;
62+
3363 it ( 'should return undefined on first render, if initializeWithValue is false' , ( ) => {
3464 const { result} = renderHook ( ( ) =>
3565 useMediaQuery ( 'max-width : 768px' , { initializeWithValue : false } ) ) ;
@@ -147,4 +177,10 @@ describe('useMediaQuery', () => {
147177 unmount1 ( ) ;
148178 expect ( mql . removeEventListener ) . toHaveBeenCalledTimes ( 1 ) ;
149179 } ) ;
180+
181+ it ( 'should not throw when media query is not supported' , ( ) => {
182+ const { result} = renderHook ( ( ) => useMediaQuery ( '(orientation: unsupported)' , { initializeWithValue : true } ) ) ;
183+ expect ( result . error ) . toBeUndefined ( ) ;
184+ expect ( result . current ) . toBe ( undefined ) ;
185+ } ) ;
150186} ) ;
0 commit comments