Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit f40d153

Browse files
authored
Update tests to prefer RTL over Enzyme (#10247
* Update tests to prefer RTL over Enzyme * Strict types
1 parent dd6fc12 commit f40d153

20 files changed

+1095
-632
lines changed

src/components/views/audio_messages/PlayPauseButton.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export default class PlayPauseButton extends React.PureComponent<IProps> {
6060

6161
return (
6262
<AccessibleTooltipButton
63-
data-test-id="play-pause-button"
63+
data-testid="play-pause-button"
6464
className={classes}
6565
title={isPlaying ? _t("Pause") : _t("Play")}
6666
onClick={this.onClick}

test/components/views/audio_messages/RecordingPlayback-test.tsx

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,16 @@ limitations under the License.
1515
*/
1616

1717
import React from "react";
18-
// eslint-disable-next-line deprecate/import
19-
import { mount, ReactWrapper } from "enzyme";
2018
import { mocked } from "jest-mock";
2119
import { logger } from "matrix-js-sdk/src/logger";
22-
import { act } from "react-dom/test-utils";
20+
import { fireEvent, render, RenderResult } from "@testing-library/react";
2321

2422
import RecordingPlayback, { PlaybackLayout } from "../../../../src/components/views/audio_messages/RecordingPlayback";
2523
import { Playback } from "../../../../src/audio/Playback";
2624
import RoomContext, { TimelineRenderingType } from "../../../../src/contexts/RoomContext";
2725
import { createAudioContext } from "../../../../src/audio/compat";
28-
import { findByTestId, flushPromises } from "../../../test-utils";
29-
import PlaybackWaveform from "../../../../src/components/views/audio_messages/PlaybackWaveform";
30-
import SeekBar from "../../../../src/components/views/audio_messages/SeekBar";
31-
import PlaybackClock from "../../../../src/components/views/audio_messages/PlaybackClock";
26+
import { flushPromises } from "../../../test-utils";
27+
import { IRoomState } from "../../../../src/components/structures/RoomView";
3228

3329
jest.mock("../../../../src/audio/compat", () => ({
3430
createAudioContext: jest.fn(),
@@ -57,12 +53,13 @@ describe("<RecordingPlayback />", () => {
5753

5854
const mockChannelData = new Float32Array();
5955

60-
const defaultRoom = { roomId: "!room:server.org", timelineRenderingType: TimelineRenderingType.File };
56+
const defaultRoom = { roomId: "!room:server.org", timelineRenderingType: TimelineRenderingType.File } as IRoomState;
6157
const getComponent = (props: React.ComponentProps<typeof RecordingPlayback>, room = defaultRoom) =>
62-
mount(<RecordingPlayback {...props} />, {
63-
wrappingComponent: RoomContext.Provider,
64-
wrappingComponentProps: { value: room },
65-
});
58+
render(
59+
<RoomContext.Provider value={room}>
60+
<RecordingPlayback {...props} />
61+
</RoomContext.Provider>,
62+
);
6663

6764
beforeEach(() => {
6865
jest.spyOn(logger, "error").mockRestore();
@@ -71,7 +68,7 @@ describe("<RecordingPlayback />", () => {
7168
mocked(createAudioContext).mockReturnValue(mockAudioContext as unknown as AudioContext);
7269
});
7370

74-
const getPlayButton = (component: ReactWrapper) => findByTestId(component, "play-pause-button").at(0);
71+
const getPlayButton = (component: RenderResult) => component.getByTestId("play-pause-button");
7572

7673
it("renders recording playback", () => {
7774
const playback = new Playback(new ArrayBuffer(8));
@@ -82,15 +79,16 @@ describe("<RecordingPlayback />", () => {
8279
it("disables play button while playback is decoding", async () => {
8380
const playback = new Playback(new ArrayBuffer(8));
8481
const component = getComponent({ playback });
85-
expect(getPlayButton(component).props().disabled).toBeTruthy();
82+
expect(getPlayButton(component)).toHaveAttribute("disabled");
83+
expect(getPlayButton(component)).toHaveAttribute("aria-disabled", "true");
8684
});
8785

8886
it("enables play button when playback is finished decoding", async () => {
8987
const playback = new Playback(new ArrayBuffer(8));
9088
const component = getComponent({ playback });
9189
await flushPromises();
92-
component.setProps({});
93-
expect(getPlayButton(component).props().disabled).toBeFalsy();
90+
expect(getPlayButton(component)).not.toHaveAttribute("disabled");
91+
expect(getPlayButton(component)).not.toHaveAttribute("aria-disabled", "true");
9492
});
9593

9694
it("displays error when playback decoding fails", async () => {
@@ -101,16 +99,17 @@ describe("<RecordingPlayback />", () => {
10199
const playback = new Playback(new ArrayBuffer(8));
102100
const component = getComponent({ playback });
103101
await flushPromises();
104-
expect(component.find(".text-warning").length).toBeFalsy();
102+
expect(component.container.querySelector(".text-warning")).toBeDefined();
105103
});
106104

107105
it("displays pre-prepared playback with correct playback phase", async () => {
108106
const playback = new Playback(new ArrayBuffer(8));
109107
await playback.prepare();
110108
const component = getComponent({ playback });
111109
// playback already decoded, button is not disabled
112-
expect(getPlayButton(component).props().disabled).toBeFalsy();
113-
expect(component.find(".text-warning").length).toBeFalsy();
110+
expect(getPlayButton(component)).not.toHaveAttribute("disabled");
111+
expect(getPlayButton(component)).not.toHaveAttribute("aria-disabled", "true");
112+
expect(component.container.querySelector(".text-warning")).toBeFalsy();
114113
});
115114

116115
it("toggles playback on play pause button click", async () => {
@@ -119,9 +118,7 @@ describe("<RecordingPlayback />", () => {
119118
await playback.prepare();
120119
const component = getComponent({ playback });
121120

122-
act(() => {
123-
getPlayButton(component).simulate("click");
124-
});
121+
fireEvent.click(getPlayButton(component));
125122

126123
expect(playback.toggle).toHaveBeenCalled();
127124
});
@@ -131,9 +128,9 @@ describe("<RecordingPlayback />", () => {
131128
const playback = new Playback(new ArrayBuffer(8));
132129
const component = getComponent({ playback, layout: PlaybackLayout.Composer });
133130

134-
expect(component.find(PlaybackClock).length).toBeTruthy();
135-
expect(component.find(PlaybackWaveform).length).toBeTruthy();
136-
expect(component.find(SeekBar).length).toBeFalsy();
131+
expect(component.container.querySelector(".mx_Clock")).toBeDefined();
132+
expect(component.container.querySelector(".mx_Waveform")).toBeDefined();
133+
expect(component.container.querySelector(".mx_SeekBar")).toBeFalsy();
137134
});
138135
});
139136

@@ -142,18 +139,18 @@ describe("<RecordingPlayback />", () => {
142139
const playback = new Playback(new ArrayBuffer(8));
143140
const component = getComponent({ playback, layout: PlaybackLayout.Timeline });
144141

145-
expect(component.find(PlaybackClock).length).toBeTruthy();
146-
expect(component.find(PlaybackWaveform).length).toBeTruthy();
147-
expect(component.find(SeekBar).length).toBeTruthy();
142+
expect(component.container.querySelector(".mx_Clock")).toBeDefined();
143+
expect(component.container.querySelector(".mx_Waveform")).toBeDefined();
144+
expect(component.container.querySelector(".mx_SeekBar")).toBeDefined();
148145
});
149146

150147
it("should be the default", () => {
151148
const playback = new Playback(new ArrayBuffer(8));
152149
const component = getComponent({ playback }); // no layout set for test
153150

154-
expect(component.find(PlaybackClock).length).toBeTruthy();
155-
expect(component.find(PlaybackWaveform).length).toBeTruthy();
156-
expect(component.find(SeekBar).length).toBeTruthy();
151+
expect(component.container.querySelector(".mx_Clock")).toBeDefined();
152+
expect(component.container.querySelector(".mx_Waveform")).toBeDefined();
153+
expect(component.container.querySelector(".mx_SeekBar")).toBeDefined();
157154
});
158155
});
159156
});

test/components/views/auth/RegistrationToken-test.tsx

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ limitations under the License.
1717
*/
1818

1919
import React from "react";
20-
import { act } from "react-dom/test-utils";
21-
// eslint-disable-next-line deprecate/import
22-
import { mount, ReactWrapper } from "enzyme";
20+
import { fireEvent, render, RenderResult } from "@testing-library/react";
2321

2422
import InteractiveAuthComponent from "../../../../src/components/structures/InteractiveAuth";
2523
import { flushPromises, getMockClientWithEventEmitter, unmockClientPeg } from "../../../test-utils";
@@ -34,7 +32,7 @@ describe("InteractiveAuthComponent", function () {
3432
makeRequest: jest.fn().mockResolvedValue(undefined),
3533
onAuthFinished: jest.fn(),
3634
};
37-
const getComponent = (props = {}) => mount(<InteractiveAuthComponent {...defaultProps} {...props} />);
35+
const getComponent = (props = {}) => render(<InteractiveAuthComponent {...defaultProps} {...props} />);
3836

3937
beforeEach(function () {
4038
jest.clearAllMocks();
@@ -44,9 +42,10 @@ describe("InteractiveAuthComponent", function () {
4442
unmockClientPeg();
4543
});
4644

47-
const getSubmitButton = (wrapper: ReactWrapper) => wrapper.find('AccessibleButton[kind="primary"]').at(0);
48-
const getRegistrationTokenInput = (wrapper: ReactWrapper) =>
49-
wrapper.find('input[name="registrationTokenField"]').at(0);
45+
const getSubmitButton = ({ container }: RenderResult) =>
46+
container.querySelector(".mx_AccessibleButton_kind_primary");
47+
const getRegistrationTokenInput = ({ container }: RenderResult) =>
48+
container.querySelector('input[name="registrationTokenField"]');
5049

5150
it("Should successfully complete a registration token flow", async () => {
5251
const onAuthFinished = jest.fn();
@@ -61,28 +60,25 @@ describe("InteractiveAuthComponent", function () {
6160

6261
const registrationTokenNode = getRegistrationTokenInput(wrapper);
6362
const submitNode = getSubmitButton(wrapper);
64-
const formNode = wrapper.find("form").at(0);
63+
const formNode = wrapper.container.querySelector("form");
6564

6665
expect(registrationTokenNode).toBeTruthy();
6766
expect(submitNode).toBeTruthy();
6867
expect(formNode).toBeTruthy();
6968

7069
// submit should be disabled
71-
expect(submitNode.props().disabled).toBe(true);
70+
expect(submitNode).toHaveAttribute("disabled");
71+
expect(submitNode).toHaveAttribute("aria-disabled", "true");
7272

7373
// put something in the registration token box
74-
act(() => {
75-
registrationTokenNode.simulate("change", { target: { value: "s3kr3t" } });
76-
wrapper.setProps({});
77-
});
74+
fireEvent.change(registrationTokenNode!, { target: { value: "s3kr3t" } });
7875

79-
expect(getRegistrationTokenInput(wrapper).props().value).toEqual("s3kr3t");
80-
expect(getSubmitButton(wrapper).props().disabled).toBe(false);
76+
expect(getRegistrationTokenInput(wrapper)).toHaveValue("s3kr3t");
77+
expect(submitNode).not.toHaveAttribute("disabled");
78+
expect(submitNode).not.toHaveAttribute("aria-disabled", "true");
8179

8280
// hit enter; that should trigger a request
83-
act(() => {
84-
formNode.simulate("submit");
85-
});
81+
fireEvent.submit(formNode!);
8682

8783
// wait for auth request to resolve
8884
await flushPromises();

test/components/views/beacon/BeaconViewDialog-test.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ limitations under the License.
1515
*/
1616

1717
import React from "react";
18-
import { act } from "react-dom/test-utils";
19-
import { fireEvent, render, RenderResult } from "@testing-library/react";
18+
import { act, fireEvent, render, RenderResult } from "@testing-library/react";
2019
import { MatrixClient, MatrixEvent, Room, RoomMember, getBeaconInfoIdentifier } from "matrix-js-sdk/src/matrix";
2120
import * as maplibregl from "maplibre-gl";
2221
import { mocked } from "jest-mock";

test/components/views/dialogs/ExportDialog-test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import React from "react";
1818
// eslint-disable-next-line deprecate/import
1919
import { mount, ReactWrapper } from "enzyme";
2020
import { mocked } from "jest-mock";
21+
// eslint-disable-next-line deprecate/import
2122
import { act } from "react-dom/test-utils";
2223
import { Room } from "matrix-js-sdk/src/matrix";
2324

0 commit comments

Comments
 (0)