From 5caad701916acaa19971ed6467c8667d305f7334 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 8 Jan 2025 10:52:01 +0000 Subject: [PATCH] Stabilise sliding sync playwright test (#28879) * Stabilise sliding sync playwright test There's no guarantee that the unsubscription & subscription occur in the same request given the add/remove APIs are async Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Stabilise more sliding sync tests Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --------- Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../e2e/sliding-sync/sliding-sync.spec.ts | 55 ++++++++++--------- playwright/element-web-test.ts | 1 + 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/playwright/e2e/sliding-sync/sliding-sync.spec.ts b/playwright/e2e/sliding-sync/sliding-sync.spec.ts index 35027746b0f..29a612ccd32 100644 --- a/playwright/e2e/sliding-sync/sliding-sync.spec.ts +++ b/playwright/e2e/sliding-sync/sliding-sync.spec.ts @@ -371,37 +371,42 @@ test.describe("Sliding Sync", () => { roomIds.push(id); await expect(page.getByRole("treeitem", { name: fruit })).toBeVisible(); } - const [roomAId, roomPId] = roomIds; + const [roomAId, roomPId, roomOId] = roomIds; - const assertUnsubExists = (request: Request, subRoomId: string, unsubRoomId: string) => { + const matchRoomSubRequest = (subRoomId: string) => (request: Request) => { + if (!request.url().includes("/sync")) return false; const body = request.postDataJSON(); - // There may be a request without a txn_id, ignore it, as there won't be any subscription changes - if (body.txn_id === undefined) { - return; - } - expect(body.unsubscribe_rooms).toEqual([unsubRoomId]); - expect(body.room_subscriptions).not.toHaveProperty(unsubRoomId); - expect(body.room_subscriptions).toHaveProperty(subRoomId); + return body.txn_id && body.room_subscriptions?.[subRoomId]; + }; + const matchRoomUnsubRequest = (unsubRoomId: string) => (request: Request) => { + if (!request.url().includes("/sync")) return false; + const body = request.postDataJSON(); + return ( + body.txn_id && body.unsubscribe_rooms?.includes(unsubRoomId) && !body.room_subscriptions?.[unsubRoomId] + ); }; - let promise = page.waitForRequest(/sync/); - - // Select the Test Room - await page.getByRole("treeitem", { name: "Apple", exact: true }).click(); - - // and wait for playwright to get the request - const roomSubscriptions = (await promise).postDataJSON().room_subscriptions; + // Select the Test Room and wait for playwright to get the request + const [request] = await Promise.all([ + page.waitForRequest(matchRoomSubRequest(roomAId)), + page.getByRole("treeitem", { name: "Apple", exact: true }).click(), + ]); + const roomSubscriptions = request.postDataJSON().room_subscriptions; expect(roomSubscriptions, "room_subscriptions is object").toBeDefined(); - // Switch to another room - promise = page.waitForRequest(/sync/); - await page.getByRole("treeitem", { name: "Pineapple", exact: true }).click(); - assertUnsubExists(await promise, roomPId, roomAId); - - // And switch to even another room - promise = page.waitForRequest(/sync/); - await page.getByRole("treeitem", { name: "Apple", exact: true }).click(); - assertUnsubExists(await promise, roomPId, roomAId); + // Switch to another room and wait for playwright to get the request + await Promise.all([ + page.waitForRequest(matchRoomSubRequest(roomPId)), + page.waitForRequest(matchRoomUnsubRequest(roomAId)), + page.getByRole("treeitem", { name: "Pineapple", exact: true }).click(), + ]); + + // And switch to even another room and wait for playwright to get the request + await Promise.all([ + page.waitForRequest(matchRoomSubRequest(roomOId)), + page.waitForRequest(matchRoomUnsubRequest(roomPId)), + page.getByRole("treeitem", { name: "Orange", exact: true }).click(), + ]); // TODO: Add tests for encrypted rooms }); diff --git a/playwright/element-web-test.ts b/playwright/element-web-test.ts index f2f2afd3b95..d8d4f872b97 100644 --- a/playwright/element-web-test.ts +++ b/playwright/element-web-test.ts @@ -167,6 +167,7 @@ export const test = base.extend({ window.localStorage.setItem( "mx_local_settings", JSON.stringify({ + // Retain any other settings which may have already been set ...JSON.parse(window.localStorage.getItem("mx_local_settings") || "{}"), // Ensure the language is set to a consistent value language: "en",