Playwright test for dehydrated devices with MAS (#34095)
* Device dehydration tests: use common util for recovery setup We have a utility method for setting up the recovery key, so let's use it. * Factor out shared method for creating encrypted rooms * Playwright test for device dehydration Add a playwright test to check that this stuff actually works. * Factor out `verifyAfterLogin` as a separate function * Playwright test for dehydrated devices with MAS
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
Copyright 2026 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 { expect, test } from "../../element-web-test.ts";
|
||||
import { masHomeserver } from "../../plugins/homeserver/synapse/masHomeserver.ts";
|
||||
import {
|
||||
autoJoin,
|
||||
createSharedEncryptedRoomWithUser,
|
||||
enableKeyBackup,
|
||||
logOutOfElement,
|
||||
verifyAfterLogin,
|
||||
} from "./utils.ts";
|
||||
import { registerAccountMas } from "../oidc";
|
||||
import { Bot } from "../../pages/bot.ts";
|
||||
|
||||
test.use({
|
||||
...masHomeserver,
|
||||
synapseConfig: {
|
||||
experimental_features: {
|
||||
msc2697_enabled: false,
|
||||
msc3814_enabled: true,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
test.describe("Device dehydration, on a MAS-enabled homeserver", () => {
|
||||
test("Can read messages sent while logged out", async ({ mailpitClient, homeserver, page, app }, testInfo) => {
|
||||
test.slow();
|
||||
const aliceUserId = `alice_${testInfo.testId}`;
|
||||
const alicePassword = "Pa$sW0rD!";
|
||||
|
||||
const recoveryKey =
|
||||
await test.step("Alice registers and sets up recovery => a dehydrated device is created", async () => {
|
||||
await page.goto("/#/login");
|
||||
await page.getByRole("button", { name: "Continue" }).click();
|
||||
|
||||
await registerAccountMas(page, mailpitClient, aliceUserId, `${aliceUserId}@email.com`, alicePassword);
|
||||
return await enableKeyBackup(app);
|
||||
});
|
||||
|
||||
const [bob, testRoomId] = await test.step("Bob registers and joins a room with Alice", async () => {
|
||||
const bob = new Bot(page, homeserver, { displayName: "Bob" });
|
||||
await autoJoin(bob);
|
||||
|
||||
// Create an encrypted room, and wait for Bob to join it.
|
||||
const testRoomId = await createSharedEncryptedRoomWithUser(app, bob.credentials.userId);
|
||||
|
||||
// Even though Alice has seen Bob's join event, Bob may not have done so yet. Wait for the sync to arrive.
|
||||
await bob.awaitRoomMembership(testRoomId);
|
||||
return [bob, testRoomId];
|
||||
});
|
||||
|
||||
await test.step("Alice logs out", async () => {
|
||||
await logOutOfElement(page);
|
||||
});
|
||||
|
||||
await test.step("Bob sends a message", async () => {
|
||||
await bob.sendMessage(testRoomId, "test encrypted 1");
|
||||
});
|
||||
|
||||
await test.step("Alice logs in again", async () => {
|
||||
await page.getByRole("link", { name: "Sign in" }).click();
|
||||
await page.getByRole("button", { name: "Continue" }).click();
|
||||
|
||||
await expect(page.getByText("Continue to Element?")).toBeVisible();
|
||||
await page.getByRole("button", { name: "Continue" }).click();
|
||||
|
||||
await verifyAfterLogin(page, recoveryKey);
|
||||
await app.viewRoomById(testRoomId);
|
||||
});
|
||||
|
||||
await test.step("Alice can decrypt Bob's message", async () => {
|
||||
await expect(page.getByText("test encrypted 1")).toBeVisible();
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user