Fix flaky MemberListView tests (#31707)

Replace unreliable setTimeout(1000) with proper waitFor() patterns for async assertions.

Fixes element-hq/element-web#31251

Fixes element-hq/element-web#31582

Signed-off-by: aditya-cherukuru <cherukuru.aditya01@gmail.com>
This commit is contained in:
Aditya Cherukuru 2026-01-13 18:13:20 +05:30 committed by GitHub
parent fb060721dc
commit 04800c15af
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 28 additions and 16 deletions

View File

@ -71,7 +71,7 @@ describe("MemberListHeaderView", () => {
memberListRoom.currentState.members[newMember.userId] = newMember;
}
await reRender();
expect(screen.queryByPlaceholderText("Search room members")).toBeVisible();
await waitFor(() => expect(screen.queryByPlaceholderText("Search room members")).toBeVisible());
});
describe("Invite button functionality", () => {
@ -84,7 +84,9 @@ describe("MemberListHeaderView", () => {
jest.spyOn(memberListRoom, "getMyMembership").mockReturnValue(KnownMembership.Join);
jest.spyOn(memberListRoom, "canInvite").mockReturnValue(false);
await reRender();
expect(screen.getByRole("button", { name: "Invite" })).toHaveAttribute("aria-disabled", "true");
await waitFor(() =>
expect(screen.getByRole("button", { name: "Invite" })).toHaveAttribute("aria-disabled", "true"),
);
});
it("Renders enabled invite button when current user is a member and has rights to invite", async () => {
@ -92,7 +94,9 @@ describe("MemberListHeaderView", () => {
jest.spyOn(memberListRoom, "getMyMembership").mockReturnValue(KnownMembership.Join);
jest.spyOn(memberListRoom, "canInvite").mockReturnValue(true);
await reRender();
expect(screen.getByRole("button", { name: "Invite" })).not.toHaveAttribute("aria-disabled", "true");
await waitFor(() =>
expect(screen.getByRole("button", { name: "Invite" })).not.toHaveAttribute("aria-disabled", "true"),
);
});
it("Opens room inviter on button click", async () => {
@ -101,6 +105,7 @@ describe("MemberListHeaderView", () => {
jest.spyOn(memberListRoom, "canInvite").mockReturnValue(true);
await reRender();
await waitFor(() => expect(screen.getByRole("button", { name: "Invite" })).not.toBeDisabled());
fireEvent.click(screen.getByRole("button", { name: "Invite" }));
expect(defaultDispatcher.dispatch).toHaveBeenCalledWith({
action: "view_invite",

View File

@ -191,20 +191,24 @@ describe("MemberListView and MemberlistHeaderView", () => {
u.user!.presence = "offline";
});
await act(reRender);
await reRender();
const tiles = root.container.querySelectorAll(".mx_MemberTileView");
expectOrderedByPresenceAndPowerLevel(memberListRoom, tiles, enablePresence);
await waitFor(() => {
const tiles = root.container.querySelectorAll(".mx_MemberTileView");
expectOrderedByPresenceAndPowerLevel(memberListRoom, tiles, enablePresence);
});
});
it("by power level", async () => {
const { reRender, root, memberListRoom } = rendered;
// We already have admin, moderator, and default users so leave them alone
await act(reRender);
await reRender();
const tiles = root.container.querySelectorAll(".mx_EntityTile");
expectOrderedByPresenceAndPowerLevel(memberListRoom, tiles, enablePresence);
await waitFor(() => {
const tiles = root.container.querySelectorAll(".mx_EntityTile");
expectOrderedByPresenceAndPowerLevel(memberListRoom, tiles, enablePresence);
});
});
it("by last active timestamp", async () => {
@ -229,10 +233,12 @@ describe("MemberListView and MemberlistHeaderView", () => {
u.user!.lastActiveAgo = 100;
});
await act(reRender);
await reRender();
const tiles = root.container.querySelectorAll(".mx_EntityTile");
expectOrderedByPresenceAndPowerLevel(memberListRoom, tiles, enablePresence);
await waitFor(() => {
const tiles = root.container.querySelectorAll(".mx_EntityTile");
expectOrderedByPresenceAndPowerLevel(memberListRoom, tiles, enablePresence);
});
});
it("by name", async () => {
@ -247,10 +253,12 @@ describe("MemberListView and MemberlistHeaderView", () => {
u.powerLevel = 100;
});
await act(reRender);
await reRender();
const tiles = root.container.querySelectorAll(".mx_EntityTile");
expectOrderedByPresenceAndPowerLevel(memberListRoom, tiles, enablePresence);
await waitFor(() => {
const tiles = root.container.querySelectorAll(".mx_EntityTile");
expectOrderedByPresenceAndPowerLevel(memberListRoom, tiles, enablePresence);
});
});
});
});

View File

@ -163,6 +163,5 @@ function createReRenderFunction(client: MatrixClient, memberListRoom: Room): Ren
getRoomId: () => memberListRoom.roomId,
});
});
await new Promise((r) => setTimeout(r, 1000));
};
}