Skip to content

Commit 1a894f5

Browse files
committed
Add test suite with Jest and @testing-library
1 parent 918c1df commit 1a894f5

6 files changed

Lines changed: 2793 additions & 62 deletions

File tree

.eslintrc.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ module.exports = {
77
parser: 'babel-eslint',
88
env: {
99
browser: true,
10-
es6: true
10+
es6: true,
11+
jest: true
1112
},
1213
extends: ['airbnb', 'prettier', 'prettier/react', 'plugin:import/warnings'],
1314
plugins: ['prettier', 'react-hooks', 'import'],

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ node_modules
66

77
# builds
88
build
9+
coverage
910
dist
1011
.rpt2_cache
1112
.next

jest.config.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* Configure Jest as the test runner for @testing-library
3+
*
4+
* @see https://jestjs.io/docs/en/configuration
5+
*/
6+
module.exports = {
7+
setupFilesAfterEnv: [
8+
'@testing-library/jest-dom/extend-expect',
9+
'@testing-library/react/cleanup-after-each'
10+
],
11+
collectCoverage: true
12+
};

package.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
"npm": ">=5"
2626
},
2727
"scripts": {
28+
"test": "jest",
29+
"test:watch": "jest --watch",
2830
"build": "rollup -c",
2931
"start": "rollup -c -w",
3032
"prepare": "yarn run build"
@@ -56,7 +58,11 @@
5658
"@babel/plugin-transform-runtime": "^7.5.0",
5759
"@babel/preset-env": "^7.5.4",
5860
"@babel/preset-react": "^7.0.0",
61+
"@testing-library/jest-dom": "^4.0.0",
62+
"@testing-library/react": "^8.0.7",
5963
"babel-eslint": "10.0.2",
64+
"babel-polyfill": "^6.26.0",
65+
"codecov": "^3.5.0",
6066
"cross-env": "^5.2.0",
6167
"eslint": "^5.16.0",
6268
"eslint-config-airbnb": "^17.1.1",
@@ -67,6 +73,7 @@
6773
"eslint-plugin-react": "^7.14.2",
6874
"eslint-plugin-react-hooks": "^1.6.1",
6975
"husky": "^3.0.0",
76+
"jest": "^24.8.0",
7077
"lint-staged": "^9.2.0",
7178
"prettier": "^1.18.2",
7279
"react": "^16.8.6",
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
import React, { useRef } from 'react';
2+
import 'babel-polyfill';
3+
import { render, fireEvent } from '@testing-library/react';
4+
import useDoubleClick from '../index';
5+
6+
const Button = props => {
7+
const buttonRef = useRef();
8+
useDoubleClick({ ref: buttonRef, ...props });
9+
return (
10+
<button ref={buttonRef} type="button">
11+
Click Me
12+
</button>
13+
);
14+
};
15+
16+
test('calls "onSingleClick" callback on single click', async () => {
17+
const onSingleClick = jest.fn();
18+
const { getByText } = render(<Button onSingleClick={onSingleClick} />);
19+
20+
fireEvent.click(getByText(/Click Me/i));
21+
22+
await new Promise(r => setTimeout(r, 300));
23+
24+
expect(onSingleClick).toHaveBeenCalledTimes(1);
25+
});
26+
27+
test('calls "onDoubleClick" callback on double click', async () => {
28+
const onDoubleClick = jest.fn();
29+
const { getByText } = render(<Button onDoubleClick={onDoubleClick} />);
30+
31+
fireEvent.click(getByText(/Click Me/i));
32+
fireEvent.click(getByText(/Click Me/i));
33+
34+
await new Promise(r => setTimeout(r, 300));
35+
36+
expect(onDoubleClick).toHaveBeenCalledTimes(1);
37+
});
38+
39+
test('calls "onSingleClick" callback with custom latency', async () => {
40+
const onSingleClick = jest.fn();
41+
const latency = 150;
42+
const { getByText } = render(
43+
<Button onSingleClick={onSingleClick} latency={latency} />
44+
);
45+
46+
fireEvent.click(getByText(/Click Me/i));
47+
48+
await new Promise(r => setTimeout(r, latency));
49+
50+
expect(onSingleClick).toHaveBeenCalledTimes(1);
51+
});
52+
53+
test('calls "onDoubleClick" callback with custom latency', async () => {
54+
const onSingleClick = jest.fn();
55+
const latency = 150;
56+
const { getByText } = render(
57+
<Button onSingleClick={onSingleClick} latency={latency} />
58+
);
59+
60+
fireEvent.click(getByText(/Click Me/i));
61+
62+
await new Promise(r => setTimeout(r, latency));
63+
64+
expect(onSingleClick).toHaveBeenCalledTimes(1);
65+
});
66+
67+
test('calls "onSingleClick" callback consecutively outside of latency window', async () => {
68+
const onSingleClick = jest.fn();
69+
const onDoubleClick = jest.fn();
70+
const latency = 150;
71+
const { getByText } = render(
72+
<Button
73+
onSingleClick={onSingleClick}
74+
onDoubleClick={onDoubleClick}
75+
latency={latency}
76+
/>
77+
);
78+
79+
fireEvent.click(getByText(/Click Me/i));
80+
await new Promise(r => setTimeout(r, latency * 2));
81+
fireEvent.click(getByText(/Click Me/i));
82+
await new Promise(r => setTimeout(r, latency * 2));
83+
84+
expect(onSingleClick).toHaveBeenCalledTimes(2);
85+
expect(onDoubleClick).toHaveBeenCalledTimes(0);
86+
});
87+
88+
test('single click without onSingleClick handler', async () => {
89+
const { getByText } = render(<Button />);
90+
91+
fireEvent.click(getByText(/Click Me/i));
92+
await new Promise(r => setTimeout(r, 300));
93+
94+
fireEvent.click(getByText(/Click Me/i));
95+
await new Promise(r => setTimeout(r, 300));
96+
});
97+
98+
test('double click without onDoubleClick handler', async () => {
99+
const { getByText } = render(<Button />);
100+
101+
fireEvent.click(getByText(/Click Me/i));
102+
fireEvent.click(getByText(/Click Me/i));
103+
await new Promise(r => setTimeout(r, 300));
104+
});

0 commit comments

Comments
 (0)