Skip to content

Commit 04800c1

Browse files
Fix flaky MemberListView tests (#31707)
Replace unreliable setTimeout(1000) with proper waitFor() patterns for async assertions. Fixes #31251 Fixes #31582 Signed-off-by: aditya-cherukuru <cherukuru.aditya01@gmail.com>
1 parent fb06072 commit 04800c1

File tree

3 files changed

+28
-16
lines changed

3 files changed

+28
-16
lines changed

test/unit-tests/components/views/rooms/memberlist/MemberListHeaderView-test.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ describe("MemberListHeaderView", () => {
7171
memberListRoom.currentState.members[newMember.userId] = newMember;
7272
}
7373
await reRender();
74-
expect(screen.queryByPlaceholderText("Search room members")).toBeVisible();
74+
await waitFor(() => expect(screen.queryByPlaceholderText("Search room members")).toBeVisible());
7575
});
7676

7777
describe("Invite button functionality", () => {
@@ -84,15 +84,19 @@ describe("MemberListHeaderView", () => {
8484
jest.spyOn(memberListRoom, "getMyMembership").mockReturnValue(KnownMembership.Join);
8585
jest.spyOn(memberListRoom, "canInvite").mockReturnValue(false);
8686
await reRender();
87-
expect(screen.getByRole("button", { name: "Invite" })).toHaveAttribute("aria-disabled", "true");
87+
await waitFor(() =>
88+
expect(screen.getByRole("button", { name: "Invite" })).toHaveAttribute("aria-disabled", "true"),
89+
);
8890
});
8991

9092
it("Renders enabled invite button when current user is a member and has rights to invite", async () => {
9193
const { memberListRoom, reRender } = rendered;
9294
jest.spyOn(memberListRoom, "getMyMembership").mockReturnValue(KnownMembership.Join);
9395
jest.spyOn(memberListRoom, "canInvite").mockReturnValue(true);
9496
await reRender();
95-
expect(screen.getByRole("button", { name: "Invite" })).not.toHaveAttribute("aria-disabled", "true");
97+
await waitFor(() =>
98+
expect(screen.getByRole("button", { name: "Invite" })).not.toHaveAttribute("aria-disabled", "true"),
99+
);
96100
});
97101

98102
it("Opens room inviter on button click", async () => {
@@ -101,6 +105,7 @@ describe("MemberListHeaderView", () => {
101105
jest.spyOn(memberListRoom, "canInvite").mockReturnValue(true);
102106
await reRender();
103107

108+
await waitFor(() => expect(screen.getByRole("button", { name: "Invite" })).not.toBeDisabled());
104109
fireEvent.click(screen.getByRole("button", { name: "Invite" }));
105110
expect(defaultDispatcher.dispatch).toHaveBeenCalledWith({
106111
action: "view_invite",

test/unit-tests/components/views/rooms/memberlist/MemberListView-test.tsx

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -191,20 +191,24 @@ describe("MemberListView and MemberlistHeaderView", () => {
191191
u.user!.presence = "offline";
192192
});
193193

194-
await act(reRender);
194+
await reRender();
195195

196-
const tiles = root.container.querySelectorAll(".mx_MemberTileView");
197-
expectOrderedByPresenceAndPowerLevel(memberListRoom, tiles, enablePresence);
196+
await waitFor(() => {
197+
const tiles = root.container.querySelectorAll(".mx_MemberTileView");
198+
expectOrderedByPresenceAndPowerLevel(memberListRoom, tiles, enablePresence);
199+
});
198200
});
199201

200202
it("by power level", async () => {
201203
const { reRender, root, memberListRoom } = rendered;
202204
// We already have admin, moderator, and default users so leave them alone
203205

204-
await act(reRender);
206+
await reRender();
205207

206-
const tiles = root.container.querySelectorAll(".mx_EntityTile");
207-
expectOrderedByPresenceAndPowerLevel(memberListRoom, tiles, enablePresence);
208+
await waitFor(() => {
209+
const tiles = root.container.querySelectorAll(".mx_EntityTile");
210+
expectOrderedByPresenceAndPowerLevel(memberListRoom, tiles, enablePresence);
211+
});
208212
});
209213

210214
it("by last active timestamp", async () => {
@@ -229,10 +233,12 @@ describe("MemberListView and MemberlistHeaderView", () => {
229233
u.user!.lastActiveAgo = 100;
230234
});
231235

232-
await act(reRender);
236+
await reRender();
233237

234-
const tiles = root.container.querySelectorAll(".mx_EntityTile");
235-
expectOrderedByPresenceAndPowerLevel(memberListRoom, tiles, enablePresence);
238+
await waitFor(() => {
239+
const tiles = root.container.querySelectorAll(".mx_EntityTile");
240+
expectOrderedByPresenceAndPowerLevel(memberListRoom, tiles, enablePresence);
241+
});
236242
});
237243

238244
it("by name", async () => {
@@ -247,10 +253,12 @@ describe("MemberListView and MemberlistHeaderView", () => {
247253
u.powerLevel = 100;
248254
});
249255

250-
await act(reRender);
256+
await reRender();
251257

252-
const tiles = root.container.querySelectorAll(".mx_EntityTile");
253-
expectOrderedByPresenceAndPowerLevel(memberListRoom, tiles, enablePresence);
258+
await waitFor(() => {
259+
const tiles = root.container.querySelectorAll(".mx_EntityTile");
260+
expectOrderedByPresenceAndPowerLevel(memberListRoom, tiles, enablePresence);
261+
});
254262
});
255263
});
256264
});

test/unit-tests/components/views/rooms/memberlist/common.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,5 @@ function createReRenderFunction(client: MatrixClient, memberListRoom: Room): Ren
163163
getRoomId: () => memberListRoom.roomId,
164164
});
165165
});
166-
await new Promise((r) => setTimeout(r, 1000));
167166
};
168167
}

0 commit comments

Comments
 (0)