Skip to content

Commit 7285595

Browse files
Enable unit tests for the frontend (#57)
1 parent 7154aab commit 7285595

File tree

9 files changed

+127
-5
lines changed

9 files changed

+127
-5
lines changed

.eslintrc.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"plugins": [
1515
"react"
1616
],
17+
"ignorePatterns": ["**/src/tests/*"],
1718
"rules": {
1819
"react/jsx-filename-extension": [
1920
1,

.github/workflows/rpe_test.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ jobs:
9898
- name: Run pytest on ${{ matrix.os }}
9999
if: ${{ matrix.os != 'ubuntu-22.04' }}
100100
run: python3 -m pytest
101+
102+
- name: Run frontend unit test only on ubuntu-latest
103+
run: |
104+
npm test
101105
102106
publish:
103107
needs: build

babel.config.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module.exports = {
2+
presets: [
3+
'@babel/preset-env',
4+
['@babel/preset-react', { runtime: 'automatic' }],
5+
],
6+
};

jest.config.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module.exports = {
2+
moduleNameMapper: {
3+
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
4+
'<rootDir>/__mocks__/fileMock.js',
5+
'\\.(css|less)$': 'identity-obj-proxy',
6+
},
7+
testEnvironment: 'jsdom',
8+
};

package.json

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"scripts": {
88
"start": "webpack --mode development && electron . --development",
99
"build": "webpack --mode production && electron .",
10-
"test": "echo \"Error: no test specified\" && exit 1",
10+
"test": "jest src/tests",
1111
"postinstall": "electron-builder install-app-deps",
1212
"pack": "electron-builder --dir",
1313
"dist": "pyinstaller --distpath backend --workpath dist -y --clean -n restapi_server.exe --onefile backend/restapi_server.py && webpack && electron-builder"
@@ -75,18 +75,26 @@
7575
"license": "MIT",
7676
"devDependencies": {
7777
"@babel/core": "^7.23.9",
78-
"@babel/preset-env": "^7.23.9",
79-
"@babel/preset-react": "^7.23.3",
78+
"@babel/preset-env": "^7.24.4",
79+
"@babel/preset-react": "^7.24.1",
80+
"@testing-library/jest-dom": "^6.4.2",
81+
"@testing-library/react": "^14.3.0",
82+
"@testing-library/user-event": "^14.5.2",
83+
"babel-jest": "^29.7.0",
8084
"babel-loader": "^9.1.3",
8185
"css-loader": "^6.10.0",
86+
"electron": "^28.2.2",
8287
"electron-builder": "^24.13.3",
8388
"eslint": "^8.57.0",
8489
"eslint-config-airbnb": "^19.0.4",
8590
"eslint-plugin-react": "^7.34.0",
8691
"html-webpack-plugin": "^5.6.0",
92+
"identity-obj-proxy": "^3.0.0",
93+
"jest": "^29.7.0",
94+
"jest-environment-jsdom": "^29.7.0",
95+
"react-test-renderer": "^18.2.0",
8796
"style-loader": "^3.3.4",
8897
"webpack": "^5.90.1",
89-
"electron": "^28.2.2",
9098
"webpack-cli": "^5.1.4"
9199
},
92100
"dependencies": {

src/components/DeviceList.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ function DeviceList({ devices, setDevice }) {
2828
<div className={getBaseName()}>
2929
<div className="dev-table-res">
3030
<div id="inner1">
31-
<label>Device:</label>
31+
<label htmlFor="deviceId">Device:</label>
3232
</div>
3333
<select
3434
id="deviceId"

src/tests/App.test.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import React from 'react';
2+
import renderer from 'react-test-renderer';
3+
import App from '../App';
4+
import { SelectionProvider } from '../SelectionProvider';
5+
import { SocTotalPowerProvider } from '../SOCTotalPowerProvider';
6+
7+
class ErrorBoundary extends React.Component {
8+
constructor(props) {
9+
super(props);
10+
this.state = { error: '' };
11+
}
12+
13+
componentDidCatch(error) {
14+
this.setState({ error: `${error.name}: ${error.message}` });
15+
}
16+
17+
render() {
18+
const { error } = this.state;
19+
if (error) {
20+
return (
21+
<div>{error}</div>
22+
);
23+
}
24+
return <>{this.props.children}</>;
25+
}
26+
}
27+
28+
it('Run main app', () => {
29+
const component = renderer.create(
30+
<ErrorBoundary>
31+
<SocTotalPowerProvider>
32+
<SelectionProvider>
33+
<App />
34+
</SelectionProvider>
35+
</SocTotalPowerProvider>
36+
</ErrorBoundary>,
37+
);
38+
});

src/tests/DeviceList.test.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import React from 'react';
2+
import { fireEvent, render, screen } from '@testing-library/react';
3+
import userEvent from '@testing-library/user-event';
4+
import '@testing-library/jest-dom';
5+
//import 'isomorphic-fetch';
6+
import DeviceList from '../components/DeviceList';
7+
import { SelectionProvider } from '../SelectionProvider';
8+
import { SocTotalPowerProvider } from '../SOCTotalPowerProvider';
9+
10+
describe('DeviceList', () => {
11+
it('default value', () => {
12+
const { getByLabelText } = render(
13+
<SocTotalPowerProvider>
14+
<SelectionProvider>
15+
<DeviceList devices={[{ id: 'test-dev', series: 'test' }]} setDevice={(dev) => {}} />
16+
</SelectionProvider>
17+
</SocTotalPowerProvider>,
18+
);
19+
expect(getByLabelText('Device:')).toBeInTheDocument();
20+
expect(screen.getByText('test-dev test')).toBeInTheDocument();
21+
expect(screen.getByRole('combobox')).toHaveValue('selectDev');
22+
});
23+
it('select device', async () => {
24+
const user = userEvent.setup();
25+
render(
26+
<SocTotalPowerProvider>
27+
<SelectionProvider>
28+
<DeviceList devices={[{ id: 'test-dev', series: 'test' }]} setDevice={(dev) => {}} />
29+
</SelectionProvider>
30+
</SocTotalPowerProvider>,
31+
);
32+
// todo, need rework compoment since fetch
33+
// await user.selectOptions(screen.getByRole('combobox'), 'test-dev');
34+
// expect(screen.getByRole('option', { name: 'test-dev test' }).selected).toBe(true);
35+
});
36+
});

src/tests/FpgaCell.test.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import React from 'react';
2+
import { render, screen } from '@testing-library/react';
3+
import '@testing-library/jest-dom';
4+
import FpgaCell from '../components/FpgaCell';
5+
import { SelectionProvider } from '../SelectionProvider';
6+
import { SocTotalPowerProvider } from '../SOCTotalPowerProvider';
7+
8+
describe('FpgaCell', () => {
9+
it('init', () => {
10+
const component = render(
11+
<SocTotalPowerProvider>
12+
<SelectionProvider>
13+
<FpgaCell power={0} powerWarm={0} powerErr={0} title="test" />
14+
</SelectionProvider>
15+
</SocTotalPowerProvider>,
16+
);
17+
expect(screen.getByText('test')).toBeInTheDocument();
18+
expect(component.container.getElementsByClassName('error').length).toBe(1);
19+
expect(component.container.getElementsByClassName('clickable').length).toBe(1);
20+
});
21+
});

0 commit comments

Comments
 (0)