From 757e4e1395fa1c84510d61b8911f04ba3f5c9cb0 Mon Sep 17 00:00:00 2001 From: Half-Shot <will@half-shot.uk> Date: Tue, 3 Jun 2025 13:57:57 +0100 Subject: [PATCH] Update tests --- .../e2e/modules/custom-component.spec.ts | 5 +++++ .../sample-files/custom-component-module.js | 12 +++++++++++- ...stom-component-tile-fall-through-linux.png | Bin 0 -> 3803 bytes .../custom-component-tile-linux.png | Bin 4128 -> 4098 bytes 4 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-fall-through-linux.png diff --git a/playwright/e2e/modules/custom-component.spec.ts b/playwright/e2e/modules/custom-component.spec.ts index e0741f18ce..0a48c800c7 100644 --- a/playwright/e2e/modules/custom-component.spec.ts +++ b/playwright/e2e/modules/custom-component.spec.ts @@ -28,6 +28,11 @@ test.describe("Custom Component Module", () => { await app.client.sendMessage(room.roomId, "Simple message"); await expect(await page.getByText("Simple message")).toMatchScreenshot("custom-component-tile.png"); }); + test("should fall through if one module does not render a component", { tag: "@screenshot" }, async ({ page, room, app }) => { + await app.viewRoomById(room.roomId); + await app.client.sendMessage(room.roomId, "Fall through here"); + await expect(await page.getByText("Fall through here")).toMatchScreenshot("custom-component-tile-fall-through.png"); + }); test( "should render the original content of a textual event conditionally", { tag: "@screenshot" }, diff --git a/playwright/sample-files/custom-component-module.js b/playwright/sample-files/custom-component-module.js index 14cd378838..62cfe883da 100644 --- a/playwright/sample-files/custom-component-module.js +++ b/playwright/sample-files/custom-component-module.js @@ -9,13 +9,23 @@ export default class CustomComponentModule { static moduleApiVersion = "^1.0.0"; constructor(api) { this.api = api; - this.api.customComponents.register("TextualBody", (props, originalComponent) => { + this.api.customComponents.registerMessageRenderer("m.room.message", (props, originalComponent) => { const body = props.mxEvent.getContent().body; if (body === "Do not replace me") { return originalComponent(); } + else if (body === "Fall through here"){ + return null; + } return `Custom text for ${body}`; }); + this.api.customComponents.registerMessageRenderer(/m\.room\.message/, (props) => { + const body = props.mxEvent.getContent().body; + if (body !== "Fall through here") { + return null; + } + return `Fallthrough text for ${body}`; + }); } async load() {} } diff --git a/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-fall-through-linux.png b/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-fall-through-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..952b0110b6526bed692a63031cc063ba9fd7165c GIT binary patch literal 3803 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 literal 0 HcmV?d00001 diff --git a/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-linux.png b/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-linux.png index ed626c902a1972a8c65cea633abe6f492521b80a..410365982b864a0a97d16e2a78a4acf3421ef15a 100644 GIT binary patch delta 4087 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 delta 4118 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 -- GitLab