Skip to content

Commit 5f8a8d4

Browse files
authored
Merge pull request #3294 from element-hq/fkwp/docker_compose/resolve_conflicting_ports
Fix Playwright tests
2 parents d253474 + a548c5d commit 5f8a8d4

File tree

4 files changed

+76
-63
lines changed

4 files changed

+76
-63
lines changed

.github/workflows/test.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ jobs:
4646
run: yarn playwright install --with-deps
4747
- name: Run backend components
4848
run: |
49-
docker compose -f playwright-backend-docker-compose.yml up -d
49+
docker compose -f playwright-backend-docker-compose.yml -f playwright-backend-docker-compose.override.yml pull
50+
docker compose -f playwright-backend-docker-compose.yml -f playwright-backend-docker-compose.override.yml up -d
5051
docker ps
5152
- name: Copy config file
5253
run: cp config/config.devenv.json public/config.json

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"test": "vitest",
2323
"test:coverage": "vitest --coverage",
2424
"backend": "docker-compose -f dev-backend-docker-compose.yml up",
25+
"backend-playwright": "docker-compose -f playwright-backend-docker-compose.yml -f playwright-backend-docker-compose.override.yml up",
2526
"test:playwright": "playwright test",
2627
"test:playwright:open": "yarn test:playwright --ui",
2728
"links:enable": "mv .links.disabled.yaml .links.yaml & touch .links.yaml",

playwright/fixtures/widget-user.ts

Lines changed: 66 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,13 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
55
Please see LICENSE in the repository root for full details.
66
*/
77

8-
import { type Page, test, expect, type JSHandle } from "@playwright/test";
8+
import {
9+
type Browser,
10+
type Page,
11+
test,
12+
expect,
13+
type JSHandle,
14+
} from "@playwright/test";
915

1016
import type { MatrixClient } from "matrix-js-sdk";
1117

@@ -30,8 +36,8 @@ const PASSWORD = "foobarbaz1!";
3036
const CONFIG_JSON = {
3137
default_server_config: {
3238
"m.homeserver": {
33-
base_url: "http://synapse.localhost:8008",
34-
server_name: "synapse.localhost",
39+
base_url: "https://synapse.m.localhost",
40+
server_name: "synapse.m.localhost",
3541
},
3642
},
3743

@@ -74,6 +80,52 @@ async function setDevToolElementCallDevUrl(page: Page): Promise<void> {
7480
});
7581
}
7682

83+
/**
84+
* Registers a new user and returns page, clientHandle and mxId.
85+
*/
86+
async function registerUser(
87+
browser: Browser,
88+
username: string,
89+
): Promise<{ page: Page; clientHandle: JSHandle<MatrixClient>; mxId: string }> {
90+
const userContext = await browser.newContext({
91+
reducedMotion: "reduce",
92+
});
93+
const page = await userContext.newPage();
94+
await page.goto("http://localhost:8081/#/welcome");
95+
await page.getByRole("link", { name: "Create Account" }).click();
96+
await page.getByRole("textbox", { name: "Username" }).fill(username);
97+
await page
98+
.getByRole("textbox", { name: "Password", exact: true })
99+
.fill(PASSWORD);
100+
await page.getByRole("textbox", { name: "Confirm password" }).click();
101+
await page.getByRole("textbox", { name: "Confirm password" }).fill(PASSWORD);
102+
await page.getByRole("button", { name: "Register" }).click();
103+
const continueButton = page.getByRole("button", { name: "Continue" });
104+
try {
105+
await expect(continueButton).toBeVisible({ timeout: 5000 });
106+
await page
107+
.getByRole("textbox", { name: "Password", exact: true })
108+
.fill(PASSWORD);
109+
await continueButton.click();
110+
} catch {
111+
// continueButton not visible, continue as normal
112+
}
113+
await expect(
114+
page.getByRole("heading", { name: `Welcome ${username}` }),
115+
).toBeVisible();
116+
await setDevToolElementCallDevUrl(page);
117+
118+
const clientHandle = await page.evaluateHandle(() =>
119+
window.mxMatrixClientPeg.get(),
120+
);
121+
const mxId = (await clientHandle.evaluate(
122+
(cli: MatrixClient) => cli.getUserId(),
123+
clientHandle,
124+
))!;
125+
126+
return { page, clientHandle, mxId };
127+
}
128+
77129
export const widgetTest = test.extend<MyFixtures>({
78130
asWidget: async ({ browser, context }, pUse) => {
79131
await context.route(`http://localhost:8081/config.json*`, async (route) => {
@@ -83,61 +135,17 @@ export const widgetTest = test.extend<MyFixtures>({
83135
const userA = `brooks_${Date.now()}`;
84136
const userB = `whistler_${Date.now()}`;
85137

86-
const user1Context = await browser.newContext({
87-
reducedMotion: "reduce",
88-
});
89-
const ewPage1 = await user1Context.newPage();
90-
// Register the first user
91-
await ewPage1.goto("http://localhost:8081/#/welcome");
92-
await ewPage1.getByRole("link", { name: "Create Account" }).click();
93-
await ewPage1.getByRole("textbox", { name: "Username" }).fill(userA);
94-
await ewPage1
95-
.getByRole("textbox", { name: "Password", exact: true })
96-
.fill(PASSWORD);
97-
await ewPage1.getByRole("textbox", { name: "Confirm password" }).click();
98-
await ewPage1
99-
.getByRole("textbox", { name: "Confirm password" })
100-
.fill(PASSWORD);
101-
await ewPage1.getByRole("button", { name: "Register" }).click();
102-
await expect(
103-
ewPage1.getByRole("heading", { name: `Welcome ${userA}` }),
104-
).toBeVisible();
105-
await setDevToolElementCallDevUrl(ewPage1);
106-
107-
const brooksClientHandle = await ewPage1.evaluateHandle(() =>
108-
window.mxMatrixClientPeg.get(),
109-
);
110-
const brooksMxId = (await brooksClientHandle.evaluate((cli) => {
111-
return cli.getUserId();
112-
}, brooksClientHandle))!;
113-
114-
const user2Context = await browser.newContext({
115-
reducedMotion: "reduce",
116-
});
117-
const ewPage2 = await user2Context.newPage();
118-
// Register the second user
119-
await ewPage2.goto("http://localhost:8081/#/welcome");
120-
await ewPage2.getByRole("link", { name: "Create Account" }).click();
121-
await ewPage2.getByRole("textbox", { name: "Username" }).fill(userB);
122-
await ewPage2
123-
.getByRole("textbox", { name: "Password", exact: true })
124-
.fill(PASSWORD);
125-
await ewPage2.getByRole("textbox", { name: "Confirm password" }).click();
126-
await ewPage2
127-
.getByRole("textbox", { name: "Confirm password" })
128-
.fill(PASSWORD);
129-
await ewPage2.getByRole("button", { name: "Register" }).click();
130-
await expect(
131-
ewPage2.getByRole("heading", { name: `Welcome ${userB}` }),
132-
).toBeVisible();
133-
await setDevToolElementCallDevUrl(ewPage2);
134-
135-
const whistlerClientHandle = await ewPage2.evaluateHandle(() =>
136-
window.mxMatrixClientPeg.get(),
137-
);
138-
const whistlerMxId = (await whistlerClientHandle.evaluate((cli) => {
139-
return cli.getUserId();
140-
}, whistlerClientHandle))!;
138+
// Register users
139+
const {
140+
page: ewPage1,
141+
clientHandle: brooksClientHandle,
142+
mxId: brooksMxId,
143+
} = await registerUser(browser, userA);
144+
const {
145+
page: ewPage2,
146+
clientHandle: whistlerClientHandle,
147+
mxId: whistlerMxId,
148+
} = await registerUser(browser, userB);
141149

142150
// Invite the second user
143151
await ewPage1.getByRole("button", { name: "Add room" }).click();

playwright/widget/simple-create.spec.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,14 @@ import { expect, test } from "@playwright/test";
99

1010
import { widgetTest } from "../fixtures/widget-user.ts";
1111

12+
// Skip test, including Fixtures
13+
widgetTest.skip(
14+
({ browserName }) => browserName === "firefox",
15+
"This test is not working on firefox, after hangup brooks is locked in a strange state with a blank widget",
16+
);
17+
1218
widgetTest("Start a new call as widget", async ({ asWidget, browserName }) => {
13-
test.skip(
14-
browserName === "firefox",
15-
"This test is not working on firefox, after hangup brooks is locked in a strange state with a blank widget",
16-
);
19+
test.slow(); // Triples the timeout
1720

1821
const { brooks, whistler } = asWidget;
1922

0 commit comments

Comments
 (0)