Skip to content

Commit 055d787

Browse files
committed
Make tests more atomic and safe
1 parent 2e21bb8 commit 055d787

File tree

4 files changed

+84
-2
lines changed

4 files changed

+84
-2
lines changed

site/e2e/helpers.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import capitalize from "lodash/capitalize";
77
import path from "path";
88
import * as ssh from "ssh2";
99
import { Duplex } from "stream";
10+
import * as API from "api/api";
1011
import type {
1112
WorkspaceBuildParameter,
1213
UpdateTemplateMeta,
@@ -565,7 +566,7 @@ const createTemplateVersionTar = async (
565566
);
566567
};
567568

568-
const randomName = () => {
569+
export const randomName = () => {
569570
return randomUUID().slice(0, 8);
570571
};
571572

@@ -603,7 +604,7 @@ export const createServer = async (
603604
return e;
604605
};
605606

606-
const findSessionToken = async (page: Page): Promise<string> => {
607+
export const findSessionToken = async (page: Page): Promise<string> => {
607608
const cookies = await page.context().cookies();
608609
const sessionCookie = cookies.find((c) => c.name === "coder_session_token");
609610
if (!sessionCookie) {
@@ -825,3 +826,9 @@ export async function openTerminalWindow(
825826

826827
return terminal;
827828
}
829+
830+
export const setupApiCalls = async (page: Page, baseURL?: string) => {
831+
const token = await findSessionToken(page);
832+
API.setSessionToken(token);
833+
API.setHost(baseURL);
834+
};
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { test, expect } from "@playwright/test";
2+
import { randomName } from "../../helpers";
3+
import { beforeCoderTest } from "../../hooks";
4+
5+
test.beforeEach(async ({ page }) => await beforeCoderTest(page));
6+
7+
test("create user with password", async ({ page, baseURL }) => {
8+
await page.goto(`${baseURL}/users`, { waitUntil: "domcontentloaded" });
9+
await expect(page).toHaveTitle("Users - Coder");
10+
11+
await page.getByRole("button", { name: "Create user" }).click();
12+
await expect(page).toHaveTitle("Create User - Coder");
13+
14+
const name = randomName();
15+
const userValues = {
16+
username: name,
17+
email: `${name}@coder.com`,
18+
loginType: "password",
19+
password: "s3cure&password!",
20+
};
21+
await page.getByLabel("Username").fill(userValues.username);
22+
await page.getByLabel("Email").fill(userValues.email);
23+
await page.getByLabel("Login Type").click();
24+
await page.getByRole("option", { name: "Password", exact: false }).click();
25+
// Using input[name=password] due to the select element utilizing 'password'
26+
// as the label for the currently active option.
27+
const passwordField = page.locator("input[name=password]");
28+
await passwordField.fill(userValues.password);
29+
await page.getByRole("button", { name: "Create user" }).click();
30+
31+
await expect(page.getByText("Successfully created user.")).toBeVisible();
32+
await expect(page.locator("tr", { hasText: userValues.email })).toBeVisible();
33+
});
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { test, expect } from "@playwright/test";
2+
import * as API from "api/api";
3+
import { randomName, setupApiCalls } from "../../helpers";
4+
import { beforeCoderTest } from "../../hooks";
5+
6+
test.beforeEach(async ({ page }) => await beforeCoderTest(page));
7+
8+
test("remove user", async ({ page, baseURL }) => {
9+
await setupApiCalls(page, baseURL);
10+
const currentUser = await API.getAuthenticatedUser();
11+
const name = randomName();
12+
const user = await API.createUser({
13+
email: `${name}@coder.com`,
14+
username: name,
15+
password: "s3cure&password!",
16+
login_type: "password",
17+
disable_login: false,
18+
organization_id: currentUser.organization_ids[0],
19+
});
20+
21+
await page.goto(`${baseURL}/users`, { waitUntil: "domcontentloaded" });
22+
await expect(page).toHaveTitle("Users - Coder");
23+
24+
const userRow = page.locator("tr", { hasText: user.email });
25+
await userRow.getByRole("button", { name: "More options" }).click();
26+
await userRow.getByText("Delete", { exact: false }).click();
27+
28+
const dialog = page.getByTestId("dialog");
29+
await dialog.getByLabel("Name of the user to delete").fill(user.username);
30+
await dialog.getByRole("button", { name: "Delete" }).click();
31+
32+
await expect(page.getByText("Successfully deleted the user.")).toBeVisible();
33+
await expect(userRow).not.toBeVisible();
34+
});

site/src/api/api.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@ if (token !== null && token.getAttribute("content") !== null) {
7272
}
7373
}
7474

75+
export const setSessionToken = (token: string) => {
76+
axios.defaults.headers.common["Coder-Session-Token"] = token;
77+
};
78+
79+
export const setHost = (host?: string) => {
80+
axios.defaults.baseURL = host;
81+
};
82+
7583
const CONTENT_TYPE_JSON = {
7684
"Content-Type": "application/json",
7785
};

0 commit comments

Comments
 (0)