Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c5367c2

Browse files
authored
test: fix url checks in e2e tests (coder#12881)
1 parent 93b46fe commit c5367c2

File tree

5 files changed

+54
-21
lines changed

5 files changed

+54
-21
lines changed

site/e2e/expectUrl.ts

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { expect, type Page } from "@playwright/test";
2+
3+
type PollingOptions = { timeout?: number; intervals?: number[] };
4+
5+
export const expectUrl = expect.extend({
6+
/**
7+
* toHavePathName is an alternative to `toHaveURL` that won't fail if the URL contains query parameters.
8+
*/
9+
async toHavePathName(page: Page, expected: string, options?: PollingOptions) {
10+
let actual: string = new URL(page.url()).pathname;
11+
let pass: boolean;
12+
try {
13+
await expect
14+
.poll(() => (actual = new URL(page.url()).pathname), options)
15+
.toBe(expected);
16+
pass = true;
17+
} catch {
18+
pass = false;
19+
}
20+
21+
return {
22+
name: "toHavePathName",
23+
pass,
24+
actual,
25+
expected,
26+
message: () => "The page does not have the expected URL pathname.",
27+
};
28+
},
29+
});

site/e2e/global.setup.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { hasFirstUser } from "api/api";
33
import { Language } from "pages/CreateUserPage/CreateUserForm";
44
import { setupApiCalls } from "./api";
55
import * as constants from "./constants";
6+
import { expectUrl } from "./expectUrl";
67
import { storageState } from "./playwright.config";
78

89
test("setup deployment", async ({ page }) => {
@@ -21,7 +22,7 @@ test("setup deployment", async ({ page }) => {
2122
await page.getByLabel(Language.passwordLabel).fill(constants.password);
2223
await page.getByTestId("create").click();
2324

24-
await expect(page).toHaveURL(/\/workspaces.*/);
25+
await expectUrl(page).toHavePathName("/workspaces");
2526
await page.context().storageState({ path: storageState });
2627

2728
await page.getByTestId("button-select-template").isVisible();

site/e2e/helpers.ts

+19-18
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
prometheusPort,
2121
requireEnterpriseTests,
2222
} from "./constants";
23+
import { expectUrl } from "./expectUrl";
2324
import {
2425
Agent,
2526
type App,
@@ -49,20 +50,18 @@ export const createWorkspace = async (
4950
richParameters: RichParameter[] = [],
5051
buildParameters: WorkspaceBuildParameter[] = [],
5152
): Promise<string> => {
52-
await page.goto("/templates/" + templateName + "/workspace", {
53+
await page.goto(`/templates/${templateName}/workspace`, {
5354
waitUntil: "domcontentloaded",
5455
});
55-
await expect(page).toHaveURL("/templates/" + templateName + "/workspace");
56+
await expectUrl(page).toHavePathName(`/templates/${templateName}/workspace`);
5657

5758
const name = randomName();
5859
await page.getByLabel("name").fill(name);
5960

6061
await fillParameters(page, richParameters, buildParameters);
6162
await page.getByTestId("form-submit").click();
6263

63-
// Workaround: OutdatedAgent lands at "http://localhost:3111/@admin/8d6225b7?resources=echo_dev"
64-
// and this is also a correct location.
65-
await page.waitForURL(new RegExp("/@admin/" + name));
64+
await expectUrl(page).toHavePathName("/@admin/" + name);
6665

6766
await page.waitForSelector("*[data-testid='build-status'] >> text=Running", {
6867
state: "visible",
@@ -79,8 +78,8 @@ export const verifyParameters = async (
7978
await page.goto("/@admin/" + workspaceName + "/settings/parameters", {
8079
waitUntil: "domcontentloaded",
8180
});
82-
await expect(page).toHaveURL(
83-
"/@admin/" + workspaceName + "/settings/parameters",
81+
await expectUrl(page).toHavePathName(
82+
`/@admin/${workspaceName}/settings/parameters`,
8483
);
8584

8685
for (const buildParameter of expectedBuildParameters) {
@@ -141,7 +140,7 @@ export const createTemplate = async (
141140
});
142141

143142
await page.goto("/templates/new", { waitUntil: "domcontentloaded" });
144-
await expect(page).toHaveURL("/templates/new");
143+
await expectUrl(page).toHavePathName("/templates/new");
145144

146145
await page.getByTestId("file-upload").setInputFiles({
147146
buffer: await createTemplateVersionTar(responses),
@@ -151,7 +150,7 @@ export const createTemplate = async (
151150
const name = randomName();
152151
await page.getByLabel("Name *").fill(name);
153152
await page.getByTestId("form-submit").click();
154-
await expect(page).toHaveURL(`/templates/${name}/files`, {
153+
await expectUrl(page).toHavePathName(`/templates/${name}/files`, {
155154
timeout: 30000,
156155
});
157156
return name;
@@ -161,7 +160,7 @@ export const createTemplate = async (
161160
// random name.
162161
export const createGroup = async (page: Page): Promise<string> => {
163162
await page.goto("/groups/create", { waitUntil: "domcontentloaded" });
164-
await expect(page).toHaveURL("/groups/create");
163+
await expectUrl(page).toHavePathName("/groups/create");
165164

166165
const name = randomName();
167166
await page.getByLabel("Name", { exact: true }).fill(name);
@@ -222,7 +221,7 @@ export const stopWorkspace = async (page: Page, workspaceName: string) => {
222221
await page.goto("/@admin/" + workspaceName, {
223222
waitUntil: "domcontentloaded",
224223
});
225-
await expect(page).toHaveURL("/@admin/" + workspaceName);
224+
await expectUrl(page).toHavePathName(`/@admin/${workspaceName}`);
226225

227226
await page.getByTestId("workspace-stop-button").click();
228227

@@ -241,7 +240,7 @@ export const buildWorkspaceWithParameters = async (
241240
await page.goto("/@admin/" + workspaceName, {
242241
waitUntil: "domcontentloaded",
243242
});
244-
await expect(page).toHaveURL("/@admin/" + workspaceName);
243+
await expectUrl(page).toHavePathName(`/@admin/${workspaceName}`);
245244

246245
await page.getByTestId("build-parameters-button").click();
247246

@@ -753,7 +752,7 @@ export const updateTemplateSettings = async (
753752
await page.goto(`/templates/${templateName}/settings`, {
754753
waitUntil: "domcontentloaded",
755754
});
756-
await expect(page).toHaveURL(`/templates/${templateName}/settings`);
755+
await expectUrl(page).toHavePathName(`/templates/${templateName}/settings`);
757756

758757
for (const [key, value] of Object.entries(templateSettingValues)) {
759758
// Skip max_port_share_level for now since the frontend is not yet able to handle it
@@ -767,7 +766,7 @@ export const updateTemplateSettings = async (
767766
await page.getByTestId("form-submit").click();
768767

769768
const name = templateSettingValues.name ?? templateName;
770-
await expect(page).toHaveURL(`/templates/${name}`);
769+
await expectUrl(page).toHavePathName(`/templates/${name}`);
771770
};
772771

773772
export const updateWorkspace = async (
@@ -779,7 +778,7 @@ export const updateWorkspace = async (
779778
await page.goto("/@admin/" + workspaceName, {
780779
waitUntil: "domcontentloaded",
781780
});
782-
await expect(page).toHaveURL("/@admin/" + workspaceName);
781+
await expectUrl(page).toHavePathName(`/@admin/${workspaceName}`);
783782

784783
await page.getByTestId("workspace-update-button").click();
785784
await page.getByTestId("confirm-button").click();
@@ -801,8 +800,8 @@ export const updateWorkspaceParameters = async (
801800
await page.goto("/@admin/" + workspaceName + "/settings/parameters", {
802801
waitUntil: "domcontentloaded",
803802
});
804-
await expect(page).toHaveURL(
805-
"/@admin/" + workspaceName + "/settings/parameters",
803+
await expectUrl(page).toHavePathName(
804+
`/@admin/${workspaceName}/settings/parameters`,
806805
);
807806

808807
await fillParameters(page, richParameters, buildParameters);
@@ -827,7 +826,9 @@ export async function openTerminalWindow(
827826
// Specify that the shell should be `bash`, to prevent inheriting a shell that
828827
// isn't POSIX compatible, such as Fish.
829828
const commandQuery = `?command=${encodeURIComponent("/usr/bin/env bash")}`;
830-
await expect(terminal).toHaveURL(`/@admin/${workspaceName}.dev/terminal`);
829+
await expectUrl(terminal).toHavePathName(
830+
`/@admin/${workspaceName}.dev/terminal`,
831+
);
831832
await terminal.goto(`/@admin/${workspaceName}.dev/terminal${commandQuery}`);
832833

833834
return terminal;

site/e2e/tests/updateTemplate.spec.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { expect, test } from "@playwright/test";
2+
import { expectUrl } from "../expectUrl";
23
import {
34
createGroup,
45
createTemplate,
@@ -25,7 +26,7 @@ test("add and remove a group", async ({ page }) => {
2526
await page.goto(`/templates/${templateName}/settings/permissions`, {
2627
waitUntil: "domcontentloaded",
2728
});
28-
await expect(page).toHaveURL(
29+
await expectUrl(page).toHavePathName(
2930
`/templates/${templateName}/settings/permissions`,
3031
);
3132

@@ -55,7 +56,7 @@ test("require latest version", async ({ page }) => {
5556
await page.goto(`/templates/${templateName}/settings`, {
5657
waitUntil: "domcontentloaded",
5758
});
58-
await expect(page).toHaveURL(`/templates/${templateName}/settings`);
59+
await expectUrl(page).toHavePathName(`/templates/${templateName}/settings`);
5960
let checkbox = await page.waitForSelector("#require_active_version");
6061
await checkbox.click();
6162
await page.getByTestId("form-submit").click();

site/src/pages/CreateTokenPage/CreateTokenForm.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ export const CreateTokenForm: FC<CreateTokenFormProps> = ({
116116

117117
{lifetimeDays === "custom" && (
118118
<TextField
119+
data-chromatic="ignore"
119120
type="date"
120121
label="Expires on"
121122
defaultValue={dayjs().add(expDays, "day").format("YYYY-MM-DD")}

0 commit comments

Comments
 (0)