@@ -3,21 +3,21 @@ import React from 'react';
3
3
import { render , screen , act , fireEvent } from '@testing-library/react' ;
4
4
import useViewportSizes from './index' ;
5
5
6
- function BasicUseCase ( ) {
7
- const [ vpW , vpH ] = useViewportSizes ( ) ;
6
+ function DimensionView ( { options } ) {
7
+ const [ dimension ] = useViewportSizes ( options ) ;
8
8
return (
9
9
< div >
10
- < div data-testid = 'vpw' > { vpW } </ div >
11
- < div data-testid = 'vph' > { vpH } </ div >
10
+ < div data-testid = 'dimension' > { dimension } </ div >
12
11
</ div >
13
12
) ;
14
13
}
15
14
16
- function WithDimensionArgument ( { options } ) {
17
- const [ dimension ] = useViewportSizes ( options ) ;
15
+ function DimensionsView ( { options } ) {
16
+ const [ vpW , vpH ] = useViewportSizes ( options ) ;
18
17
return (
19
18
< div >
20
- < div data-testid = 'dimension' > { dimension } </ div >
19
+ < div data-testid = 'vpw' > { vpW } </ div >
20
+ < div data-testid = 'vph' > { vpH } </ div >
21
21
</ div >
22
22
) ;
23
23
}
@@ -32,17 +32,20 @@ function setViewportDimensions(width, height) {
32
32
}
33
33
34
34
describe ( 'useViewportSizes' , ( ) => {
35
+ afterEach ( ( ) => {
36
+ jest . useRealTimers ( ) ;
37
+ } ) ;
35
38
describe ( 'calling with no options' , ( ) => {
36
39
test ( 'renders viewport width/height when run with no arguments' , async ( ) => {
37
40
setViewportDimensions ( 640 , 480 ) ;
38
- render ( < BasicUseCase /> ) ;
41
+ render ( < DimensionsView /> ) ;
39
42
expect ( screen . getByTestId ( 'vpw' ) . textContent ) . toEqual ( '640' ) ;
40
43
expect ( screen . getByTestId ( 'vph' ) . textContent ) . toEqual ( '480' ) ;
41
44
} ) ;
42
45
43
46
test ( 'updates viewport width/height read when the window is resized' , async ( ) => {
44
47
setViewportDimensions ( 640 , 480 ) ;
45
- render ( < BasicUseCase /> ) ;
48
+ render ( < DimensionsView /> ) ;
46
49
expect ( screen . getByTestId ( 'vpw' ) . textContent ) . toEqual ( '640' ) ;
47
50
expect ( screen . getByTestId ( 'vph' ) . textContent ) . toEqual ( '480' ) ;
48
51
@@ -55,7 +58,7 @@ describe('useViewportSizes', () => {
55
58
describe ( 'calling with one dimension option passed' , ( ) => {
56
59
test ( 'renders width of viewport when passed dimension: `w`, and updates this' , async ( ) => {
57
60
setViewportDimensions ( 640 , 480 ) ;
58
- render ( < WithDimensionArgument options = { { dimension : 'w' } } /> ) ;
61
+ render ( < DimensionView options = { { dimension : 'w' } } /> ) ;
59
62
expect ( screen . getByTestId ( 'dimension' ) . textContent ) . toEqual ( '640' ) ;
60
63
61
64
setViewportDimensions ( 44 , 80 ) ;
@@ -64,11 +67,55 @@ describe('useViewportSizes', () => {
64
67
65
68
test ( 'renders width of viewport when passed dimension: `h`, and updates this' , async ( ) => {
66
69
setViewportDimensions ( 640 , 480 ) ;
67
- render ( < WithDimensionArgument options = { { dimension : 'h' } } /> ) ;
70
+ render ( < DimensionView options = { { dimension : 'h' } } /> ) ;
68
71
expect ( screen . getByTestId ( 'dimension' ) . textContent ) . toEqual ( '480' ) ;
69
72
70
73
setViewportDimensions ( 44 , 80 ) ;
71
74
expect ( screen . getByTestId ( 'dimension' ) . textContent ) . toEqual ( '80' ) ;
72
75
} ) ;
73
76
} ) ;
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
+ } ) ;
74
121
} ) ;
0 commit comments