Merge branch 't3chguy/prepare-playwright-testcontainers' of https://github.com/vector-im/element-web into t3chguy/playwright-testcontainers

# Conflicts:
#	playwright/e2e/app-loading/guest-registration.spec.ts
#	playwright/e2e/crypto/dehydration.spec.ts
#	playwright/e2e/crypto/utils.ts
#	playwright/e2e/forgot-password/forgot-password.spec.ts
#	playwright/e2e/login/soft_logout.spec.ts
#	playwright/e2e/oidc/index.ts
#	playwright/e2e/register/email.spec.ts
#	playwright/plugins/homeserver/index.ts
#	playwright/plugins/homeserver/synapse/index.ts
pull/28860/head
Michael Telatynski 2025-01-06 15:59:28 +00:00
commit e7b62c3b46
No known key found for this signature in database
GPG Key ID: A2B008A5F49F5D0D
14 changed files with 70 additions and 56 deletions

View File

@ -16,13 +16,6 @@ test.use({
synapseConfigOptions: { synapseConfigOptions: {
allow_guest_access: true, allow_guest_access: true,
}, },
config: async ({ homeserver }, use) => {
await use({
default_server_config: {
"m.homeserver": { base_url: homeserver.baseUrl },
},
});
},
}); });
test("Shows the welcome page by default", async ({ page }) => { test("Shows the welcome page by default", async ({ page }) => {

View File

@ -12,6 +12,15 @@ import { logIntoElement } from "./utils";
test.describe("Complete security", () => { test.describe("Complete security", () => {
test.use({ test.use({
displayName: "Jeff", displayName: "Jeff",
config: {
// The only thing that we really *need* (otherwise Element refuses to load) is a default homeserver.
// We point that to a guaranteed-invalid domain.
default_server_config: {
"m.homeserver": {
base_url: "https://server.invalid",
},
},
},
}); });
test("should go straight to the welcome screen if we have no signed device", async ({ test("should go straight to the welcome screen if we have no signed device", async ({
@ -19,7 +28,7 @@ test.describe("Complete security", () => {
homeserver, homeserver,
credentials, credentials,
}) => { }) => {
await logIntoElement(page, homeserver, credentials); await logIntoElement(page, credentials);
await expect(page.getByText("Welcome Jeff", { exact: true })).toBeVisible(); await expect(page.getByText("Welcome Jeff", { exact: true })).toBeVisible();
}); });

View File

@ -45,7 +45,7 @@ test.describe("Cryptography", function () {
await logOutOfElement(page, true); await logOutOfElement(page, true);
// Log in again, and see how the message looks. // Log in again, and see how the message looks.
await logIntoElement(page, homeserver, credentials); await logIntoElement(page, credentials);
await app.viewRoomByName("Test room"); await app.viewRoomByName("Test room");
const lastTile = page.locator(".mx_EventTile").last(); const lastTile = page.locator(".mx_EventTile").last();
await expect(lastTile).toContainText("Historical messages are not available on this device"); await expect(lastTile).toContainText("Historical messages are not available on this device");
@ -62,7 +62,7 @@ test.describe("Cryptography", function () {
// Finally, log out again, and back in, skipping verification for now, and see what we see. // Finally, log out again, and back in, skipping verification for now, and see what we see.
await logOutOfElement(page); await logOutOfElement(page);
await logIntoElement(page, homeserver, credentials); await logIntoElement(page, credentials);
await page.locator(".mx_AuthPage").getByRole("button", { name: "Skip verification for now" }).click(); await page.locator(".mx_AuthPage").getByRole("button", { name: "Skip verification for now" }).click();
await page.locator(".mx_AuthPage").getByRole("button", { name: "I'll verify later" }).click(); await page.locator(".mx_AuthPage").getByRole("button", { name: "I'll verify later" }).click();
await app.viewRoomByName("Test room"); await app.viewRoomByName("Test room");

View File

@ -30,11 +30,9 @@ test.describe("Dehydration", () => {
msc3814_enabled: true, msc3814_enabled: true,
}, },
}, },
config: async ({ homeserver, context }, use) => { config: async ({ config, context }, use) => {
const wellKnown = { const wellKnown = {
"m.homeserver": { ...config.default_server_config,
base_url: homeserver.baseUrl,
},
"org.matrix.msc3814": true, "org.matrix.msc3814": true,
}; };
@ -42,9 +40,7 @@ test.describe("Dehydration", () => {
await route.fulfill({ json: wellKnown }); await route.fulfill({ json: wellKnown });
}); });
await use({ await use(config);
default_server_config: wellKnown,
});
}, },
}); });

View File

@ -66,7 +66,7 @@ test.describe("Device verification", { tag: "@no-webkit" }, () => {
} }
test("Verify device with SAS during login", async ({ page, app, credentials, homeserver }) => { test("Verify device with SAS during login", async ({ page, app, credentials, homeserver }) => {
await logIntoElement(page, homeserver, credentials); await logIntoElement(page, credentials);
// Launch the verification request between alice and the bot // Launch the verification request between alice and the bot
const verificationRequest = await initiateAliceVerificationRequest(page); const verificationRequest = await initiateAliceVerificationRequest(page);
@ -93,7 +93,7 @@ test.describe("Device verification", { tag: "@no-webkit" }, () => {
test("Verify device with QR code during login", async ({ page, app, credentials, homeserver }) => { test("Verify device with QR code during login", async ({ page, app, credentials, homeserver }) => {
// A mode 0x02 verification: "self-verifying in which the current device does not yet trust the master key" // A mode 0x02 verification: "self-verifying in which the current device does not yet trust the master key"
await logIntoElement(page, homeserver, credentials); await logIntoElement(page, credentials);
// Launch the verification request between alice and the bot // Launch the verification request between alice and the bot
const verificationRequest = await initiateAliceVerificationRequest(page); const verificationRequest = await initiateAliceVerificationRequest(page);
@ -137,7 +137,7 @@ test.describe("Device verification", { tag: "@no-webkit" }, () => {
}); });
test("Verify device with Security Phrase during login", async ({ page, app, credentials, homeserver }) => { test("Verify device with Security Phrase during login", async ({ page, app, credentials, homeserver }) => {
await logIntoElement(page, homeserver, credentials); await logIntoElement(page, credentials);
// Select the security phrase // Select the security phrase
await page.locator(".mx_AuthPage").getByRole("button", { name: "Verify with Security Key or Phrase" }).click(); await page.locator(".mx_AuthPage").getByRole("button", { name: "Verify with Security Key or Phrase" }).click();
@ -158,7 +158,7 @@ test.describe("Device verification", { tag: "@no-webkit" }, () => {
}); });
test("Verify device with Security Key during login", async ({ page, app, credentials, homeserver }) => { test("Verify device with Security Key during login", async ({ page, app, credentials, homeserver }) => {
await logIntoElement(page, homeserver, credentials); await logIntoElement(page, credentials);
// Select the security phrase // Select the security phrase
await page.locator(".mx_AuthPage").getByRole("button", { name: "Verify with Security Key or Phrase" }).click(); await page.locator(".mx_AuthPage").getByRole("button", { name: "Verify with Security Key or Phrase" }).click();
@ -181,7 +181,7 @@ test.describe("Device verification", { tag: "@no-webkit" }, () => {
}); });
test("Handle incoming verification request with SAS", async ({ page, credentials, homeserver, toasts }) => { test("Handle incoming verification request with SAS", async ({ page, credentials, homeserver, toasts }) => {
await logIntoElement(page, homeserver, credentials); await logIntoElement(page, credentials);
/* Dismiss "Verify this device" */ /* Dismiss "Verify this device" */
const authPage = page.locator(".mx_AuthPage"); const authPage = page.locator(".mx_AuthPage");

View File

@ -207,7 +207,7 @@ test.describe("Cryptography", function () {
window.localStorage.clear(); window.localStorage.clear();
}); });
await page.reload(); await page.reload();
await logIntoElement(page, homeserver, aliceCredentials, securityKey); await logIntoElement(page, aliceCredentials, securityKey);
/* go back to the test room and find Bob's message again */ /* go back to the test room and find Bob's message again */
await app.viewRoomById(testRoomId); await app.viewRoomById(testRoomId);

View File

@ -11,7 +11,7 @@ import { createRoom, enableKeyBackup, logIntoElement, sendMessageInCurrentRoom }
test.describe("Logout tests", () => { test.describe("Logout tests", () => {
test.beforeEach(async ({ page, homeserver, credentials }) => { test.beforeEach(async ({ page, homeserver, credentials }) => {
await logIntoElement(page, homeserver, credentials); await logIntoElement(page, credentials);
}); });
test("Ask to set up recovery on logout if not setup", async ({ page, app }) => { test("Ask to set up recovery on logout if not setup", async ({ page, app }) => {

View File

@ -138,22 +138,9 @@ export async function checkDeviceIsConnectedKeyBackup(
* *
* If a `securityKey` is given, verifies the new device using the key. * If a `securityKey` is given, verifies the new device using the key.
*/ */
export async function logIntoElement( export async function logIntoElement(page: Page, credentials: Credentials, securityKey?: string) {
page: Page,
homeserver: HomeserverInstance,
credentials: Credentials,
securityKey?: string,
) {
await page.goto("/#/login"); await page.goto("/#/login");
// select homeserver
await page.getByRole("button", { name: "Edit" }).click();
await page.getByRole("textbox", { name: "Other homeserver" }).fill(homeserver.baseUrl);
await page.getByRole("button", { name: "Continue", exact: true }).click();
// wait for the dialog to go away
await expect(page.locator(".mx_ServerPickerDialog")).not.toBeVisible();
await page.getByRole("textbox", { name: "Username" }).fill(credentials.userId); await page.getByRole("textbox", { name: "Username" }).fill(credentials.userId);
await page.getByPlaceholder("Password").fill(credentials.password); await page.getByPlaceholder("Password").fill(credentials.password);
await page.getByRole("button", { name: "Sign in" }).click(); await page.getByRole("button", { name: "Sign in" }).click();

View File

@ -19,6 +19,17 @@ const email = "user@nowhere.dummy";
test.describe("Forgot Password", () => { test.describe("Forgot Password", () => {
test.skip(isDendrite, "not yet wired up"); test.skip(isDendrite, "not yet wired up");
test.use(emailHomeserver); test.use(emailHomeserver);
test.use({
config: {
// The only thing that we really *need* (otherwise Element refuses to load) is a default homeserver.
// We point that to a guaranteed-invalid domain.
default_server_config: {
"m.homeserver": {
base_url: "https://server.invalid",
},
},
},
});
test("renders properly", { tag: "@screenshot" }, async ({ page, homeserver }) => { test("renders properly", { tag: "@screenshot" }, async ({ page, homeserver }) => {
await page.goto("/"); await page.goto("/");

View File

@ -80,6 +80,18 @@ async function login(page: Page, homeserver: HomeserverInstance) {
} }
test.describe("Login", () => { test.describe("Login", () => {
test.use({
config: {
// The only thing that we really *need* (otherwise Element refuses to load) is a default homeserver.
// We point that to a guaranteed-invalid domain.
default_server_config: {
"m.homeserver": {
base_url: "https://server.invalid",
},
},
},
});
test.describe("Password login", () => { test.describe("Password login", () => {
test.use(consentHomeserver); test.use(consentHomeserver);

View File

@ -13,7 +13,7 @@ test.describe("Overwrite login action", () => {
// This seems terminally flakey: https://github.com/element-hq/element-web/issues/27363 // This seems terminally flakey: https://github.com/element-hq/element-web/issues/27363
// I tried verious things to try & deflake it, to no avail: https://github.com/matrix-org/matrix-react-sdk/pull/12506 // I tried verious things to try & deflake it, to no avail: https://github.com/matrix-org/matrix-react-sdk/pull/12506
test.skip("Try replace existing login with new one", async ({ page, app, credentials, homeserver }) => { test.skip("Try replace existing login with new one", async ({ page, app, credentials, homeserver }) => {
await logIntoElement(page, homeserver, credentials); await logIntoElement(page, credentials);
const userMenu = await app.openUserMenu(); const userMenu = await app.openUserMenu();
await expect(userMenu.getByText(credentials.userId)).toBeVisible(); await expect(userMenu.getByText(credentials.userId)).toBeVisible();

View File

@ -16,6 +16,15 @@ import { legacyOAuthHomeserver } from "../../plugins/homeserver/synapse/legacyOA
test.describe("Soft logout", () => { test.describe("Soft logout", () => {
test.use({ test.use({
displayName: "Alice", displayName: "Alice",
config: {
// The only thing that we really *need* (otherwise Element refuses to load) is a default homeserver.
// We point that to a guaranteed-invalid domain.
default_server_config: {
"m.homeserver": {
base_url: "https://server.invalid",
},
},
},
}); });
test.describe("with password user", () => { test.describe("with password user", () => {

View File

@ -16,10 +16,9 @@ test.describe("Email Registration", async () => {
test.use({ test.use({
config: ({ homeserver }, use) => config: ({ homeserver }, use) =>
use({ use({
...config,
default_server_config: { default_server_config: {
"m.homeserver": { ...config.default_server_config,
base_url: homeserver.baseUrl,
},
"m.identity_server": { "m.identity_server": {
base_url: "https://server.invalid", base_url: "https://server.invalid",
}, },

View File

@ -25,18 +25,8 @@ import { test as base } from "./services.ts";
// See https://playwright.dev/docs/service-workers-experimental#how-to-enable // See https://playwright.dev/docs/service-workers-experimental#how-to-enable
process.env["PW_EXPERIMENTAL_SERVICE_WORKER_NETWORK_EVENTS"] = "1"; process.env["PW_EXPERIMENTAL_SERVICE_WORKER_NETWORK_EVENTS"] = "1";
// This is deliberately quite a minimal config.json, so that we can test that the default settings actually work.
const CONFIG_JSON: Partial<IConfigOptions> = { const CONFIG_JSON: Partial<IConfigOptions> = {
// This is deliberately quite a minimal config.json, so that we can test that the default settings
// actually work.
//
// The only thing that we really *need* (otherwise Element refuses to load) is a default homeserver.
// We point that to a guaranteed-invalid domain.
default_server_config: {
"m.homeserver": {
base_url: "https://server.invalid",
},
},
// The default language is set here for test consistency // The default language is set here for test consistency
setting_defaults: { setting_defaults: {
language: "en-GB", language: "en-GB",
@ -120,10 +110,18 @@ export const test = base.extend<Fixtures>({
); );
await use(context); await use(context);
}, },
config: CONFIG_JSON, config: {}, // We merge this atop the default CONFIG_JSON in the page fixture to make extending it easier
page: async ({ context, page, config, labsFlags }, use) => { page: async ({ homeserver, context, page, config, labsFlags }, use) => {
await context.route(`http://localhost:8080/config.json*`, async (route) => { await context.route(`http://localhost:8080/config.json*`, async (route) => {
const json = { ...CONFIG_JSON, ...config }; const json = {
...CONFIG_JSON,
default_server_config: {
"m.homeserver": {
base_url: homeserver.baseUrl,
},
},
...config,
};
json["features"] = { json["features"] = {
...json["features"], ...json["features"],
// Enable the lab features // Enable the lab features