Skip to content

Commit e667281

Browse files
committed
test: use RTL in the version selector tests
1 parent 18b8c95 commit e667281

File tree

7 files changed

+115
-253
lines changed

7 files changed

+115
-253
lines changed
+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import * as React from 'react';
2+
3+
import { render, screen } from '@testing-library/react';
4+
import userEvent from '@testing-library/user-event';
5+
6+
import { VersionChooser } from '../../src/renderer/components/commands-version-chooser';
7+
import { AppState } from '../../src/renderer/state';
8+
import { mockVersion1, prepareAppState } from '../test-utils/versions';
9+
10+
describe('VersionSelect component', () => {
11+
let appState: AppState;
12+
13+
beforeEach(() => {
14+
appState = prepareAppState();
15+
16+
// the version selector is disabled when bisecting
17+
appState.Bisector = undefined;
18+
});
19+
20+
it('selects a new version', async () => {
21+
const { getByRole } = render(<VersionChooser appState={appState} />);
22+
23+
const btnOpenVersionSelector = getByRole('button');
24+
25+
await userEvent.click(btnOpenVersionSelector);
26+
27+
const versionButton = screen.getByText(mockVersion1.version);
28+
29+
await userEvent.click(versionButton);
30+
31+
expect(appState.setVersion).toHaveBeenCalledWith(mockVersion1.version);
32+
});
33+
});

Diff for: tests/renderer/components/version-select-spec.tsx renamed to rtl-spec/components/version-select.spec.tsx

+37-60
Original file line numberDiff line numberDiff line change
@@ -1,85 +1,43 @@
11
import * as React from 'react';
22

3-
import { shallow } from 'enzyme';
3+
import { render } from '@testing-library/react';
4+
import userEvent from '@testing-library/user-event';
45
import { mocked } from 'jest-mock';
56

67
import {
7-
ElectronReleaseChannel,
88
InstallState,
99
RunnableVersion,
1010
VersionSource,
11-
} from '../../../src/interfaces';
11+
} from '../../src/interfaces';
1212
import {
1313
VersionSelect,
1414
filterItems,
1515
getItemIcon,
1616
getItemLabel,
1717
renderItem,
18-
} from '../../../src/renderer/components/version-select';
19-
import { AppState } from '../../../src/renderer/state';
20-
import { disableDownload } from '../../../src/renderer/utils/disable-download';
21-
import { StateMock, VersionsMock } from '../../mocks/mocks';
18+
} from '../../src/renderer/components/version-select';
19+
import { disableDownload } from '../../src/renderer/utils/disable-download';
20+
import { mockVersion1, prepareAppState } from '../test-utils/versions';
2221

2322
const { downloading, installed, missing, installing } = InstallState;
24-
const { remote, local } = VersionSource;
23+
const { local } = VersionSource;
2524

26-
jest.mock('../../../src/renderer/utils/disable-download.ts');
25+
jest.mock('../../src/renderer/utils/disable-download.ts');
2726

2827
describe('VersionSelect component', () => {
29-
let store: AppState;
30-
31-
const mockVersion1 = {
32-
source: remote,
33-
state: missing,
34-
version: '1.0.0',
35-
};
36-
37-
const mockVersion2 = {
38-
source: remote,
39-
state: missing,
40-
version: '3.0.0-unsupported',
41-
};
42-
43-
beforeEach(() => {
44-
({ state: store } = window.app);
45-
46-
const { mockVersions } = new VersionsMock();
47-
(store as unknown as StateMock).initVersions('2.0.2', {
48-
...mockVersions,
49-
'1.0.0': { ...mockVersion1 },
50-
'3.0.0-unsupported': { ...mockVersion2 },
51-
});
52-
store.channelsToShow = [
53-
ElectronReleaseChannel.stable,
54-
ElectronReleaseChannel.beta,
55-
];
56-
});
57-
58-
const onVersionSelect = () => ({});
28+
function renderVersionSelect() {
29+
const appState = prepareAppState();
5930

60-
it('renders', () => {
61-
const wrapper = shallow(
31+
return render(
6232
<VersionSelect
63-
appState={store}
33+
appState={appState}
6434
currentVersion={mockVersion1}
65-
onVersionSelect={onVersionSelect}
35+
onVersionSelect={jest.fn()}
6636
/>,
6737
);
68-
expect(wrapper).toMatchSnapshot();
69-
});
38+
}
7039

7140
describe('renderItem()', () => {
72-
it('renders an item', () => {
73-
const item = renderItem(mockVersion1, {
74-
handleClick: () => ({}),
75-
index: 0,
76-
modifiers: { active: true, disabled: false, matchesPredicate: true },
77-
query: '',
78-
});
79-
80-
expect(item).toMatchSnapshot();
81-
});
82-
8341
it('returns null if it does not match predicate', () => {
8442
const item = renderItem(mockVersion1, {
8543
handleClick: () => ({}),
@@ -103,9 +61,9 @@ describe('VersionSelect component', () => {
10361
query: '',
10462
})!;
10563

106-
const ItemWrapper = shallow(item);
64+
const { getAllByTestId } = render(item);
10765

108-
expect(ItemWrapper.find('.disabled-menu-tooltip')).toHaveLength(1);
66+
expect(getAllByTestId('disabled-menu-item')).toHaveLength(1);
10967
});
11068

11169
it('does not disable enabled download buttons when return value is false', () => {
@@ -118,9 +76,9 @@ describe('VersionSelect component', () => {
11876
query: '',
11977
})!;
12078

121-
const ItemWrapper = shallow(item);
79+
const { queryAllByTestId } = render(item);
12280

123-
expect(ItemWrapper.exists('.disabled-menu-tooltip')).toBe(false);
81+
expect(queryAllByTestId('disabled-menu-item')).toHaveLength(0);
12482
});
12583
});
12684

@@ -233,4 +191,23 @@ describe('VersionSelect component', () => {
233191
expect(filterItems('nightly', versions)).toEqual(expected);
234192
});
235193
});
194+
195+
describe('renderVersionContextMenu()', () => {
196+
it('copies the current version number to the clipboard', async () => {
197+
const spy = jest
198+
.spyOn(navigator.clipboard, 'writeText')
199+
.mockImplementationOnce(jest.fn());
200+
201+
const { getByRole, getByText } = renderVersionSelect();
202+
203+
await userEvent.pointer({
204+
keys: '[MouseRight]',
205+
target: getByRole('button'),
206+
});
207+
208+
await userEvent.click(getByText(/copy version number/i));
209+
210+
expect(spy).toHaveBeenCalledWith(mockVersion1.version);
211+
});
212+
});
236213
});

Diff for: rtl-spec/test-utils/versions.ts

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import {
2+
ElectronReleaseChannel,
3+
InstallState,
4+
VersionSource,
5+
} from '../../src/interfaces';
6+
import { VersionsMock } from '../../tests/mocks/electron-versions';
7+
import { StateMock } from '../../tests/mocks/state';
8+
9+
const { missing } = InstallState;
10+
const { remote } = VersionSource;
11+
12+
export const mockVersion1 = {
13+
source: remote,
14+
state: missing,
15+
version: '1.0.0',
16+
};
17+
18+
export const mockVersion2 = {
19+
source: remote,
20+
state: missing,
21+
version: '3.0.0-unsupported',
22+
};
23+
24+
/**
25+
* Initializes the app state with our mock versions.
26+
*/
27+
export function prepareAppState() {
28+
const { state: appState } = window.app;
29+
30+
const { mockVersions } = new VersionsMock();
31+
32+
(appState as unknown as StateMock).initVersions('2.0.2', {
33+
...mockVersions,
34+
'1.0.0': { ...mockVersion1 },
35+
'3.0.0-unsupported': { ...mockVersion2 },
36+
});
37+
38+
appState.channelsToShow = [
39+
ElectronReleaseChannel.stable,
40+
ElectronReleaseChannel.beta,
41+
];
42+
43+
return appState;
44+
}

Diff for: src/renderer/components/version-select.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ export const renderItem: ItemRenderer<RunnableVersion> = (
205205
>
206206
<MenuItem
207207
active={modifiers.active}
208+
data-testid="disabled-menu-item"
208209
disabled={true}
209210
text={highlightText(item.version, query)}
210211
key={item.version}

Diff for: tests/renderer/components/__snapshots__/commands-version-chooser-spec.tsx.snap

-45
This file was deleted.

Diff for: tests/renderer/components/__snapshots__/version-select-spec.tsx.snap

-86
This file was deleted.

0 commit comments

Comments
 (0)