/* Copyright 2024 New Vector Ltd. Copyright 2023 The Matrix.org Foundation C.I.C. Copyright 2022 Mikhail Aheichyk Copyright 2022 Nordeck IT + Consulting GmbH. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ import { test } from "../../element-web-test"; import { waitForRoom } from "../utils"; const DEMO_WIDGET_ID = "demo-widget-id"; const DEMO_WIDGET_NAME = "Demo Widget"; const DEMO_WIDGET_TYPE = "demo"; const ROOM_NAME = "Demo"; const DEMO_WIDGET_HTML = ` Demo Widget `; test.describe("Widget Events", () => { test.use({ displayName: "Mike", botCreateOpts: { displayName: "Bot", autoAcceptInvites: true }, }); let demoWidgetUrl: string; test.beforeEach(async ({ webserver }) => { demoWidgetUrl = webserver.start(DEMO_WIDGET_HTML); }); test("should be updated if user is re-invited into the room with updated state event", async ({ page, app, user, bot, }) => { const roomId = await app.client.createRoom({ name: ROOM_NAME, invite: [bot.credentials.userId], }); // setup widget via state event await app.client.sendStateEvent( roomId, "im.vector.modular.widgets", { id: DEMO_WIDGET_ID, creatorUserId: "somebody", type: DEMO_WIDGET_TYPE, name: DEMO_WIDGET_NAME, url: demoWidgetUrl, }, DEMO_WIDGET_ID, ); // set initial layout await app.client.sendStateEvent( roomId, "io.element.widgets.layout", { widgets: { [DEMO_WIDGET_ID]: { container: "top", index: 1, width: 100, height: 0, }, }, }, "", ); // open the room await app.viewRoomByName(ROOM_NAME); // approve capabilities await page.locator(".mx_WidgetCapabilitiesPromptDialog").getByRole("button", { name: "Approve" }).click(); // bot creates a new room with 'm.room.topic' const roomNew = await bot.createRoom({ name: "New room", initial_state: [ { type: "m.room.topic", state_key: "", content: { topic: "topic initial", }, }, ], }); await bot.inviteUser(roomNew, user.userId); // widget should receive 'm.room.topic' event after invite await waitForRoom(page, app.client, roomId, (room) => { const events = room.getLiveTimeline().getEvents(); return events.some( (e) => e.getType() === "net.widget_echo" && e.getContent().type === "m.room.topic" && e.getContent().content.topic === "topic initial", ); }); // update the topic await bot.sendStateEvent( roomNew, "m.room.topic", { topic: "topic updated", }, "", ); await bot.inviteUser(roomNew, user.userId); // widget should receive updated 'm.room.topic' event after re-invite await waitForRoom(page, app.client, roomId, (room) => { const events = room.getLiveTimeline().getEvents(); return events.some( (e) => e.getType() === "net.widget_echo" && e.getContent().type === "m.room.topic" && e.getContent().content.topic === "topic updated", ); }); }); });