Skip to content

Commit af47de8

Browse files
authored
Merge pull request #88 from codebtech/chore/add-component-tests
Add new unit tests and refactor async expectations
2 parents daa8dcb + 0669ba6 commit af47de8

File tree

10 files changed

+712
-645
lines changed

10 files changed

+712
-645
lines changed

.github/workflows/js.yml

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,42 @@
11
name: JS lint & test
22
on:
3-
push:
4-
branches-ignore:
5-
- 'main-built'
3+
push:
4+
branches-ignore:
5+
- 'main-built'
66

77
jobs:
8-
js-lint-test:
9-
runs-on: ubuntu-latest
10-
steps:
11-
- uses: actions/checkout@v4
8+
js-lint-test:
9+
runs-on: ubuntu-latest
10+
steps:
11+
- uses: actions/checkout@v4
1212

13-
- name: Setup Node
14-
uses: actions/setup-node@v4
15-
with:
16-
node-version: 20.11
17-
cache: 'yarn'
13+
- name: Setup Node
14+
uses: actions/setup-node@v4
15+
with:
16+
node-version: 20.11
17+
cache: 'yarn'
1818

19-
- name: Install packages
20-
run: yarn install --immutable
19+
- name: Install packages
20+
run: yarn install --immutable
2121

22-
- name: JS lint
23-
run: yarn lint:js
22+
- name: JS lint
23+
run: yarn lint:js
2424

25-
- name: JS test
26-
run: yarn test:js
25+
- name: JS test
26+
run: yarn test:js
2727

28-
- name: Upload artifacts
29-
uses: actions/upload-artifact@v4
30-
if: always()
31-
with:
32-
name: js-report
33-
path: js-report/
34-
retention-days: 30
28+
- name: JS unit test coverage report
29+
uses: codecov/codecov-action@v4
30+
with:
31+
flags: jstests
32+
name: codecov-jsunit
33+
verbose: true
34+
token: ${{ secrets.CODECOV_TOKEN }}
35+
36+
- name: Upload artifacts
37+
uses: actions/upload-artifact@v4
38+
if: always()
39+
with:
40+
name: js-report
41+
path: js-report/
42+
retention-days: 30

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@ build-script.sh
1818
integration-coverage.xml
1919
unit-coverage.xml
2020
.idea/
21+
/coverage/

jest.config.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ module.exports = {
66
modulePathIgnorePatterns: ['<rootDir>/vendor/'],
77
testEnvironment: 'jsdom',
88
testPathIgnorePatterns: ['<rootDir>/tests/e2e/'],
9+
collectCoverage: true,
10+
coverageReporters: ['text', 'cobertura'],
911
};

package.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@
2727
"dependencies": {
2828
"@testing-library/user-event": "^14.5.2",
2929
"@wordpress/api-fetch": "^6.48.0",
30-
"@wordpress/components": "^27.0.0",
31-
"@wordpress/data": "^9.22.0",
32-
"@wordpress/dom-ready": "^3.52.0",
33-
"@wordpress/hooks": "^3.52.0",
34-
"@wordpress/i18n": "^4.52.0",
35-
"@wordpress/notices": "^4.20.0",
30+
"@wordpress/components": "^27.1.0",
31+
"@wordpress/data": "^9.23.0",
32+
"@wordpress/dom-ready": "^3.53.0",
33+
"@wordpress/hooks": "^3.53.0",
34+
"@wordpress/i18n": "^4.53.0",
35+
"@wordpress/notices": "^4.21.0",
3636
"dotenv": "^16.4.5",
3737
"react": "18.2.0",
3838
"react-dom": "18.2.0",
@@ -46,11 +46,11 @@
4646
"@testing-library/jest-dom": "^6.4.2",
4747
"@testing-library/react": "14.2.1",
4848
"@types/jest": "^29.5.12",
49-
"@types/node": "^20.11.24",
49+
"@types/node": "^20.11.25",
5050
"@types/react-syntax-highlighter": "^15.5.11",
5151
"@types/wordpress__components": "^23.0.11",
5252
"@wordpress/e2e-test-utils-playwright": "^0.21.0",
53-
"@wordpress/env": "^9.4.0",
53+
"@wordpress/env": "^9.5.0",
5454
"@wordpress/eslint-plugin": "^17.10.0",
5555
"@wordpress/scripts": "^27.4.0",
5656
"eslint": "^8.57.0",
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import Clipboard from '../Clipboard';
2+
import { render } from '@testing-library/react';
3+
4+
describe('Clipboard', () => {
5+
test('Clipboard function', async () => {
6+
const text = 'test clipboard';
7+
8+
const { getByLabelText } = render(<Clipboard text={text} />);
9+
const clipboardButton = getByLabelText('Copy to clipboard');
10+
11+
expect(clipboardButton).toBeInTheDocument();
12+
});
13+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { render, screen } from '@testing-library/react';
2+
import userEvent from '@testing-library/user-event';
3+
import SdkModal from '../SdkModal';
4+
5+
describe('SdkModal component', () => {
6+
test('should render modal correctly', async () => {
7+
const item = { name: 'Test Flag' };
8+
const closeSdkModal = jest.fn();
9+
render(<SdkModal item={item} closeSdkModal={closeSdkModal} />);
10+
11+
expect(
12+
screen.getByText(`SDK for feature flag: ${item.name}`)
13+
).toBeInTheDocument();
14+
15+
await userEvent.click(screen.getByLabelText('Close'));
16+
17+
expect(closeSdkModal).toHaveBeenCalled();
18+
});
19+
});
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { render, screen } from '@testing-library/react';
2+
import Snippet from '../Snippet';
3+
4+
describe('Snippet component', () => {
5+
it('renders without crashing', () => {
6+
const data = "console.log('Hello, World!')";
7+
const language = 'javascript';
8+
9+
render(<Snippet data={data} language={language} />);
10+
11+
expect(screen.getByText(/'Hello, World!'/)).toBeInTheDocument();
12+
});
13+
});
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { checkIfFlagExists } from './index';
2+
3+
describe('Function: checkIfFlagExists', () => {
4+
let flags;
5+
let flagName;
6+
7+
beforeEach(() => {
8+
flags = [
9+
{ id: 1, name: 'flag1', enabled: true },
10+
{ id: 2, name: 'flag2', enabled: false },
11+
{ id: 3, name: 'flag3', enabled: true },
12+
];
13+
14+
flagName = 'flag1';
15+
});
16+
17+
test('should return true if flag exists', async () => {
18+
const result = checkIfFlagExists(flags, flagName);
19+
expect(result).toBe(true);
20+
});
21+
22+
test('should return false if flag does not exist', async () => {
23+
flagName = 'nonExistentFlag';
24+
25+
const result = checkIfFlagExists(flags, flagName);
26+
expect(result).toBe(false);
27+
});
28+
29+
test('should return false when flags array is empty', async () => {
30+
flags = [];
31+
const result = checkIfFlagExists(flags, flagName);
32+
expect(result).toBe(false);
33+
});
34+
35+
test('should return false when flagName is empty', async () => {
36+
flagName = '';
37+
const result = checkIfFlagExists(flags, flagName);
38+
expect(result).toBe(false);
39+
});
40+
});

tests/e2e/feature-flags.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ test.describe('Feature flags', () => {
4848
expect(
4949
await page.getByLabel('Dismiss this notice').innerText()
5050
).toMatch(/Saved successfully!/);
51-
expect(
51+
await expect(
5252
page
5353
.locator('id=mr-feature-flag-item')
5454
.last()
@@ -66,13 +66,13 @@ test.describe('Feature flags', () => {
6666

6767
//Create another flag with same name should show error
6868
await AddNewFlagAndFill(page, 'testDuplicate');
69-
expect(page.getByText(ERROR_FLAG_EXISTS)).toBeVisible();
70-
expect(page.getByRole('button', { name: 'Save' })).toBeDisabled();
69+
await expect(page.getByText(ERROR_FLAG_EXISTS)).toBeVisible();
70+
await expect(page.getByRole('button', { name: 'Save' })).toBeDisabled();
7171

7272
//update flag name to be unique but still invalid
7373
await AddNewFlag(page, 'test duplicate');
74-
expect(page.getByText(ERROR_FLAG_INVALID)).toBeVisible();
75-
expect(page.getByRole('button', { name: 'Save' })).toBeDisabled();
74+
await expect(page.getByText(ERROR_FLAG_INVALID)).toBeVisible();
75+
await expect(page.getByRole('button', { name: 'Save' })).toBeDisabled();
7676

7777
expect(
7878
await page.getByLabel('Dismiss this notice').innerText()
@@ -90,7 +90,7 @@ test.describe('Feature flags', () => {
9090

9191
await OpenSdkModal(page);
9292

93-
expect(
93+
await expect(
9494
page.getByRole('heading', {
9595
name: `SDK for feature flag: ${flagName}`,
9696
})

0 commit comments

Comments
 (0)