Skip to content

Commit 41b8ff3

Browse files
chore(site): add e2e to test add and remove user (#12851)
1 parent a7234f6 commit 41b8ff3

File tree

6 files changed

+93
-7
lines changed

6 files changed

+93
-7
lines changed

site/e2e/helpers.ts

+9-2
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) => {
831+
const token = await findSessionToken(page);
832+
API.setSessionToken(token);
833+
API.setHost(`http://127.0.0.1:${coderPort}`);
834+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
22+
await page.getByLabel("Username").fill(userValues.username);
23+
await page.getByLabel("Email").fill(userValues.email);
24+
await page.getByLabel("Login Type").click();
25+
await page.getByRole("option", { name: "Password", exact: false }).click();
26+
// Using input[name=password] due to the select element utilizing 'password'
27+
// as the label for the currently active option.
28+
const passwordField = page.locator("input[name=password]");
29+
await passwordField.fill(userValues.password);
30+
await page.getByRole("button", { name: "Create user" }).click();
31+
await expect(page.getByText("Successfully created user.")).toBeVisible();
32+
33+
await expect(page).toHaveTitle("Users - Coder");
34+
await expect(page.locator("tr", { hasText: userValues.email })).toBeVisible();
35+
});
+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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);
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+
});

site/src/api/api.ts

+8
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
};

site/src/pages/CreateUserPage/CreateUserForm.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,11 @@ export const CreateUserForm: FC<
193193
type="password"
194194
/>
195195
</Stack>
196-
<FormFooter onCancel={onCancel} isLoading={isLoading} />
196+
<FormFooter
197+
submitLabel="Create user"
198+
onCancel={onCancel}
199+
isLoading={isLoading}
200+
/>
197201
</form>
198202
</FullPageForm>
199203
);

site/src/pages/CreateUserPage/CreateUserPage.test.tsx

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { fireEvent, screen } from "@testing-library/react";
22
import userEvent from "@testing-library/user-event";
3-
import { Language as FooterLanguage } from "components/FormFooter/FormFooter";
43
import {
54
renderWithAuth,
65
waitForLoaderToBeRemoved,
@@ -35,9 +34,9 @@ const fillForm = async ({
3534
await userEvent.type(emailField, email);
3635
await userEvent.type(loginTypeField, "password");
3736
await userEvent.type(passwordField as HTMLElement, password);
38-
const submitButton = await screen.findByText(
39-
FooterLanguage.defaultSubmitLabel,
40-
);
37+
const submitButton = screen.getByRole("button", {
38+
name: "Create user",
39+
});
4140
fireEvent.click(submitButton);
4241
};
4342

0 commit comments

Comments
 (0)