Skip to content

Commit b179128

Browse files
committed
add hasher tests & refactor, update README example
1 parent 612776b commit b179128

File tree

2 files changed

+66
-27
lines changed

2 files changed

+66
-27
lines changed

README.md

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -100,26 +100,18 @@ If passed an `options.hasher` function, this will be used to calculate a hash th
100100
import useViewportSizes from 'use-viewport-sizes';
101101

102102
function getBreakpointHash({ vpW, vpH }) {
103-
if(vpW < 640) {
104-
return 'md';
105-
}
106-
if(vpW < 320) {
107-
return 'sm';
108-
}
109-
else if(vpW < 240) {
110-
return 'xs';
111-
}
112-
else {
113-
return 'lg';
114-
}
103+
if(vpW <= 240) { return 'xs' }
104+
if(vpW <= 320) { return 'sm' }
105+
else if(vpW <= 640) { return 'md' }
106+
else return 'lg';
115107
}
116108

117109
function MyBreakpointBehaviorComponent() {
118-
const [vpW, vpH, bp] = useViewportSizes({ hasher: getBreakpointHash });
110+
const [vpW, vpH] = useViewportSizes({ hasher: getBreakpointHash });
119111

120-
// do-something-with-breakpoints in render
121-
// and add new update for vpW, vpH in this component's
122-
// subtree only when a named breakpoint changes
112+
// do-something in render and add new update for vpW,
113+
// vpH in this component's subtree only when a breakpoint
114+
// hash updates
123115
}
124116
```
125117

src/index.test.js

Lines changed: 58 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,21 @@ import React from 'react';
33
import { render, screen, act, fireEvent } from '@testing-library/react';
44
import 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

3434
describe('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

Comments
 (0)