Skip to content

Commit cb19fd4

Browse files
authored
chore: use user admin and template admin for even more e2e tests (#16974)
1 parent 49a35e3 commit cb19fd4

11 files changed

+135
-128
lines changed

site/e2e/helpers.ts

+7-4
Original file line numberDiff line numberDiff line change
@@ -267,9 +267,8 @@ export const createTemplate = async (
267267
);
268268
}
269269

270-
// picker is disabled if only one org is available
270+
// The organization picker will be disabled if there is only one option.
271271
const pickerIsDisabled = await orgPicker.isDisabled();
272-
273272
if (!pickerIsDisabled) {
274273
await orgPicker.click();
275274
await page.getByText(orgName, { exact: true }).click();
@@ -1094,8 +1093,12 @@ export async function createUser(
10941093
const orgPicker = page.getByLabel("Organization *");
10951094
const organizationsEnabled = await orgPicker.isVisible();
10961095
if (organizationsEnabled) {
1097-
await orgPicker.click();
1098-
await page.getByText(orgName, { exact: true }).click();
1096+
// The organization picker will be disabled if there is only one option.
1097+
const pickerIsDisabled = await orgPicker.isDisabled();
1098+
if (!pickerIsDisabled) {
1099+
await orgPicker.click();
1100+
await page.getByText(orgName, { exact: true }).click();
1101+
}
10991102
}
11001103

11011104
await page.getByLabel("Login Type").click();

site/e2e/tests/auditLogs.spec.ts

+96-83
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { type Page, expect, test } from "@playwright/test";
2-
import { users } from "../constants";
2+
import { defaultPassword, users } from "../constants";
33
import {
44
createTemplate,
5+
createUser,
56
createWorkspace,
6-
currentUser,
77
login,
8+
randomName,
89
requiresLicense,
910
} from "../helpers";
1011
import { beforeCoderTest } from "../hooks";
@@ -15,6 +16,14 @@ test.beforeEach(async ({ page }) => {
1516
beforeCoderTest(page);
1617
});
1718

19+
const name = randomName();
20+
const userToAudit = {
21+
username: `peep-${name}`,
22+
password: defaultPassword,
23+
email: `peep-${name}@coder.com`,
24+
roles: ["Template Admin", "User Admin"],
25+
};
26+
1827
async function resetSearch(page: Page, username: string) {
1928
const clearButton = page.getByLabel("Clear search");
2029
if (await clearButton.isVisible()) {
@@ -27,92 +36,96 @@ async function resetSearch(page: Page, username: string) {
2736
await expect(page.getByText("All users")).not.toBeVisible();
2837
}
2938

30-
test("logins are logged", async ({ page }) => {
39+
test.describe("audit logs", () => {
3140
requiresLicense();
3241

33-
// Go to the audit history
34-
await login(page, users.auditor);
35-
await page.goto("/audit");
36-
const username = users.auditor.username;
37-
38-
const loginMessage = `${username} logged in`;
39-
// Make sure those things we did all actually show up
40-
await resetSearch(page, username);
41-
await expect(page.getByText(loginMessage).first()).toBeVisible();
42-
});
42+
test.beforeAll(async ({ browser }) => {
43+
const context = await browser.newContext();
44+
const page = await context.newPage();
45+
await login(page);
46+
await createUser(page, userToAudit);
47+
});
4348

44-
test("creating templates and workspaces is logged", async ({ page }) => {
45-
requiresLicense();
49+
test("logins are logged", async ({ page }) => {
50+
// Go to the audit history
51+
await login(page, users.auditor);
52+
await page.goto("/audit");
4653

47-
// Do some stuff that should show up in the audit logs
48-
await login(page, users.templateAdmin);
49-
const username = users.templateAdmin.username;
50-
const templateName = await createTemplate(page);
51-
const workspaceName = await createWorkspace(page, templateName);
52-
53-
// Go to the audit history
54-
await login(page, users.auditor);
55-
await page.goto("/audit");
56-
57-
// Make sure those things we did all actually show up
58-
await resetSearch(page, username);
59-
await expect(
60-
page.getByText(`${username} created template ${templateName}`),
61-
).toBeVisible();
62-
await expect(
63-
page.getByText(`${username} created workspace ${workspaceName}`),
64-
).toBeVisible();
65-
await expect(
66-
page.getByText(`${username} started workspace ${workspaceName}`),
67-
).toBeVisible();
68-
69-
// Make sure we can inspect the details of the log item
70-
const createdWorkspace = page.locator(".MuiTableRow-root", {
71-
hasText: `${username} created workspace ${workspaceName}`,
54+
// Make sure those things we did all actually show up
55+
await resetSearch(page, users.auditor.username);
56+
const loginMessage = `${users.auditor.username} logged in`;
57+
await expect(page.getByText(loginMessage).first()).toBeVisible();
7258
});
73-
await createdWorkspace.getByLabel("open-dropdown").click();
74-
await expect(
75-
createdWorkspace.getByText(`automatic_updates: "never"`),
76-
).toBeVisible();
77-
await expect(
78-
createdWorkspace.getByText(`name: "${workspaceName}"`),
79-
).toBeVisible();
80-
});
8159

82-
test("inspecting and filtering audit logs", async ({ page }) => {
83-
requiresLicense();
60+
test("creating templates and workspaces is logged", async ({ page }) => {
61+
// Do some stuff that should show up in the audit logs
62+
await login(page, userToAudit);
63+
const username = userToAudit.username;
64+
const templateName = await createTemplate(page);
65+
const workspaceName = await createWorkspace(page, templateName);
66+
67+
// Go to the audit history
68+
await login(page, users.auditor);
69+
await page.goto("/audit");
70+
71+
// Make sure those things we did all actually show up
72+
await resetSearch(page, username);
73+
await expect(
74+
page.getByText(`${username} created template ${templateName}`),
75+
).toBeVisible();
76+
await expect(
77+
page.getByText(`${username} created workspace ${workspaceName}`),
78+
).toBeVisible();
79+
await expect(
80+
page.getByText(`${username} started workspace ${workspaceName}`),
81+
).toBeVisible();
82+
83+
// Make sure we can inspect the details of the log item
84+
const createdWorkspace = page.locator(".MuiTableRow-root", {
85+
hasText: `${username} created workspace ${workspaceName}`,
86+
});
87+
await createdWorkspace.getByLabel("open-dropdown").click();
88+
await expect(
89+
createdWorkspace.getByText(`automatic_updates: "never"`),
90+
).toBeVisible();
91+
await expect(
92+
createdWorkspace.getByText(`name: "${workspaceName}"`),
93+
).toBeVisible();
94+
});
8495

85-
// Do some stuff that should show up in the audit logs
86-
await login(page, users.templateAdmin);
87-
const username = users.templateAdmin.username;
88-
const templateName = await createTemplate(page);
89-
const workspaceName = await createWorkspace(page, templateName);
90-
91-
// Go to the audit history
92-
await login(page, users.auditor);
93-
await page.goto("/audit");
94-
const loginMessage = `${username} logged in`;
95-
const startedWorkspaceMessage = `${username} started workspace ${workspaceName}`;
96-
97-
// Filter by resource type
98-
await resetSearch(page, username);
99-
await page.getByText("All resource types").click();
100-
const workspaceBuildsOption = page.getByText("Workspace Build");
101-
await workspaceBuildsOption.scrollIntoViewIfNeeded({ timeout: 5000 });
102-
await workspaceBuildsOption.click();
103-
// Our workspace build should be visible
104-
await expect(page.getByText(startedWorkspaceMessage)).toBeVisible();
105-
// Logins should no longer be visible
106-
await expect(page.getByText(loginMessage)).not.toBeVisible();
107-
await page.getByLabel("Clear search").click();
108-
await expect(page.getByText("All resource types")).toBeVisible();
109-
110-
// Filter by action type
111-
await resetSearch(page, username);
112-
await page.getByText("All actions").click();
113-
await page.getByText("Login", { exact: true }).click();
114-
// Logins should be visible
115-
await expect(page.getByText(loginMessage).first()).toBeVisible();
116-
// Our workspace build should no longer be visible
117-
await expect(page.getByText(startedWorkspaceMessage)).not.toBeVisible();
96+
test("inspecting and filtering audit logs", async ({ page }) => {
97+
// Do some stuff that should show up in the audit logs
98+
await login(page, userToAudit);
99+
const username = userToAudit.username;
100+
const templateName = await createTemplate(page);
101+
const workspaceName = await createWorkspace(page, templateName);
102+
103+
// Go to the audit history
104+
await login(page, users.auditor);
105+
await page.goto("/audit");
106+
const loginMessage = `${username} logged in`;
107+
const startedWorkspaceMessage = `${username} started workspace ${workspaceName}`;
108+
109+
// Filter by resource type
110+
await resetSearch(page, username);
111+
await page.getByText("All resource types").click();
112+
const workspaceBuildsOption = page.getByText("Workspace Build");
113+
await workspaceBuildsOption.scrollIntoViewIfNeeded({ timeout: 5000 });
114+
await workspaceBuildsOption.click();
115+
// Our workspace build should be visible
116+
await expect(page.getByText(startedWorkspaceMessage)).toBeVisible();
117+
// Logins should no longer be visible
118+
await expect(page.getByText(loginMessage)).not.toBeVisible();
119+
await page.getByLabel("Clear search").click();
120+
await expect(page.getByText("All resource types")).toBeVisible();
121+
122+
// Filter by action type
123+
await resetSearch(page, username);
124+
await page.getByText("All actions").click();
125+
await page.getByText("Login", { exact: true }).click();
126+
// Logins should be visible
127+
await expect(page.getByText(loginMessage).first()).toBeVisible();
128+
// Our workspace build should no longer be visible
129+
await expect(page.getByText(startedWorkspaceMessage)).not.toBeVisible();
130+
});
118131
});

site/e2e/tests/deployment/idpOrgSync.spec.ts

+6-15
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import {
55
deleteOrganization,
66
setupApiCalls,
77
} from "../../api";
8-
import { randomName, requiresLicense } from "../../helpers";
9-
import { login } from "../../helpers";
8+
import { users } from "../../constants";
9+
import { login, randomName, requiresLicense } from "../../helpers";
1010
import { beforeCoderTest } from "../../hooks";
1111

1212
test.beforeEach(async ({ page }) => {
@@ -15,13 +15,14 @@ test.beforeEach(async ({ page }) => {
1515
await setupApiCalls(page);
1616
});
1717

18-
test.describe("IdpOrgSyncPage", () => {
18+
test.describe("IdP organization sync", () => {
19+
requiresLicense();
20+
1921
test.describe.configure({ retries: 1 });
2022

2123
test("show empty table when no org mappings are present", async ({
2224
page,
2325
}) => {
24-
requiresLicense();
2526
await page.goto("/deployment/idp-org-sync", {
2627
waitUntil: "domcontentloaded",
2728
});
@@ -35,8 +36,6 @@ test.describe("IdpOrgSyncPage", () => {
3536
});
3637

3738
test("add new IdP organization mapping with API", async ({ page }) => {
38-
requiresLicense();
39-
4039
await createOrganizationSyncSettings();
4140

4241
await page.goto("/deployment/idp-org-sync", {
@@ -59,7 +58,6 @@ test.describe("IdpOrgSyncPage", () => {
5958
});
6059

6160
test("delete a IdP org to coder org mapping row", async ({ page }) => {
62-
requiresLicense();
6361
await createOrganizationSyncSettings();
6462
await page.goto("/deployment/idp-org-sync", {
6563
waitUntil: "domcontentloaded",
@@ -77,7 +75,6 @@ test.describe("IdpOrgSyncPage", () => {
7775
});
7876

7977
test("update sync field", async ({ page }) => {
80-
requiresLicense();
8178
await page.goto("/deployment/idp-org-sync", {
8279
waitUntil: "domcontentloaded",
8380
});
@@ -100,7 +97,6 @@ test.describe("IdpOrgSyncPage", () => {
10097
});
10198

10299
test("toggle off default organization assignment", async ({ page }) => {
103-
requiresLicense();
104100
await page.goto("/deployment/idp-org-sync", {
105101
waitUntil: "domcontentloaded",
106102
});
@@ -126,8 +122,6 @@ test.describe("IdpOrgSyncPage", () => {
126122
test("export policy button is enabled when sync settings are present", async ({
127123
page,
128124
}) => {
129-
requiresLicense();
130-
131125
await page.goto("/deployment/idp-org-sync", {
132126
waitUntil: "domcontentloaded",
133127
});
@@ -140,10 +134,7 @@ test.describe("IdpOrgSyncPage", () => {
140134
});
141135

142136
test("add new IdP organization mapping with UI", async ({ page }) => {
143-
requiresLicense();
144-
145137
const orgName = randomName();
146-
147138
await createOrganizationWithName(orgName);
148139

149140
await page.goto("/deployment/idp-org-sync", {
@@ -172,7 +163,7 @@ test.describe("IdpOrgSyncPage", () => {
172163
await orgSelector.click();
173164
await page.waitForTimeout(1000);
174165

175-
const option = await page.getByRole("option", { name: orgName });
166+
const option = page.getByRole("option", { name: orgName });
176167
await expect(option).toBeAttached({ timeout: 30000 });
177168
await expect(option).toBeVisible();
178169
await option.click();

site/e2e/tests/groups/addMembers.spec.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@ import {
55
getCurrentOrgId,
66
setupApiCalls,
77
} from "../../api";
8-
import { defaultOrganizationName } from "../../constants";
9-
import { requiresLicense } from "../../helpers";
10-
import { login } from "../../helpers";
8+
import { defaultOrganizationName, users } from "../../constants";
9+
import { login, requiresLicense } from "../../helpers";
1110
import { beforeCoderTest } from "../../hooks";
1211

1312
test.beforeEach(async ({ page }) => {
1413
beforeCoderTest(page);
15-
await login(page);
14+
await login(page, users.userAdmin);
1615
await setupApiCalls(page);
1716
});
1817

site/e2e/tests/groups/addUsersToDefaultGroup.spec.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import { expect, test } from "@playwright/test";
22
import { createUser, getCurrentOrgId, setupApiCalls } from "../../api";
3-
import { defaultOrganizationName } from "../../constants";
4-
import { requiresLicense } from "../../helpers";
5-
import { login } from "../../helpers";
3+
import { defaultOrganizationName, users } from "../../constants";
4+
import { login, requiresLicense } from "../../helpers";
65
import { beforeCoderTest } from "../../hooks";
76

87
test.beforeEach(async ({ page }) => {
98
beforeCoderTest(page);
10-
await login(page);
9+
await login(page, users.userAdmin);
1110
});
1211

1312
const DEFAULT_GROUP_NAME = "Everyone";

site/e2e/tests/groups/createGroup.spec.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import { expect, test } from "@playwright/test";
2-
import { defaultOrganizationName } from "../../constants";
3-
import { randomName, requiresLicense } from "../../helpers";
4-
import { login } from "../../helpers";
2+
import { defaultOrganizationName, users } from "../../constants";
3+
import { login, randomName, requiresLicense } from "../../helpers";
54
import { beforeCoderTest } from "../../hooks";
65

76
test.beforeEach(async ({ page }) => {
87
beforeCoderTest(page);
9-
await login(page);
8+
await login(page, users.userAdmin);
109
});
1110

1211
test("create group", async ({ page, baseURL }) => {

site/e2e/tests/groups/removeGroup.spec.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import { expect, test } from "@playwright/test";
22
import { createGroup, getCurrentOrgId, setupApiCalls } from "../../api";
3-
import { defaultOrganizationName } from "../../constants";
4-
import { requiresLicense } from "../../helpers";
5-
import { login } from "../../helpers";
3+
import { defaultOrganizationName, users } from "../../constants";
4+
import { login, requiresLicense } from "../../helpers";
65
import { beforeCoderTest } from "../../hooks";
76

87
test.beforeEach(async ({ page }) => {
98
beforeCoderTest(page);
10-
await login(page);
9+
await login(page, users.userAdmin);
1110
await setupApiCalls(page);
1211
});
1312

0 commit comments

Comments
 (0)