Skip to content

Commit 610d93c

Browse files
authored
Add Front-End Code Coverage with Jest and Backend PyTests for BRAM API Endpoints (#153)
* adding the lines to upload the npm coverage report * added the necessary packages to run the npm test * Deleted App.test.js as it's no longer needed * updating rpe_test.yml to include front-end test coverage using npm and Codecov * doing changes for codecov > pytests and npm tests * PyTests for BRAM API endpoints * adding necessary packages and changes in config files * doing changres in jest.config.js
1 parent a31e418 commit 610d93c

File tree

6 files changed

+91
-58
lines changed

6 files changed

+91
-58
lines changed

.github/workflows/rpe_test.yml

+9-5
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ jobs:
243243
- name: Install dependencies
244244
run: |
245245
pip install -r requirements.txt
246+
npm install
246247
247248
- name: Run pytest with Codecov
248249
run: python3 -m pytest --cov=. --cov-report=term-missing
@@ -252,9 +253,12 @@ jobs:
252253
with:
253254
token: ${{ secrets.CODECOV_TOKEN }}
254255
slug: os-fpga/rapid_power_estimator
255-
256-
257-
258-
259-
260256

257+
- name: Run npm test with Codecov
258+
run: npm test
259+
260+
- name: Upload results to Codecov
261+
uses: codecov/codecov-action@v4
262+
with:
263+
token: ${{ secrets.CODECOV_TOKEN }}
264+
slug: os-fpga/rapid_power_estimator

babel.config.js

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
module.exports = {
2-
presets: [
3-
'@babel/preset-env',
4-
['@babel/preset-react', { runtime: 'automatic' }],
5-
],
2+
presets: ['@babel/preset-env', '@babel/preset-react'],
3+
env: {
4+
test: {
5+
plugins: ['istanbul']
6+
}
7+
}
68
};

jest.config.js

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
11
module.exports = {
22
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',
3+
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '<rootDir>/__mocks__/fileMock.js',
54
'\\.(css|less)$': 'identity-obj-proxy',
65
},
76
testEnvironment: 'jsdom',
7+
8+
collectCoverage: true,
9+
collectCoverageFrom: [
10+
"src/**/*.{js,jsx}",
11+
"!src/**/*.test.{js,jsx}",
12+
"!src/**/index.{js,jsx}",
13+
],
14+
coverageReporters: ['text', 'lcov'],
15+
coverageDirectory: "coverage",
816
};

package.json

+7-6
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
"scripts": {
88
"start": "webpack --mode development && electron . --development",
99
"build": "webpack --mode production && electron .",
10-
"test": "jest src/tests",
10+
"test": "jest --coverage --coverageDirectory=coverage",
1111
"postinstall": "electron-builder install-app-deps",
1212
"pack": "electron-builder --dir",
13-
"dist": "pyinstaller --distpath backend --workpath dist -y --clean -n restapi_server.exe --onefile backend/restapi_server.py && webpack --mode production && electron-builder -p never"
13+
"dist": "pyinstaller --distpath backend --workpath dist -y --clean -n restapi_server.exe --onefile backend/restapi_server.py && webpack --mode production && electron-builder -p never"
1414
},
1515
"build": {
1616
"appId": "org.rapidsilicon.rapid_power_estimator",
@@ -86,11 +86,12 @@
8686
"@babel/core": "^7.23.9",
8787
"@babel/preset-env": "^7.24.4",
8888
"@babel/preset-react": "^7.24.1",
89-
"@testing-library/jest-dom": "^6.4.2",
90-
"@testing-library/react": "^14.3.0",
89+
"@testing-library/jest-dom": "^6.5.0",
90+
"@testing-library/react": "^14.3.1",
9191
"@testing-library/user-event": "^14.5.2",
9292
"babel-jest": "^29.7.0",
9393
"babel-loader": "^9.1.3",
94+
"babel-plugin-istanbul": "^7.0.0",
9495
"css-loader": "^6.10.0",
9596
"electron": "^28.2.2",
9697
"electron-builder": "^24.13.3",
@@ -101,15 +102,15 @@
101102
"identity-obj-proxy": "^3.0.0",
102103
"jest": "^29.7.0",
103104
"jest-environment-jsdom": "^29.7.0",
104-
"react-test-renderer": "^18.2.0",
105+
"react-test-renderer": "^18.3.1",
105106
"style-loader": "^3.3.4",
106107
"webpack": "^5.90.1",
107108
"webpack-cli": "^5.1.4"
108109
},
109110
"dependencies": {
110111
"antd": "^5.15.4",
111-
"electron-store": "^8.2.0",
112112
"electron-log": "^5.1.2",
113+
"electron-store": "^8.2.0",
113114
"moment": "^2.30.1",
114115
"prop-types": "^15.8.1",
115116
"react": "^18.2.0",

src/tests/App.test.js

-41
This file was deleted.

tests/api_tests/test_bram_api.py

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import pytest
2+
from flask import Flask
3+
from flask.testing import FlaskClient
4+
from unittest.mock import patch
5+
from submodule.rs_device_manager import RsDeviceManager
6+
from submodule.rs_device_resources import DeviceNotFoundException, BramNotFoundException
7+
from api.bram import bram_api
8+
9+
@pytest.fixture
10+
def client() -> FlaskClient:
11+
app = Flask(__name__)
12+
app.register_blueprint(bram_api)
13+
return app.test_client()
14+
15+
# Test for BramsApi GET
16+
@patch('submodule.rs_device_manager.RsDeviceManager.get_instance')
17+
def test_get_brams(mock_get_instance, client):
18+
mock_device = mock_get_instance.return_value.get_device.return_value
19+
mock_bram_module = mock_device.get_module.return_value
20+
mock_bram_module.get_all.return_value = []
21+
22+
response = client.get('/devices/test-device/bram')
23+
24+
assert response.status_code == 200
25+
assert response.json == []
26+
27+
# Test for BramApi GET
28+
@patch('submodule.rs_device_manager.RsDeviceManager.get_instance')
29+
def test_get_bram(mock_get_instance, client):
30+
mock_device = mock_get_instance.return_value.get_device.return_value
31+
mock_bram_module = mock_device.get_module.return_value
32+
mock_bram_module.get.return_value = {}
33+
34+
response = client.get('/devices/test-device/bram/0')
35+
36+
assert response.status_code == 200
37+
38+
# Test for BramApi DELETE
39+
@patch('submodule.rs_device_manager.RsDeviceManager.get_instance')
40+
@patch('submodule.rs_project.RsProjectManager.get_instance')
41+
def test_delete_bram(mock_get_instance, mock_project_mgr, client):
42+
mock_device = mock_get_instance.return_value.get_device.return_value
43+
mock_bram_module = mock_device.get_module.return_value
44+
45+
response = client.delete('/devices/test-device/bram/0')
46+
47+
assert response.status_code == 204
48+
49+
# Test for BramConsumptionApi GET
50+
@patch('submodule.rs_device_manager.RsDeviceManager.get_instance')
51+
def test_get_bram_consumption(mock_get_instance, client):
52+
mock_device = mock_get_instance.return_value.get_device.return_value
53+
mock_bram_module = mock_device.get_module.return_value
54+
mock_bram_module.get_resources.return_value = (10, 20, 10, 20)
55+
mock_bram_module.get_power_consumption.return_value = (0.5, 0.5)
56+
57+
response = client.get('/devices/test-device/bram/consumption')
58+
59+
assert response.status_code == 200

0 commit comments

Comments
 (0)