diff --git a/test/components/structures/ThreadView-test.tsx b/test/components/structures/ThreadView-test.tsx index 83eed5eb9d..d7cbfa1756 100644 --- a/test/components/structures/ThreadView-test.tsx +++ b/test/components/structures/ThreadView-test.tsx @@ -197,7 +197,9 @@ describe("ThreadView", () => { it("sets the correct thread in the room view store", async () => { // expect(SdkContextClass.instance.roomViewStore.getThreadId()).toBeNull(); const { unmount } = await getComponent(); - expect(SdkContextClass.instance.roomViewStore.getThreadId()).toBe(rootEvent.getId()); + waitFor(() => { + expect(SdkContextClass.instance.roomViewStore.getThreadId()).toBe(rootEvent.getId()); + }); unmount(); await waitFor(() => expect(SdkContextClass.instance.roomViewStore.getThreadId()).toBeNull()); diff --git a/test/components/views/beacon/BeaconMarker-test.tsx b/test/components/views/beacon/BeaconMarker-test.tsx index 15b1335d90..4a5b5b8711 100644 --- a/test/components/views/beacon/BeaconMarker-test.tsx +++ b/test/components/views/beacon/BeaconMarker-test.tsx @@ -15,7 +15,7 @@ limitations under the License. */ import React from "react"; -import { act, render, screen } from "@testing-library/react"; +import { act, render, screen, waitFor } from "@testing-library/react"; import * as maplibregl from "maplibre-gl"; import { Beacon, Room, RoomMember, MatrixEvent, getBeaconInfoIdentifier } from "matrix-js-sdk/src/matrix"; @@ -111,13 +111,15 @@ describe("", () => { expect(screen.queryByTestId("avatar-img")).not.toBeInTheDocument(); }); - it("renders marker when beacon has location", () => { + it("renders marker when beacon has location", async () => { const room = setupRoom([defaultEvent]); const beacon = room.currentState.beacons.get(getBeaconInfoIdentifier(defaultEvent)); beacon?.addLocations([location1]); const { asFragment } = renderComponent({ beacon }); + await waitFor(() => { + expect(screen.getByTestId("avatar-img")).toBeInTheDocument(); + }); expect(asFragment()).toMatchSnapshot(); - expect(screen.getByTestId("avatar-img")).toBeInTheDocument(); }); it("updates with new locations", () => { diff --git a/test/components/views/beacon/BeaconViewDialog-test.tsx b/test/components/views/beacon/BeaconViewDialog-test.tsx index cee880c966..8347fca18b 100644 --- a/test/components/views/beacon/BeaconViewDialog-test.tsx +++ b/test/components/views/beacon/BeaconViewDialog-test.tsx @@ -15,7 +15,7 @@ limitations under the License. */ import React from "react"; -import { act, fireEvent, render, RenderResult } from "@testing-library/react"; +import { act, fireEvent, render, RenderResult, waitFor } from "@testing-library/react"; import { MatrixClient, MatrixEvent, Room, RoomMember, getBeaconInfoIdentifier } from "matrix-js-sdk/src/matrix"; import * as maplibregl from "maplibre-gl"; import { mocked } from "jest-mock"; @@ -92,7 +92,7 @@ describe("", () => { jest.clearAllMocks(); }); - it("renders a map with markers", () => { + it("renders a map with markers", async () => { const room = setupRoom([defaultEvent]); const beacon = room.currentState.beacons.get(getBeaconInfoIdentifier(defaultEvent))!; beacon.addLocations([location1]); @@ -103,7 +103,9 @@ describe("", () => { lat: 51, }); // marker added - expect(mockMarker.addTo).toHaveBeenCalledWith(mockMap); + await waitFor(() => { + expect(mockMarker.addTo).toHaveBeenCalledWith(mockMap); + }); }); it("does not render any own beacon status when user is not live sharing", () => { diff --git a/test/components/views/dialogs/ForwardDialog-test.tsx b/test/components/views/dialogs/ForwardDialog-test.tsx index 6206087ab8..12c6048e61 100644 --- a/test/components/views/dialogs/ForwardDialog-test.tsx +++ b/test/components/views/dialogs/ForwardDialog-test.tsx @@ -130,9 +130,9 @@ describe("ForwardDialog", () => { expect(container.querySelectorAll(".mx_ForwardList_entry")).toHaveLength(3); const searchInput = getByTestId(container, "searchbox-input"); - act(() => userEvent.type(searchInput, "a")); + await userEvent.type(searchInput, "a"); - expect(container.querySelectorAll(".mx_ForwardList_entry")).toHaveLength(3); + expect(container.querySelectorAll(".mx_ForwardList_entry")).toHaveLength(2); }); it("should be navigable using arrow keys", async () => { diff --git a/test/components/views/messages/MLocationBody-test.tsx b/test/components/views/messages/MLocationBody-test.tsx index 7f3bddaa4c..1cdcb65767 100644 --- a/test/components/views/messages/MLocationBody-test.tsx +++ b/test/components/views/messages/MLocationBody-test.tsx @@ -15,7 +15,7 @@ limitations under the License. */ import React, { ComponentProps } from "react"; -import { fireEvent, render } from "@testing-library/react"; +import { fireEvent, render, waitFor } from "@testing-library/react"; import { LocationAssetType, ClientEvent, RoomMember, SyncState } from "matrix-js-sdk/src/matrix"; import * as maplibregl from "maplibre-gl"; import { logger } from "matrix-js-sdk/src/logger"; @@ -90,8 +90,13 @@ describe("MLocationBody", () => { jest.spyOn(logger, "error").mockRestore(); }); - it("displays correct fallback content without error style when map_style_url is not configured", () => { + it("displays correct fallback content without error style when map_style_url is not configured", async () => { const component = getComponent(); + + // The map code needs to be lazy loaded so this will take some time to appear + await waitFor(() => + expect(component.container.querySelector(".mx_EventTile_body")).toBeInTheDocument(), + ); expect(component.container.querySelector(".mx_EventTile_body")).toMatchSnapshot(); }); diff --git a/test/components/views/rooms/MessageComposerButtons-test.tsx b/test/components/views/rooms/MessageComposerButtons-test.tsx index 2ddd8d9b01..21abb2b9c7 100644 --- a/test/components/views/rooms/MessageComposerButtons-test.tsx +++ b/test/components/views/rooms/MessageComposerButtons-test.tsx @@ -15,7 +15,7 @@ limitations under the License. */ import React from "react"; -import { render, screen } from "@testing-library/react"; +import { render, screen, waitFor } from "@testing-library/react"; import MatrixClientContext from "../../../../src/contexts/MatrixClientContext"; import RoomContext from "../../../../src/contexts/RoomContext"; @@ -82,7 +82,7 @@ describe("MessageComposerButtons", () => { expect(getButtonLabels()).toEqual(["Emoji", "Attachment", "More options"]); }); - it("Renders other buttons in menu in wide mode", () => { + it("Renders other buttons in menu in wide mode", async () => { wrapAndRender( { false, ); - expect(getButtonLabels()).toEqual([ - "Emoji", - "Attachment", - "More options", - ["Sticker", "Voice Message", "Poll", "Location"], - ]); + // The location code is lazy loaded, so the button will take a little while + // to appear, so we need to wait. + await waitFor(() => { + expect(getButtonLabels()).toEqual([ + "Emoji", + "Attachment", + "More options", + ["Sticker", "Voice Message", "Poll", "Location"], + ]); + }); }); it("Renders only some buttons in narrow mode", () => { diff --git a/test/components/views/settings/Notifications-test.tsx b/test/components/views/settings/Notifications-test.tsx index b12cf9239e..24a23832c1 100644 --- a/test/components/views/settings/Notifications-test.tsx +++ b/test/components/views/settings/Notifications-test.tsx @@ -30,7 +30,7 @@ import { ThreepidMedium, } from "matrix-js-sdk/src/matrix"; import { randomString } from "matrix-js-sdk/src/randomstring"; -import { act, fireEvent, getByTestId, render, screen, within } from "@testing-library/react"; +import { act, fireEvent, getByTestId, render, screen, waitFor, within } from "@testing-library/react"; import { mocked } from "jest-mock"; import userEvent from "@testing-library/user-event"; @@ -907,6 +907,7 @@ describe("", () => { fireEvent.click(clearNotificationEl); expect(clearNotificationEl.className).toContain("mx_AccessibleButton_disabled"); + await waitFor(() => expect(clearNotificationEl.className).not.toContain("mx_AccessibleButton_disabled")); expect(mockClient.sendReadReceipt).toHaveBeenCalled(); }); }); diff --git a/test/setupTests.ts b/test/setupTests.ts index fa99913b56..a7044c0474 100644 --- a/test/setupTests.ts +++ b/test/setupTests.ts @@ -37,13 +37,6 @@ beforeEach(() => { }); }); -// Retry to work around our flaky app & tests -if (process.env.CI) { - jest.retryTimes(2, { - logErrorsBeforeRetry: true, - }); -} - // Very carefully enable the mocks for everything else in // a specific order. We use this order to ensure we properly // establish an application state that actually works.