-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Switch to TestContainers for manging services in Playwright (#28860)
* Switch to TestContainers for manging services in Playwright Signed-off-by: Michael Telatynski <[email protected]> * Iterate Signed-off-by: Michael Telatynski <[email protected]> * Flip fixture dependency order Signed-off-by: Michael Telatynski <[email protected]> * Remove mas dep Signed-off-by: Michael Telatynski <[email protected]> * Iterate Signed-off-by: Michael Telatynski <[email protected]> * Iterate Signed-off-by: Michael Telatynski <[email protected]> * Iterate Signed-off-by: Michael Telatynski <[email protected]> * Iterate Signed-off-by: Michael Telatynski <[email protected]> * Iterate Signed-off-by: Michael Telatynski <[email protected]> * Iterate Signed-off-by: Michael Telatynski <[email protected]> * Update matrix-authentication-service in Playwright tests Signed-off-by: Michael Telatynski <[email protected]> * delint Signed-off-by: Michael Telatynski <[email protected]> * Fix SMTP port Signed-off-by: Michael Telatynski <[email protected]> * Iterate Signed-off-by: Michael Telatynski <[email protected]> * Comments Signed-off-by: Michael Telatynski <[email protected]> * Strip ansi from playwright logs to make them more readable Signed-off-by: Michael Telatynski <[email protected]> * Actually do the update Signed-off-by: Michael Telatynski <[email protected]> * Iterate Signed-off-by: Michael Telatynski <[email protected]> * Remove access to homeserver.config.baseUrl field in favour of homeserver.baseUrl Signed-off-by: Michael Telatynski <[email protected]> * Use sane default_server_config and specify server.invalid in the specific tests which demand it Signed-off-by: Michael Telatynski <[email protected]> * Fix mas run Signed-off-by: Michael Telatynski <[email protected]> * break cycle Signed-off-by: Michael Telatynski <[email protected]> * Iterate Signed-off-by: Michael Telatynski <[email protected]> * typo Signed-off-by: Michael Telatynski <[email protected]> * Iterate Signed-off-by: Michael Telatynski <[email protected]> * Iterate Signed-off-by: Michael Telatynski <[email protected]> * Iterate Signed-off-by: Michael Telatynski <[email protected]> * prettier Signed-off-by: Michael Telatynski <[email protected]> * Wire up basics of dendriteHomeserver Signed-off-by: Michael Telatynski <[email protected]> --------- Signed-off-by: Michael Telatynski <[email protected]>
- Loading branch information
Showing
61 changed files
with
1,925 additions
and
2,706 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,9 +9,10 @@ Please see LICENSE files in the repository root for full details. | |
import { type Page } from "@playwright/test"; | ||
|
||
import { test, expect } from "../../element-web-test"; | ||
import { test as masTest, registerAccountMas } from "../oidc"; | ||
import { registerAccountMas } from "../oidc"; | ||
import { isDendrite } from "../../plugins/homeserver/dendrite"; | ||
import { TestClientServerAPI } from "../csAPI"; | ||
import { masHomeserver } from "../../plugins/homeserver/synapse/masHomeserver.ts"; | ||
|
||
async function expectBackupVersionToBe(page: Page, version: string) { | ||
await expect(page.locator(".mx_SecureBackupPanel_statusList tr:nth-child(5) td")).toHaveText( | ||
|
@@ -24,22 +25,23 @@ async function expectBackupVersionToBe(page: Page, version: string) { | |
// These tests register an account with MAS because then we go through the "normal" registration flow | ||
// and crypto gets set up. Using the 'user' fixture create a a user an synthesizes an existing login, | ||
// which is faster but leaves us without crypto set up. | ||
masTest.describe("Encryption state after registration", () => { | ||
masTest.skip(isDendrite, "does not yet support MAS"); | ||
test.describe("Encryption state after registration", () => { | ||
test.use(masHomeserver); | ||
test.skip(isDendrite, "does not yet support MAS"); | ||
|
||
masTest("Key backup is enabled by default", async ({ page, mailhog, app }) => { | ||
test("Key backup is enabled by default", async ({ page, mailhogClient, app }) => { | ||
await page.goto("/#/login"); | ||
await page.getByRole("button", { name: "Continue" }).click(); | ||
await registerAccountMas(page, mailhog.api, "alice", "[email protected]", "Pa$sW0rD!"); | ||
await registerAccountMas(page, mailhogClient, "alice", "[email protected]", "Pa$sW0rD!"); | ||
|
||
await app.settings.openUserSettings("Security & Privacy"); | ||
await expect(page.getByText("This session is backing up your keys.")).toBeVisible(); | ||
}); | ||
|
||
masTest("user is prompted to set up recovery", async ({ page, mailhog, app }) => { | ||
test("user is prompted to set up recovery", async ({ page, mailhogClient, app }) => { | ||
await page.goto("/#/login"); | ||
await page.getByRole("button", { name: "Continue" }).click(); | ||
await registerAccountMas(page, mailhog.api, "alice", "[email protected]", "Pa$sW0rD!"); | ||
await registerAccountMas(page, mailhogClient, "alice", "[email protected]", "Pa$sW0rD!"); | ||
|
||
await page.getByRole("button", { name: "Add room" }).click(); | ||
await page.getByRole("menuitem", { name: "New room" }).click(); | ||
|
@@ -50,57 +52,53 @@ masTest.describe("Encryption state after registration", () => { | |
}); | ||
}); | ||
|
||
masTest.describe("Key backup reset from elsewhere", () => { | ||
masTest.skip(isDendrite, "does not yet support MAS"); | ||
test.describe("Key backup reset from elsewhere", () => { | ||
test.use(masHomeserver); | ||
test.skip(isDendrite, "does not yet support MAS"); | ||
|
||
masTest( | ||
"Key backup is disabled when reset from elsewhere", | ||
async ({ page, mailhog, request, masPrepare, homeserver }) => { | ||
const testUsername = "alice"; | ||
const testPassword = "Pa$sW0rD!"; | ||
test("Key backup is disabled when reset from elsewhere", async ({ page, mailhogClient, request, homeserver }) => { | ||
const testUsername = "alice"; | ||
const testPassword = "Pa$sW0rD!"; | ||
|
||
// there's a delay before keys are uploaded so the error doesn't appear immediately: use a fake | ||
// clock so we can skip the delay | ||
await page.clock.install(); | ||
// there's a delay before keys are uploaded so the error doesn't appear immediately: use a fake | ||
// clock so we can skip the delay | ||
await page.clock.install(); | ||
|
||
await page.goto("/#/login"); | ||
await page.getByRole("button", { name: "Continue" }).click(); | ||
await registerAccountMas(page, mailhog.api, testUsername, "[email protected]", testPassword); | ||
await page.goto("/#/login"); | ||
await page.getByRole("button", { name: "Continue" }).click(); | ||
await registerAccountMas(page, mailhogClient, testUsername, "[email protected]", testPassword); | ||
|
||
await page.getByRole("button", { name: "Add room" }).click(); | ||
await page.getByRole("menuitem", { name: "New room" }).click(); | ||
await page.getByRole("textbox", { name: "Name" }).fill("test room"); | ||
await page.getByRole("button", { name: "Create room" }).click(); | ||
await page.getByRole("button", { name: "Add room" }).click(); | ||
await page.getByRole("menuitem", { name: "New room" }).click(); | ||
await page.getByRole("textbox", { name: "Name" }).fill("test room"); | ||
await page.getByRole("button", { name: "Create room" }).click(); | ||
|
||
// @ts-ignore - this runs in the browser scope where mxMatrixClientPeg is a thing. Here, it is not. | ||
const accessToken = await page.evaluate(() => mxMatrixClientPeg.get().getAccessToken()); | ||
// @ts-ignore - this runs in the browser scope where mxMatrixClientPeg is a thing. Here, it is not. | ||
const accessToken = await page.evaluate(() => mxMatrixClientPeg.get().getAccessToken()); | ||
|
||
const csAPI = new TestClientServerAPI(request, homeserver, accessToken); | ||
const csAPI = new TestClientServerAPI(request, homeserver, accessToken); | ||
|
||
const backupInfo = await csAPI.getCurrentBackupInfo(); | ||
const backupInfo = await csAPI.getCurrentBackupInfo(); | ||
|
||
await csAPI.deleteBackupVersion(backupInfo.version); | ||
await csAPI.deleteBackupVersion(backupInfo.version); | ||
|
||
await page.getByRole("textbox", { name: "Send an encrypted message…" }).fill("/discardsession"); | ||
await page.getByRole("button", { name: "Send message" }).click(); | ||
await page.getByRole("textbox", { name: "Send an encrypted message…" }).fill("/discardsession"); | ||
await page.getByRole("button", { name: "Send message" }).click(); | ||
|
||
await page | ||
.getByRole("textbox", { name: "Send an encrypted message…" }) | ||
.fill("Message with broken key backup"); | ||
await page.getByRole("button", { name: "Send message" }).click(); | ||
await page.getByRole("textbox", { name: "Send an encrypted message…" }).fill("Message with broken key backup"); | ||
await page.getByRole("button", { name: "Send message" }).click(); | ||
|
||
// Should be the message we sent plus the room creation event | ||
await expect(page.locator(".mx_EventTile")).toHaveCount(2); | ||
await expect( | ||
page.locator(".mx_RoomView_MessageList > .mx_EventTile_last .mx_EventTile_receiptSent"), | ||
).toBeVisible(); | ||
// Should be the message we sent plus the room creation event | ||
await expect(page.locator(".mx_EventTile")).toHaveCount(2); | ||
await expect( | ||
page.locator(".mx_RoomView_MessageList > .mx_EventTile_last .mx_EventTile_receiptSent"), | ||
).toBeVisible(); | ||
|
||
// Wait for it to try uploading the key | ||
await page.clock.fastForward(20000); | ||
// Wait for it to try uploading the key | ||
await page.clock.fastForward(20000); | ||
|
||
await expect(page.getByRole("heading", { level: 1, name: "New Recovery Method" })).toBeVisible(); | ||
}, | ||
); | ||
await expect(page.getByRole("heading", { level: 1, name: "New Recovery Method" })).toBeVisible(); | ||
}); | ||
}); | ||
|
||
test.describe("Backups", () => { | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,13 +8,17 @@ Please see LICENSE files in the repository root for full details. | |
|
||
import { expect, test } from "../../element-web-test"; | ||
import { selectHomeserver } from "../utils"; | ||
import { emailHomeserver } from "../../plugins/homeserver/synapse/emailHomeserver.ts"; | ||
import { isDendrite } from "../../plugins/homeserver/dendrite"; | ||
|
||
const username = "user1234"; | ||
// this has to be password-like enough to please zxcvbn. Needless to say it's just from pwgen. | ||
const password = "oETo7MPf0o"; | ||
const email = "[email protected]"; | ||
|
||
test.describe("Forgot Password", () => { | ||
test.skip(isDendrite, "not yet wired up"); | ||
test.use(emailHomeserver); | ||
test.use({ | ||
config: { | ||
// The only thing that we really *need* (otherwise Element refuses to load) is a default homeserver. | ||
|
@@ -25,14 +29,6 @@ test.describe("Forgot Password", () => { | |
}, | ||
}, | ||
}, | ||
startHomeserverOpts: ({ mailhog }, use) => | ||
use({ | ||
template: "email", | ||
variables: { | ||
SMTP_HOST: "host.containers.internal", | ||
SMTP_PORT: mailhog.instance.smtpPort, | ||
}, | ||
}), | ||
}); | ||
|
||
test("renders properly", { tag: "@screenshot" }, async ({ page, homeserver }) => { | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.