From a985281b46e90eb80c4c4d61fa476ab8ca9dc28a Mon Sep 17 00:00:00 2001 From: Valere Date: Mon, 19 Jan 2026 13:58:36 +0100 Subject: [PATCH 1/3] playwright: intercept send request to ensure sticky event are sent --- playwright/spa-call-sticky.spec.ts | 39 +++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/playwright/spa-call-sticky.spec.ts b/playwright/spa-call-sticky.spec.ts index 58e9c997..8a0acf5a 100644 --- a/playwright/spa-call-sticky.spec.ts +++ b/playwright/spa-call-sticky.spec.ts @@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE in the repository root for full details. */ -import { test } from "@playwright/test"; +import { expect, test } from "@playwright/test"; import { SpaHelpers } from "./spa-helpers"; @@ -21,7 +21,19 @@ test("One to One call using matrix rtc 2.0 aka sticky events", async ({ await page.goto("/"); - await SpaHelpers.createCall(page, "John Doe", "HelloCall", true, "2_0"); + let androlHasSentStickyEvent = false; + + await page.route( + "**/_matrix/client/v3/rooms/**/send/org.matrix.msc4143.rtc.member/**", + async (route, req) => { + androlHasSentStickyEvent = !!new URL(req.url()).searchParams.get( + "org.matrix.msc4354.sticky_duration_ms", + ); + return route.continue(); + }, + ); + + await SpaHelpers.createCall(page, "Androl", "HelloCall", true, "2_0"); const inviteLink = await SpaHelpers.getCallInviteLink(page); @@ -33,8 +45,29 @@ test("One to One call using matrix rtc 2.0 aka sticky events", async ({ await guestPage.goto("/"); - await SpaHelpers.joinCallFromInviteLink(guestPage, inviteLink); + let pevaraHasSentStickyEvent = false; + + await guestPage.route( + "**/_matrix/client/v3/rooms/**/send/org.matrix.msc4143.rtc.member/**", + async (route, req) => { + pevaraHasSentStickyEvent = !!new URL(req.url()).searchParams.get( + "org.matrix.msc4354.sticky_duration_ms", + ); + return route.continue(); + }, + ); + + await SpaHelpers.joinCallFromInviteLink( + guestPage, + inviteLink, + "Pevara", + "2_0", + ); await SpaHelpers.expectVideoTilesCount(page, 2); await SpaHelpers.expectVideoTilesCount(guestPage, 2); + + // Assert both sides have sent sticky membership events + expect(androlHasSentStickyEvent).toEqual(true); + expect(pevaraHasSentStickyEvent).toEqual(true); }); From ed8cee9f586c8812ca7ff258907fb9504fc8f2f7 Mon Sep 17 00:00:00 2001 From: Valere Date: Mon, 19 Jan 2026 15:28:22 +0100 Subject: [PATCH 2/3] review: fix/clean the route interception --- playwright/spa-call-sticky.spec.ts | 48 +++++++++++++++++++----------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/playwright/spa-call-sticky.spec.ts b/playwright/spa-call-sticky.spec.ts index 8a0acf5a..99360197 100644 --- a/playwright/spa-call-sticky.spec.ts +++ b/playwright/spa-call-sticky.spec.ts @@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE in the repository root for full details. */ -import { expect, test } from "@playwright/test"; +import { expect, type Page, test, type Request } from "@playwright/test"; import { SpaHelpers } from "./spa-helpers"; @@ -23,15 +23,10 @@ test("One to One call using matrix rtc 2.0 aka sticky events", async ({ let androlHasSentStickyEvent = false; - await page.route( - "**/_matrix/client/v3/rooms/**/send/org.matrix.msc4143.rtc.member/**", - async (route, req) => { - androlHasSentStickyEvent = !!new URL(req.url()).searchParams.get( - "org.matrix.msc4354.sticky_duration_ms", - ); - return route.continue(); - }, - ); + await interceptEventSend(page, "org.matrix.msc4143.rtc.member", (req) => { + androlHasSentStickyEvent = + androlHasSentStickyEvent || isStickySend(req.url()); + }); await SpaHelpers.createCall(page, "Androl", "HelloCall", true, "2_0"); @@ -47,13 +42,12 @@ test("One to One call using matrix rtc 2.0 aka sticky events", async ({ let pevaraHasSentStickyEvent = false; - await guestPage.route( - "**/_matrix/client/v3/rooms/**/send/org.matrix.msc4143.rtc.member/**", - async (route, req) => { - pevaraHasSentStickyEvent = !!new URL(req.url()).searchParams.get( - "org.matrix.msc4354.sticky_duration_ms", - ); - return route.continue(); + await interceptEventSend( + guestPage, + "org.matrix.msc4143.rtc.member", + (req) => { + pevaraHasSentStickyEvent = + pevaraHasSentStickyEvent || isStickySend(req.url()); }, ); @@ -71,3 +65,23 @@ test("One to One call using matrix rtc 2.0 aka sticky events", async ({ expect(androlHasSentStickyEvent).toEqual(true); expect(pevaraHasSentStickyEvent).toEqual(true); }); + +function isStickySend(url: string): boolean { + return !!new URL(url).searchParams.get( + "org.matrix.msc4354.sticky_duration_ms", + ); +} + +async function interceptEventSend( + page: Page, + eventType: string, + callback: (request: Request) => void, +): Promise { + await page.route( + `**/_matrix/client/v3/rooms/**/send/${eventType}/**`, + async (route, req) => { + callback(req); + return route.continue(); + }, + ); +} From 9f323d21a81df89cbb41706018c6dc26ddd13712 Mon Sep 17 00:00:00 2001 From: Valere Date: Tue, 20 Jan 2026 08:10:50 +0100 Subject: [PATCH 3/3] review: quick comment --- playwright/spa-call-sticky.spec.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/playwright/spa-call-sticky.spec.ts b/playwright/spa-call-sticky.spec.ts index 99360197..ea2355d1 100644 --- a/playwright/spa-call-sticky.spec.ts +++ b/playwright/spa-call-sticky.spec.ts @@ -23,10 +23,15 @@ test("One to One call using matrix rtc 2.0 aka sticky events", async ({ let androlHasSentStickyEvent = false; - await interceptEventSend(page, "org.matrix.msc4143.rtc.member", (req) => { - androlHasSentStickyEvent = - androlHasSentStickyEvent || isStickySend(req.url()); - }); + await interceptEventSend( + page, + // This room is not encrypted, so the event is sent in clear + "org.matrix.msc4143.rtc.member", + (req) => { + androlHasSentStickyEvent = + androlHasSentStickyEvent || isStickySend(req.url()); + }, + ); await SpaHelpers.createCall(page, "Androl", "HelloCall", true, "2_0"); @@ -44,6 +49,7 @@ test("One to One call using matrix rtc 2.0 aka sticky events", async ({ await interceptEventSend( guestPage, + // This room is not encrypted, so the event is sent in clear "org.matrix.msc4143.rtc.member", (req) => { pevaraHasSentStickyEvent =