Skip to content

Commit 3a3e297

Browse files
jasnooMarkTeetsminzo-kimyuanjackie1
committed
Updated RTL front end unit tests and removed Enzyme tests
Co-authored-by: Mark Teets <[email protected]> Co-authored-by: Minzo Kim <[email protected]> Co-authored-by: Jackie Yuan <[email protected]>
1 parent 403877e commit 3a3e297

37 files changed

+769
-682
lines changed

jest.config.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ module.exports = {
66
transform: {
77
'^.+\\.(js|ts|tsx)$': 'ts-jest',
88
},
9-
testPathIgnorePatterns: ['www', './src/backend/__tests__/ignore'],
10-
coveragePathIgnorePatterns: ['/src/backend/__tests__/ignore/'],
9+
testPathIgnorePatterns: ['www', './src/backend/__tests__/ignore', './src/app/__tests__enzyme/ignore'],
10+
coveragePathIgnorePatterns: ['/src/backend/__tests__/ignore/', '/src/app/__tests__enzyme/ignore'],
1111
transformIgnorePatterns: ['/node_modules/(?!d3|d3-array|internmap|delaunator|robust-predicates)'],
1212
testRegex: '(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$',
1313
moduleFileExtensions: ['ts', 'tsx', 'js'],

package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
"test": "jest --verbose --coverage",
1010
"test-backend": "jest --verbose --coverage src/backend",
1111
"test-frontend": "jest --verbose --coverage src/app",
12-
"test-jn": "jest --verbose --coverage src/app/__tests__jn",
13-
"test-zo": "jest --verbose --coverage src/app/__tests__zo",
1412
"test-on": "./node_modules/.bin/jest $1",
1513
"docker-test-lint": "eslint --ext .js --ext .jsx src",
1614
"docs": "typedoc --json docs --inputFiles src/app --inputFiles src/backend --readme docs/readme.md",

src/app/__tests__/ActionContainer.test.tsx

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,10 @@
11
/* eslint-disable @typescript-eslint/no-explicit-any */
22
/* eslint-disable react/jsx-filename-extension */
3-
4-
import { shallow, configure } from 'enzyme';
53
import React from 'react';
6-
import Adapter from 'enzyme-adapter-react-16';
4+
import { render, screen, fireEvent } from '@testing-library/react';
5+
import '@testing-library/jest-dom/extend-expect';
76
import ActionContainer from '../containers/ActionContainer';
87
import { useStoreContext } from '../store';
9-
import { emptySnapshots } from '../actions/actions';
10-
import Action from '../components/Action';
11-
import RouteDescription from '../components/RouteDescription';
12-
13-
configure({ adapter: new (Adapter as any)() });
148

159
const state = {
1610
tabs: {
@@ -112,33 +106,44 @@ const state = {
112106
};
113107

114108
const dispatch = jest.fn();
115-
109+
const resetSlider = jest.fn();
110+
jest.spyOn(React, 'useEffect').mockImplementation(() => jest.fn());
116111
jest.mock('../store');
117112
useStoreContext.mockImplementation(() => [state, dispatch]);
118113

119-
let wrapper;
120-
121-
// actionView={true} must be passed in to <ActionContainer /> in beforeEach() to deal with new
122-
// conditional rendering in ActionContainer that shows/hides time-travel functionality
114+
const MockRouteDescription = jest.fn();
115+
jest.mock('../components/RouteDescription', () => () => {
116+
MockRouteDescription();
117+
return <div>MockRouteDescription</div>;
118+
});
123119

124-
beforeEach(() => {
125-
wrapper = shallow(<ActionContainer actionView={true} />);
126-
// wrapper2 = shallow(<RouteDescription />);
127-
useStoreContext.mockClear();
128-
dispatch.mockClear();
120+
const MockSwitchApp = jest.fn();
121+
jest.mock('../components/SwitchApp', () => () => {
122+
MockSwitchApp();
123+
return <div>MockSwitchApp</div>;
129124
});
130125

131-
describe('testing the emptySnapshot button', () => {
132-
test('emptySnapshot button should dispatch action upon click', () => {
133-
wrapper.find('.empty-button').simulate('click');
134-
expect(dispatch.mock.calls.length).toBe(1);
126+
describe('unit testing for ActionContainer', () => {
127+
beforeEach(() => {
128+
useStoreContext.mockClear();
129+
dispatch.mockClear();
130+
render(<ActionContainer actionView={true} />);
131+
});
132+
133+
test('Expect top arrow to be rendered', () => {
134+
expect(screen.getByRole('complementary')).toBeInTheDocument();
135135
});
136-
test('emptying snapshots should send emptySnapshot action to dispatch', () => {
137-
wrapper.find('.empty-button').simulate('click');
138-
expect(dispatch.mock.calls[0][0]).toEqual(emptySnapshots());
136+
137+
test('Expect RouteDescription to be rendered', () => {
138+
expect(screen.getAllByText('MockRouteDescription')).toHaveLength(2);
139139
});
140-
});
141140

142-
test('number of RouteDescription components should reflect number of unique routes', () => {
143-
expect(wrapper.find(RouteDescription).length).toBe(2);
141+
test('Expect SwitchApp to be rendered', () => {
142+
expect(screen.getByText('MockSwitchApp')).toBeInTheDocument();
143+
});
144+
145+
test('Click works on clear button', async () => {
146+
fireEvent.click(screen.getAllByRole('button')[0]);
147+
await expect(dispatch).toHaveBeenCalledTimes(1);
148+
});
144149
});
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import React from 'react';
2+
import { render, screen, fireEvent } from '@testing-library/react';
3+
import userEvent from '@testing-library/user-event';
4+
import '@testing-library/jest-dom/extend-expect'; // needed this to extend the jest-dom assertions (ex toHaveTextContent)
5+
import { TextEncoder } from 'util';
6+
global.TextEncoder = TextEncoder;
7+
import ButtonsContainer from '../containers/ButtonsContainer';
8+
import { useStoreContext } from '../store';
9+
10+
// const { Steps } = require('intro.js-react');
11+
jest.mock('../store');
12+
13+
global.URL.createObjectURL = jest.fn(() => 'https://pdf.com');
14+
global.URL.revokeObjectURL = jest.fn();
15+
16+
const fileDownload = {
17+
href: jest.fn(),
18+
};
19+
20+
const URL = { revokeObjectURL: jest.fn() };
21+
// @ts-ignore
22+
// jest.spyOn(document, 'createElement').mockImplementation(() => fileDownload);
23+
24+
describe('Unit testing for ButtonContainer', () => {
25+
beforeEach;
26+
27+
const state = {
28+
tabs: {
29+
87: {
30+
snapshots: [1, 2, 3, 4],
31+
sliderIndex: 0,
32+
viewIndex: -1,
33+
mode: {
34+
paused: false,
35+
locked: false,
36+
persist: false,
37+
},
38+
},
39+
},
40+
currentTab: 87,
41+
};
42+
43+
const currentTab = state.tabs[state.currentTab];
44+
const dispatch = jest.fn();
45+
const exportHandler = jest.fn().mockImplementation(() => 'clicked');
46+
const importHandler = jest.fn();
47+
const fileDownload = jest.fn();
48+
49+
useStoreContext.mockImplementation(() => [state, dispatch]);
50+
51+
beforeEach(() => {
52+
dispatch.mockClear();
53+
useStoreContext.mockClear();
54+
currentTab.mode = {
55+
paused: false,
56+
persist: false,
57+
};
58+
});
59+
60+
describe('When button container is loaded', () => {
61+
test('should have 5 buttons ', () => {
62+
render(<ButtonsContainer />);
63+
expect(screen.getAllByRole('button')).toHaveLength(5);
64+
expect(screen.getAllByRole('button')[0]).toHaveTextContent('Lock');
65+
expect(screen.getAllByRole('button')[1]).toHaveTextContent('Split');
66+
expect(screen.getAllByRole('button')[2]).toHaveTextContent('Download');
67+
expect(screen.getAllByRole('button')[3]).toHaveTextContent('Upload');
68+
expect(screen.getAllByRole('button')[4]).toHaveTextContent('How to use');
69+
});
70+
});
71+
72+
describe('When view is unlock', () => {
73+
test('Button should show as unlocked', () => {
74+
state.tabs['87'].mode.paused = true;
75+
render(<ButtonsContainer />);
76+
expect(screen.getAllByRole('button')[0]).toHaveTextContent('Unlock');
77+
});
78+
});
79+
80+
describe('Upload/Download', () => {
81+
test('Clicking upload and download buttons', async () => {
82+
render(<ButtonsContainer />);
83+
fireEvent.click(screen.getAllByRole('button')[2]);
84+
fireEvent.click(screen.getAllByRole('button')[3]);
85+
expect(screen.getAllByRole('button')[2]).toBeInTheDocument();
86+
expect(screen.getAllByRole('button')[3]).toBeInTheDocument();
87+
});
88+
});
89+
});

src/app/__tests__jn/ErrorContainer.test.tsx renamed to src/app/__tests__/ErrorContainer.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from 'react';
2-
import { render, screen, fireEvent } from '@testing-library/react';
2+
import { render, screen } from '@testing-library/react';
33
import '@testing-library/jest-dom/extend-expect'; // needed this to extend the jest-dom assertions (ex toHaveTextContent)
44
import ErrorContainer from '../containers/ErrorContainer';
55
import { useStoreContext } from '../store';

src/app/__tests__jn/Loader.test.tsx renamed to src/app/__tests__/Loader.test.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,11 @@ describe('unit testing for Loader.tsx', () => {
1010
});
1111

1212
test('renders a fail icon', () => {
13-
// render(<Loader loading={false} result={false} />);
1413
const { container } = render(<Loader loading={false} result={false} />);
1514
expect(container.getElementsByClassName('fail').length).toBe(1);
1615
});
1716

1817
test('renders a check icon', () => {
19-
// render(<Loader loading={false} result={true} />);
2018
const { container } = render(<Loader loading={false} result={true} />);
2119
expect(container.getElementsByClassName('check').length).toBe(1);
2220
});
Lines changed: 77 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,47 @@
1-
/* eslint-disable @typescript-eslint/no-explicit-any */
2-
/* eslint-disable @typescript-eslint/no-empty-function */
3-
/* eslint-disable @typescript-eslint/no-var-requires */
4-
/* eslint-disable react/jsx-filename-extension */
5-
import { shallow, configure } from 'enzyme';
61
import React from 'react';
7-
import Adapter from 'enzyme-adapter-react-16';
2+
import { render, screen } from '@testing-library/react';
83
import MainContainer from '../containers/MainContainer';
94
import { useStoreContext } from '../store';
105

11-
import ActionContainer from '../containers/ActionContainer';
12-
import StateContainer from '../containers/StateContainer';
13-
import TravelContainer from '../containers/TravelContainer';
14-
import ButtonsContainer from '../containers/ButtonsContainer';
15-
import ErrorContainer from '../containers/ErrorContainer';
16-
176
const chrome = require('sinon-chrome');
187

19-
configure({ adapter: new (Adapter as any)() });
8+
const mockActionContainer = jest.fn();
9+
jest.mock('../containers/ActionContainer', () => (props) => {
10+
mockActionContainer(props);
11+
return <div>mockActionContainer</div>;
12+
});
13+
14+
const mockStateContainer = jest.fn();
15+
jest.mock('../containers/StateContainer', () => (props) => {
16+
mockStateContainer(props);
17+
return <div>mockStateContainer</div>;
18+
});
19+
20+
const mockTravelContainer = jest.fn();
21+
jest.mock('../containers/TravelContainer', () => (props) => {
22+
mockTravelContainer(props);
23+
return <div>mockTravelContainer</div>;
24+
});
25+
const mockButtonsContainer = jest.fn();
26+
jest.mock('../containers/ButtonsContainer', () => (props) => {
27+
mockButtonsContainer(props);
28+
return <div>mockButtonsContainer</div>;
29+
});
30+
const mockErrorContainer = jest.fn();
31+
jest.mock('../containers/ErrorContainer', () => (props) => {
32+
mockErrorContainer(props);
33+
return <div>mockErrorContainer</div>;
34+
});
2035

2136
const state = {
2237
tabs: {},
2338
currentTab: null,
2439
};
25-
2640
const dispatch = jest.fn();
2741
jest.mock('../../../node_modules/intro.js/introjs.css', () => jest.fn());
2842
jest.mock('../store');
2943
useStoreContext.mockImplementation(() => [state, dispatch]);
3044

31-
let wrapper;
3245
global.chrome = chrome;
3346
const port = {
3447
onMessage: {
@@ -40,21 +53,42 @@ const port = {
4053
};
4154
chrome.runtime.connect.returns(port);
4255

43-
beforeEach(() => {
44-
wrapper = shallow(<MainContainer />);
45-
useStoreContext.mockClear();
46-
dispatch.mockClear();
56+
describe('With no snapshots, should not render any containers', () => {
57+
test('With no snapshots, ErrorContainer should render', () => {
58+
render(<MainContainer />);
59+
expect(screen.getByText('mockErrorContainer')).toBeInTheDocument();
60+
expect(mockErrorContainer).toBeCalledTimes(1);
61+
const error = screen.queryByText('mockErrorContainer');
62+
expect(error).not.toBeNull();
63+
});
64+
test('With no snapshots, ActionContainer should not render', () => {
65+
render(<MainContainer />);
66+
const ActionContainer = screen.queryByText('mockActionContainer');
67+
expect(ActionContainer).not.toBeInTheDocument();
68+
});
69+
test('With no snapshots, StateContainer should not render', () => {
70+
render(<MainContainer />);
71+
const StateContainer = screen.queryByText('mockStateContainer');
72+
expect(StateContainer).toBeNull();
73+
});
74+
test('With no snapshots, TravelContainer should not render', () => {
75+
render(<MainContainer />);
76+
const TravelContainer = screen.queryByText('mockTravelContainer');
77+
expect(TravelContainer).toBeNull();
78+
});
79+
test('With no snapshots, ButtonsContainer should not render', () => {
80+
render(<MainContainer />);
81+
const ButtonsContainer = screen.queryByText('mockButtonsContainer');
82+
expect(ButtonsContainer).toBeNull();
83+
});
4784
});
4885

49-
describe('MainContainer rendering', () => {
50-
test('With no snapshots, should not render any containers', () => {
51-
expect(wrapper.find(ErrorContainer).length).toBe(1);
52-
expect(wrapper.find(ActionContainer).length).toBe(0);
53-
expect(wrapper.find(StateContainer).length).toBe(0);
54-
expect(wrapper.find(TravelContainer).length).toBe(0);
55-
expect(wrapper.find(ButtonsContainer).length).toBe(0);
56-
});
57-
test('With snapshots, should render all containers', () => {
86+
describe('With snapshots, should render all containers', () => {
87+
beforeEach(() => {
88+
render(<MainContainer />);
89+
useStoreContext.mockClear();
90+
dispatch.mockClear();
91+
mockErrorContainer.mockClear();
5892
state.currentTab = 87;
5993
state.tabs[87] = {
6094
snapshots: [{}],
@@ -67,11 +101,20 @@ describe('MainContainer rendering', () => {
67101
sliderIndex: 0,
68102
mode: {},
69103
};
70-
71-
wrapper = shallow(<MainContainer />);
72-
expect(wrapper.find(ActionContainer).length).toBe(1);
73-
expect(wrapper.find(StateContainer).length).toBe(1);
74-
expect(wrapper.find(TravelContainer).length).toBe(1);
75-
expect(wrapper.find(ButtonsContainer).length).toBe(1);
104+
});
105+
test('With snapshots, ErrorContainer should not render', () => {
106+
expect(mockErrorContainer).toBeCalledTimes(0);
107+
});
108+
test('With snapshots, ActionContainer should not render', () => {
109+
expect(screen.getByText('mockActionContainer')).toBeInTheDocument();
110+
});
111+
test('With snapshots, StateContainer should render', () => {
112+
expect(screen.getByText('mockStateContainer')).toBeInTheDocument();
113+
});
114+
test('With snapshots, TravelContainer should render', () => {
115+
expect(screen.getByText('mockTravelContainer')).toBeInTheDocument();
116+
});
117+
test('With snapshots, ButtonsContainer should render', () => {
118+
expect(screen.getByText('mockButtonsContainer')).toBeInTheDocument();
76119
});
77120
});

0 commit comments

Comments
 (0)