From 87d529701c2cf6457cffed904fb7c9bbe9acba89 Mon Sep 17 00:00:00 2001 From: Will Hunt <2072976+Half-Shot@users.noreply.github.com> Date: Fri, 19 Dec 2025 12:16:01 +0000 Subject: [PATCH] Playwright tests for RoomStatusBar (#31579) * Add a timeout for toast checks * Add tests for room status bar * Fix MAU toast never appearing. * Also cover local room create fails. * fix await * docstring * Enwiden * Add a test for the changes --- playwright/e2e/room/room-status-bar.spec.ts | 174 ++++++++++++++++++ playwright/pages/toasts.ts | 5 +- .../connectivity-lost-linux.png | Bin 0 -> 8786 bytes .../room-status-bar.spec.ts/consent-linux.png | Bin 0 -> 15218 bytes .../local-room-create-failed-linux.png | Bin 0 -> 5965 bytes .../message-failed-linux.png | Bin 0 -> 11561 bytes src/components/structures/LoggedInView.tsx | 7 +- .../structures/LoggedInView-test.tsx | 26 +++ 8 files changed, 207 insertions(+), 5 deletions(-) create mode 100644 playwright/e2e/room/room-status-bar.spec.ts create mode 100644 playwright/snapshots/room/room-status-bar.spec.ts/connectivity-lost-linux.png create mode 100644 playwright/snapshots/room/room-status-bar.spec.ts/consent-linux.png create mode 100644 playwright/snapshots/room/room-status-bar.spec.ts/local-room-create-failed-linux.png create mode 100644 playwright/snapshots/room/room-status-bar.spec.ts/message-failed-linux.png diff --git a/playwright/e2e/room/room-status-bar.spec.ts b/playwright/e2e/room/room-status-bar.spec.ts new file mode 100644 index 0000000000..249aa6e9d5 --- /dev/null +++ b/playwright/e2e/room/room-status-bar.spec.ts @@ -0,0 +1,174 @@ +/* +Copyright 2025 Element Creations Ltd. +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { test, expect } from "../../element-web-test"; + +test.describe("Room Status Bar", () => { + test.use({ + displayName: "Jim", + page: async ({ page }, use) => { + // Increase width as these components look horrible at lower + // widths. + await page.setViewportSize({ width: 1400, height: 768 }); + await use(page); + }, + room: async ({ app, user }, use) => { + const roomId = await app.client.createRoom({ + name: "A room", + }); + await app.closeNotificationToast(); + await app.viewRoomById(roomId); + await use({ roomId }); + }, + }); + + test("should show an error when sync stops", { tag: "@screenshot" }, async ({ page, user, app, room, axe }) => { + await page.route("**/_matrix/client/*/sync*", async (route, req) => { + await route.fulfill({ + status: 500, + contentType: "application/json", + body: '{"error": "Test fail", "errcode": "M_UNKNOWN"}', + }); + }); + await app.client.sendMessage(room.roomId, "forcing sync to run"); + const banner = page.getByRole("region", { name: "Room status bar" }); + await expect(banner).toBeVisible({ timeout: 15000 }); + await expect(banner).toMatchScreenshot("connectivity_lost.png"); + }); + test("should NOT an error when a resource limit is hit", async ({ page, user, app, room, axe, toasts }) => { + await app.viewRoomById(room.roomId); + await page.route("**/_matrix/client/*/sync*", async (route, req) => { + await route.fulfill({ + status: 400, + contentType: "application/json", + body: JSON.stringify({ + error: "Test fail", + errcode: "M_RESOURCE_LIMIT_EXCEEDED", + limit_type: "monthly_active_user", + admin_contact: "https://example.org", + }), + }); + }); + await app.client.sendMessage(room.roomId, "forcing sync to run"); + // Wait for the MAU warning toast to appear so we know this status bar would have appeared. + await toasts.getToast("Warning", 15000); + await expect(page.getByRole("region", { name: "Room status bar" })).not.toBeVisible(); + }); + test( + "should show an error when the user needs to consent", + { tag: "@screenshot" }, + async ({ page, user, app, room, axe }) => { + await app.viewRoomById(room.roomId); + await page.route("**/_matrix/client/**/send**", async (route) => { + await route.fulfill({ + status: 400, + contentType: "application/json", + body: JSON.stringify({ + error: "Test fail", + errcode: "M_CONSENT_NOT_GIVEN", + consent_uri: "https://example.org", + }), + }); + }); + const composer = app.getComposerField(); + await composer.fill("Hello!"); + await composer.press("Enter"); + await page + .getByRole("dialog", { name: "Terms and Conditions" }) + .getByRole("button", { name: "Dismiss" }) + .click(); + const banner = page.getByRole("region", { name: "Room status bar" }); + await expect(banner).toBeVisible({ timeout: 15000 }); + await expect(banner).toMatchScreenshot("consent.png"); + }, + ); + test.describe("Message fails to send", () => { + test.beforeEach(async ({ page, user, app, room, axe }) => { + await app.viewRoomById(room.roomId); + await page.route("**/_matrix/client/**/send**", async (route) => { + await route.fulfill({ + status: 400, + contentType: "application/json", + body: JSON.stringify({ error: "Test fail", errcode: "M_UNKNOWN" }), + }); + }); + const composer = app.getComposerField(); + await composer.fill("Hello!"); + await composer.press("Enter"); + const banner = page.getByRole("region", { name: "Room status bar" }); + await expect(banner).toBeVisible(); + }); + test( + "should show an error when a message fails to send", + { tag: "@screenshot" }, + async ({ page, user, app, room, axe }) => { + const banner = page.getByRole("region", { name: "Room status bar" }); + await expect(banner).toMatchScreenshot("message_failed.png"); + }, + ); + test("should be able to 'Delete all' messages", async ({ page, user, app, room, axe }) => { + const banner = page.getByRole("region", { name: "Room status bar" }); + await banner.getByRole("button", { name: "Delete all" }).click(); + await expect(banner).not.toBeVisible(); + }); + test("should be able to 'Retry all' messages", async ({ page, user, app, room, axe }) => { + const banner = page.getByRole("region", { name: "Room status bar" }); + await page.unroute("**/_matrix/client/**/send**"); + await banner.getByRole("button", { name: "Retry all" }).click(); + await expect(banner).not.toBeVisible(); + }); + }); + + test.describe("Local rooms", () => { + test.use({ + botCreateOpts: { + displayName: "Alice", + }, + }); + test( + "should show an error when creating a local room fails", + { tag: "@screenshot" }, + async ({ page, app, user, bot }) => { + await page + .getByRole("navigation", { name: "Room list" }) + .getByRole("button", { name: "New conversation" }) + .click(); + await page.getByRole("menuitem", { name: "Start chat" }).click(); + + await page.route("**/_matrix/client/*/createRoom*", async (route, req) => { + await route.fulfill({ + status: 400, + contentType: "application/json", + body: JSON.stringify({ + error: "Test fail", + errcode: "M_UNKNOWN", + }), + }); + }); + + const other = page.locator(".mx_InviteDialog_other"); + await other.getByTestId("invite-dialog-input").fill(bot.credentials.userId); + await expect( + other.getByRole("option", { name: "Alice" }).getByText(bot.credentials.userId), + ).toBeVisible(); + await other.getByRole("option", { name: "Alice" }).click(); + await other.getByRole("button", { name: "Go" }).click(); + // Send a message to invite the bots + const composer = app.getComposerField(); + await composer.fill("Hello"); + await composer.press("Enter"); + + const banner = page.getByText("!Some of your messages have"); + await expect(banner).toBeVisible(); + await expect(banner).toMatchScreenshot("local_room_create_failed.png"); + + await page.unroute("**/_matrix/client/*/createRoom*"); + await banner.getByRole("button", { name: "Retry" }).click(); + await expect(banner).not.toBeVisible(); + }, + ); + }); +}); diff --git a/playwright/pages/toasts.ts b/playwright/pages/toasts.ts index cfab354aaf..80ee3c9f26 100644 --- a/playwright/pages/toasts.ts +++ b/playwright/pages/toasts.ts @@ -15,11 +15,12 @@ export class Toasts { * Assert that a toast with the given title exists, and return it * * @param expectedTitle - Expected title of the toast + * @param timeout Time to retry the assertion for in milliseconds. Defaults to `timeout` in `TestConfig.expect`. * @returns the Locator for the matching toast */ - public async getToast(expectedTitle: string): Promise { + public async getToast(expectedTitle: string, timeout?: number): Promise { const toast = this.page.locator(".mx_Toast_toast", { hasText: expectedTitle }).first(); - await expect(toast).toBeVisible(); + await expect(toast).toBeVisible({ timeout }); return toast; } diff --git a/playwright/snapshots/room/room-status-bar.spec.ts/connectivity-lost-linux.png b/playwright/snapshots/room/room-status-bar.spec.ts/connectivity-lost-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..106f16403c8d7176857c0208269d901351484f50 GIT binary patch literal 8786 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 literal 0 HcmV?d00001 diff --git a/playwright/snapshots/room/room-status-bar.spec.ts/local-room-create-failed-linux.png b/playwright/snapshots/room/room-status-bar.spec.ts/local-room-create-failed-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..a8fe32646e3cc2c464952b8f554c6242e1c49f69 GIT binary patch literal 5965 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 b4oC$^ptiYpxn=$@39G59r&6QzGV*@_4;qCp literal 0 HcmV?d00001 diff --git a/playwright/snapshots/room/room-status-bar.spec.ts/message-failed-linux.png b/playwright/snapshots/room/room-status-bar.spec.ts/message-failed-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..cccc5fb6757d750a7531257b2f5090aaaa6b2570 GIT binary patch literal 11561 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 { const newErrCode = (data?.error as MatrixError)?.errcode; if (syncState === oldSyncState && oldErrCode === newErrCode) return; + const syncErrorData = syncState === SyncState.Error ? data : undefined; this.setState({ - syncErrorData: syncState === SyncState.Error ? data : undefined, + syncErrorData, }); if (oldSyncState === SyncState.Prepared && syncState === SyncState.Syncing) { this.updateServerNoticeEvents(); } else { - this.calculateServerLimitToast(this.state.syncErrorData, this.state.usageLimitEventContent); + this.calculateServerLimitToast(syncErrorData, this.state.usageLimitEventContent); } }; @@ -391,7 +392,7 @@ class LoggedInView extends React.Component { // usageLimitDismissed is true when the user has explicitly hidden the toast // and it will be reset to false if a *new* usage alert comes in. - if (usageLimitEventContent && this.state.usageLimitDismissed) { + if (usageLimitEventContent && !this.state.usageLimitDismissed) { showServerLimitToast( usageLimitEventContent.limit_type, this.onUsageLimitDismissed, diff --git a/test/unit-tests/components/structures/LoggedInView-test.tsx b/test/unit-tests/components/structures/LoggedInView-test.tsx index 5b59c18bc1..de4d0a2d58 100644 --- a/test/unit-tests/components/structures/LoggedInView-test.tsx +++ b/test/unit-tests/components/structures/LoggedInView-test.tsx @@ -17,6 +17,8 @@ import { PushRuleKind, ProfileKeyTimezone, ProfileKeyMSC4175Timezone, + SyncState, + MatrixError, } from "matrix-js-sdk/src/matrix"; import { MediaHandler } from "matrix-js-sdk/src/webrtc/mediaHandler"; import { logger } from "matrix-js-sdk/src/logger"; @@ -35,6 +37,7 @@ import { SettingLevel } from "../../../../src/settings/SettingLevel"; import { Action } from "../../../../src/dispatcher/actions"; import Modal from "../../../../src/Modal"; import { SETTINGS } from "../../../../src/settings/Settings"; +import ToastStore from "../../../../src/stores/ToastStore"; // Create a mock resizer instance that can be shared across tests const mockResizerInstance = { @@ -505,6 +508,29 @@ describe("", () => { }); }); + describe("resource limit exceeded errors", () => { + it("pops a toast when M_RESOURCE_LIMIT_EXCEEDED is seen down sync", async () => { + const addOrReplaceToast = jest.spyOn(ToastStore.sharedInstance(), "addOrReplaceToast"); + const dismissToast = jest.spyOn(ToastStore.sharedInstance(), "dismissToast"); + getComponent(); + mockClient.emit(ClientEvent.Sync, SyncState.Error, null, { + error: new MatrixError({ + errcode: "M_RESOURCE_LIMIT_EXCEEDED", + limit_type: "hs_disabled", + admin_contact: "admin@example.org", + }), + }); + expect(addOrReplaceToast).toHaveBeenCalledWith( + expect.objectContaining({ + key: "serverlimit", + title: "Warning", + }), + ); + mockClient.emit(ClientEvent.Sync, SyncState.Prepared, null, undefined); + expect(dismissToast).toHaveBeenCalledWith("serverlimit"); + }); + }); + describe("resizer preferences", () => { let mockResize: jest.Mock; let mockForHandleWithId: jest.Mock;