Skip to content

Commit a604f47

Browse files
committed
Adds tests
1 parent 08db7a3 commit a604f47

File tree

4 files changed

+74
-6
lines changed

4 files changed

+74
-6
lines changed

package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"@testing-library/jest-dom": "^4.2.4",
77
"@testing-library/react": "^9.3.2",
88
"@testing-library/user-event": "^7.1.2",
9+
"jest-fetch-mock": "^3.0.3",
910
"normalize.css": "^8.0.1",
1011
"react": "^16.13.1",
1112
"react-dom": "^16.13.1",
@@ -33,5 +34,6 @@
3334
"last 1 firefox version",
3435
"last 1 safari version"
3536
]
36-
}
37+
},
38+
"devDependencies": {}
3739
}

src/App.test.js

+45-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,49 @@
11
import React from 'react';
2-
import { render } from '@testing-library/react';
2+
import { render, screen } from '@testing-library/react';
3+
import userEvent from '@testing-library/user-event';
4+
import { MemoryRouter } from 'react-router';
5+
import fetchMock from 'jest-fetch-mock';
36
import App from './App';
7+
import mockResponse from './__mocks__/subreddit-reactjs-response.json';
48

5-
test('renders learn react link', () => {
6-
const { getByText } = render(<App />);
7-
const linkElement = getByText(/learn react/i);
8-
expect(linkElement).toBeInTheDocument();
9+
fetchMock.enableMocks();
10+
11+
function setup() {
12+
return render(
13+
<MemoryRouter>
14+
<App />
15+
</MemoryRouter>
16+
);
17+
}
18+
19+
describe('Header', () => {
20+
test('"How it works" link points to the correct page', () => {
21+
setup();
22+
23+
const link = screen.getByRole('link', { name: /how it works/i });
24+
userEvent.click(link);
25+
26+
expect(
27+
screen.getByRole('heading', { name: /how it works/i })
28+
).toBeInTheDocument();
29+
});
30+
});
31+
32+
describe('Subreddit form', () => {
33+
test('loads posts and renders them on the page', async () => {
34+
fetch.once(JSON.stringify(mockResponse));
35+
setup();
36+
37+
const subredditInput = screen.getByLabelText('r /');
38+
userEvent.type(subredditInput, 'reactjs');
39+
40+
const submitButton = screen.getByRole('button', { name: /search/i });
41+
userEvent.click(submitButton);
42+
43+
const loadingMessage = screen.getByText(/is loading/i);
44+
expect(loadingMessage).toBeInTheDocument();
45+
46+
expect(await screen.findByText(/Number of top posts: 25/i)).toBeInTheDocument();
47+
expect(fetch).toHaveBeenCalledWith('https://www.reddit.com/r/reactjs/top.json');
48+
});
949
});

src/__mocks__/subreddit-reactjs-response.json

+1
Large diffs are not rendered by default.

yarn.lock

+25
Original file line numberDiff line numberDiff line change
@@ -3272,6 +3272,13 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
32723272
safe-buffer "^5.0.1"
32733273
sha.js "^2.4.8"
32743274

3275+
cross-fetch@^3.0.4:
3276+
version "3.0.5"
3277+
resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.5.tgz#2739d2981892e7ab488a7ad03b92df2816e03f4c"
3278+
integrity sha512-FFLcLtraisj5eteosnX1gf01qYDCOc4fDy0+euOt8Kn9YBY2NtXL/pCoYPavw24NIQkQqm5ZOLsGD5Zzj0gyew==
3279+
dependencies:
3280+
node-fetch "2.6.0"
3281+
32753282
cross-spawn@7.0.1:
32763283
version "7.0.1"
32773284
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14"
@@ -5934,6 +5941,14 @@ jest-environment-node@^24.9.0:
59345941
jest-mock "^24.9.0"
59355942
jest-util "^24.9.0"
59365943

5944+
jest-fetch-mock@^3.0.3:
5945+
version "3.0.3"
5946+
resolved "https://registry.yarnpkg.com/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz#31749c456ae27b8919d69824f1c2bd85fe0a1f3b"
5947+
integrity sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==
5948+
dependencies:
5949+
cross-fetch "^3.0.4"
5950+
promise-polyfill "^8.1.3"
5951+
59375952
jest-get-type@^24.9.0:
59385953
version "24.9.0"
59395954
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e"
@@ -7023,6 +7038,11 @@ no-case@^3.0.3:
70237038
lower-case "^2.0.1"
70247039
tslib "^1.10.0"
70257040

7041+
node-fetch@2.6.0:
7042+
version "2.6.0"
7043+
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
7044+
integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
7045+
70267046
node-forge@0.9.0:
70277047
version "0.9.0"
70287048
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579"
@@ -8472,6 +8492,11 @@ promise-inflight@^1.0.1:
84728492
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
84738493
integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
84748494

8495+
promise-polyfill@^8.1.3:
8496+
version "8.1.3"
8497+
resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.1.3.tgz#8c99b3cf53f3a91c68226ffde7bde81d7f904116"
8498+
integrity sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==
8499+
84758500
promise@^8.0.3:
84768501
version "8.1.0"
84778502
resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e"

0 commit comments

Comments
 (0)