@@ -3,21 +3,21 @@ import React from 'react';
33import { render , screen , act , fireEvent } from '@testing-library/react' ;
44import useViewportSizes from './index' ;
55
6- function BasicUseCase ( ) {
7- const [ vpW , vpH ] = useViewportSizes ( ) ;
6+ function DimensionView ( { options } ) {
7+ const [ dimension ] = useViewportSizes ( options ) ;
88 return (
99 < div >
10- < div data-testid = 'vpw' > { vpW } </ div >
11- < div data-testid = 'vph' > { vpH } </ div >
10+ < div data-testid = 'dimension' > { dimension } </ div >
1211 </ div >
1312 ) ;
1413}
1514
16- function WithDimensionArgument ( { options } ) {
17- const [ dimension ] = useViewportSizes ( options ) ;
15+ function DimensionsView ( { options } ) {
16+ const [ vpW , vpH ] = useViewportSizes ( options ) ;
1817 return (
1918 < div >
20- < div data-testid = 'dimension' > { dimension } </ div >
19+ < div data-testid = 'vpw' > { vpW } </ div >
20+ < div data-testid = 'vph' > { vpH } </ div >
2121 </ div >
2222 ) ;
2323}
@@ -32,17 +32,20 @@ function setViewportDimensions(width, height) {
3232}
3333
3434describe ( 'useViewportSizes' , ( ) => {
35+ afterEach ( ( ) => {
36+ jest . useRealTimers ( ) ;
37+ } ) ;
3538 describe ( 'calling with no options' , ( ) => {
3639 test ( 'renders viewport width/height when run with no arguments' , async ( ) => {
3740 setViewportDimensions ( 640 , 480 ) ;
38- render ( < BasicUseCase /> ) ;
41+ render ( < DimensionsView /> ) ;
3942 expect ( screen . getByTestId ( 'vpw' ) . textContent ) . toEqual ( '640' ) ;
4043 expect ( screen . getByTestId ( 'vph' ) . textContent ) . toEqual ( '480' ) ;
4144 } ) ;
4245
4346 test ( 'updates viewport width/height read when the window is resized' , async ( ) => {
4447 setViewportDimensions ( 640 , 480 ) ;
45- render ( < BasicUseCase /> ) ;
48+ render ( < DimensionsView /> ) ;
4649 expect ( screen . getByTestId ( 'vpw' ) . textContent ) . toEqual ( '640' ) ;
4750 expect ( screen . getByTestId ( 'vph' ) . textContent ) . toEqual ( '480' ) ;
4851
@@ -55,7 +58,7 @@ describe('useViewportSizes', () => {
5558 describe ( 'calling with one dimension option passed' , ( ) => {
5659 test ( 'renders width of viewport when passed dimension: `w`, and updates this' , async ( ) => {
5760 setViewportDimensions ( 640 , 480 ) ;
58- render ( < WithDimensionArgument options = { { dimension : 'w' } } /> ) ;
61+ render ( < DimensionView options = { { dimension : 'w' } } /> ) ;
5962 expect ( screen . getByTestId ( 'dimension' ) . textContent ) . toEqual ( '640' ) ;
6063
6164 setViewportDimensions ( 44 , 80 ) ;
@@ -64,11 +67,55 @@ describe('useViewportSizes', () => {
6467
6568 test ( 'renders width of viewport when passed dimension: `h`, and updates this' , async ( ) => {
6669 setViewportDimensions ( 640 , 480 ) ;
67- render ( < WithDimensionArgument options = { { dimension : 'h' } } /> ) ;
70+ render ( < DimensionView options = { { dimension : 'h' } } /> ) ;
6871 expect ( screen . getByTestId ( 'dimension' ) . textContent ) . toEqual ( '480' ) ;
6972
7073 setViewportDimensions ( 44 , 80 ) ;
7174 expect ( screen . getByTestId ( 'dimension' ) . textContent ) . toEqual ( '80' ) ;
7275 } ) ;
7376 } ) ;
77+
78+ describe ( 'other scenarios' , ( ) => {
79+ test ( 'works with a custom hasher to only update when a breakpoint changes' , async ( ) => {
80+ jest . useFakeTimers ( ) ;
81+ setViewportDimensions ( 640 , 480 ) ;
82+ const options = {
83+ hasher : ( { vpW } ) => {
84+ if ( vpW <= 240 ) { return 'xs' }
85+ if ( vpW <= 320 ) { return 'sm' }
86+ else if ( vpW <= 640 ) { return 'md' }
87+ else return 'lg' ;
88+ }
89+ } ;
90+
91+ render ( < DimensionsView options = { options } /> ) ;
92+ expect ( screen . getByTestId ( 'vpw' ) . textContent ) . toEqual ( '640' ) ;
93+
94+ setViewportDimensions ( 639 , 480 ) ;
95+ jest . runAllTimers ( ) ;
96+ expect ( screen . getByTestId ( 'vpw' ) . textContent ) . toEqual ( '640' ) ;
97+
98+ setViewportDimensions ( 645 , 480 ) ;
99+ jest . runAllTimers ( ) ;
100+
101+ expect ( screen . getByTestId ( 'vpw' ) . textContent ) . toEqual ( '645' ) ;
102+
103+ setViewportDimensions ( 240 , 480 ) ;
104+ jest . runAllTimers ( ) ;
105+ expect ( screen . getByTestId ( 'vpw' ) . textContent ) . toEqual ( '240' ) ;
106+
107+ setViewportDimensions ( 238 , 480 ) ;
108+ jest . runAllTimers ( ) ;
109+ expect ( screen . getByTestId ( 'vpw' ) . textContent ) . toEqual ( '240' ) ;
110+
111+ setViewportDimensions ( 300 , 480 ) ;
112+ jest . runAllTimers ( ) ;
113+ expect ( screen . getByTestId ( 'vpw' ) . textContent ) . toEqual ( '300' ) ;
114+
115+
116+ setViewportDimensions ( 500 , 200 ) ;
117+ jest . runAllTimers ( ) ;
118+ expect ( screen . getByTestId ( 'vpw' ) . textContent ) . toEqual ( '500' ) ;
119+ } ) ;
120+ } ) ;
74121} ) ;
0 commit comments