Skip to content

Commit ad495fc

Browse files
authored
Merge pull request #15 from dagda1/pc/add-tests
add some basic testing for useAsync
2 parents bfda97f + 12a4292 commit ad495fc

File tree

6 files changed

+353
-30
lines changed

6 files changed

+353
-30
lines changed

package.json

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,29 @@
5555
"singleQuote": true,
5656
"trailingComma": "es5"
5757
},
58+
"jest": {
59+
"globals": {
60+
"ts-jest": {
61+
"tsConfig": "tsconfig.test.json"
62+
}
63+
},
64+
"setupFilesAfterEnv": [
65+
"@testing-library/jest-dom/extend-expect"
66+
]
67+
},
5868
"devDependencies": {
69+
"@testing-library/jest-dom": "^4.1.2",
70+
"@testing-library/react": "^9.3.0",
71+
"@testing-library/react-hooks": "^3.1.0",
5972
"@types/jest": "^24.0.12",
60-
"@types/react": "^16.8.16",
61-
"@types/react-dom": "^16.8.4",
73+
"@types/react": "^16.9.9",
74+
"@types/react-dom": "^16.9.2",
6275
"husky": "^2.2.0",
6376
"prettier": "^1.17.0",
6477
"pretty-quick": "^1.10.0",
65-
"react": "^16.8.6",
66-
"react-dom": "^16.8.6",
78+
"react": "^16.10.2",
79+
"react-dom": "^16.10.2",
80+
"react-test-renderer": "^16.10.2",
6781
"tsdx": "^0.7.2",
6882
"tslib": "^1.9.3",
6983
"typescript": "^3.4.5"

test/test.tsx

Lines changed: 0 additions & 6 deletions
This file was deleted.

test/useAsync.test.ts

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import { useAsync } from '../src';
2+
import { renderHook } from '@testing-library/react-hooks';
3+
4+
interface StarwarsHero {
5+
name: string;
6+
}
7+
8+
export const generateMockResponseData = (amount: number = 5): StarwarsHero[] =>
9+
[...Array(amount).keys()].map(n => ({
10+
id: n + 1,
11+
name: `Starwars Hero ${n + 1}`,
12+
}));
13+
14+
describe('useAync', () => {
15+
const fakeResults = generateMockResponseData();
16+
17+
it('should have a useAsync hook', () => {
18+
expect(useAsync).toBeDefined();
19+
});
20+
21+
it('should resolve a successful request', async () => {
22+
const onSuccess = jest.fn();
23+
const onError = jest.fn();
24+
25+
const { result, waitForNextUpdate } = renderHook(() =>
26+
useAsync(
27+
async () => {
28+
return Promise.resolve(fakeResults);
29+
},
30+
[],
31+
{
32+
onSuccess: () => onSuccess(),
33+
onError: () => onError(),
34+
}
35+
)
36+
);
37+
38+
expect(result.current.loading).toBe(true);
39+
40+
await waitForNextUpdate();
41+
42+
expect(result.current.result).toEqual(fakeResults);
43+
expect(result.current.loading).toBe(false);
44+
expect(result.current.error).toBeUndefined();
45+
expect(onSuccess).toHaveBeenCalled();
46+
expect(onError).not.toHaveBeenCalled();
47+
});
48+
49+
it('should set error detail for unsuccessful request', async () => {
50+
const onSuccess = jest.fn();
51+
const onError = jest.fn();
52+
53+
const { result, waitForNextUpdate } = renderHook(() =>
54+
useAsync(
55+
async () => {
56+
throw new Error('something went wrong');
57+
},
58+
[],
59+
{
60+
onSuccess: () => onSuccess(),
61+
onError: () => onError(),
62+
}
63+
)
64+
);
65+
66+
await waitForNextUpdate();
67+
68+
expect(result.current.error).toBeDefined();
69+
expect(result.current.error!.message).toBe('something went wrong');
70+
expect(result.current.loading).toBe(false);
71+
expect(result.current.result).toBeUndefined();
72+
expect(onSuccess).not.toHaveBeenCalled();
73+
expect(onError).toHaveBeenCalled();
74+
});
75+
});

tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"include": ["src", "types"],
3+
"exclude": ["test"],
34
"compilerOptions": {
45
"target": "es5",
56
"module": "esnext",

tsconfig.test.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"extends": "./tsconfig.json",
3+
"compilerOptions": {
4+
"downlevelIteration": true
5+
},
6+
"include": ["src/**/*.ts", "test/**/*.ts"]
7+
}

0 commit comments

Comments
 (0)