Skip to content

Commit a322339

Browse files
authored
chore: use tighter permissions in e2e workspace tests (#16687)
1 parent b5ff9fa commit a322339

File tree

7 files changed

+70
-43
lines changed

7 files changed

+70
-43
lines changed

site/e2e/constants.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,22 @@ export const users = {
2424
password: defaultPassword,
2525
email: "admin@coder.com",
2626
},
27+
templateAdmin: {
28+
username: "template-admin",
29+
password: defaultPassword,
30+
email: "templateadmin@coder.com",
31+
roles: ["Template Admin"],
32+
},
2733
auditor: {
2834
username: "auditor",
2935
password: defaultPassword,
3036
email: "auditor@coder.com",
3137
roles: ["Template Admin", "Auditor"],
3238
},
33-
user: {
34-
username: "user",
39+
member: {
40+
username: "member",
3541
password: defaultPassword,
36-
email: "user@coder.com",
42+
email: "member@coder.com",
3743
},
3844
} satisfies Record<
3945
string,

site/e2e/helpers.ts

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,6 @@ export const createWorkspace = async (
150150
await page.getByRole("button", { name: /create workspace/i }).click();
151151

152152
const user = currentUser(page);
153-
154153
await expectUrl(page).toHavePathName(`/@${user.username}/${name}`);
155154

156155
await page.waitForSelector("[data-testid='build-status'] >> text=Running", {
@@ -165,12 +164,10 @@ export const verifyParameters = async (
165164
richParameters: RichParameter[],
166165
expectedBuildParameters: WorkspaceBuildParameter[],
167166
) => {
168-
await page.goto(`/@admin/${workspaceName}/settings/parameters`, {
167+
const user = currentUser(page);
168+
await page.goto(`/@${user.username}/${workspaceName}/settings/parameters`, {
169169
waitUntil: "domcontentloaded",
170170
});
171-
await expectUrl(page).toHavePathName(
172-
`/@admin/${workspaceName}/settings/parameters`,
173-
);
174171

175172
for (const buildParameter of expectedBuildParameters) {
176173
const richParameter = richParameters.find(
@@ -356,10 +353,10 @@ export const sshIntoWorkspace = async (
356353
};
357354

358355
export const stopWorkspace = async (page: Page, workspaceName: string) => {
359-
await page.goto(`/@admin/${workspaceName}`, {
356+
const user = currentUser(page);
357+
await page.goto(`/@${user.username}/${workspaceName}`, {
360358
waitUntil: "domcontentloaded",
361359
});
362-
await expectUrl(page).toHavePathName(`/@admin/${workspaceName}`);
363360

364361
await page.getByTestId("workspace-stop-button").click();
365362

@@ -375,10 +372,10 @@ export const buildWorkspaceWithParameters = async (
375372
buildParameters: WorkspaceBuildParameter[] = [],
376373
confirm = false,
377374
) => {
378-
await page.goto(`/@admin/${workspaceName}`, {
375+
const user = currentUser(page);
376+
await page.goto(`/@${user.username}/${workspaceName}`, {
379377
waitUntil: "domcontentloaded",
380378
});
381-
await expectUrl(page).toHavePathName(`/@admin/${workspaceName}`);
382379

383380
await page.getByTestId("build-parameters-button").click();
384381

@@ -993,10 +990,10 @@ export const updateWorkspace = async (
993990
richParameters: RichParameter[] = [],
994991
buildParameters: WorkspaceBuildParameter[] = [],
995992
) => {
996-
await page.goto(`/@admin/${workspaceName}`, {
993+
const user = currentUser(page);
994+
await page.goto(`/@${user.username}/${workspaceName}`, {
997995
waitUntil: "domcontentloaded",
998996
});
999-
await expectUrl(page).toHavePathName(`/@admin/${workspaceName}`);
1000997

1001998
await page.getByTestId("workspace-update-button").click();
1002999
await page.getByTestId("confirm-button").click();
@@ -1015,12 +1012,10 @@ export const updateWorkspaceParameters = async (
10151012
richParameters: RichParameter[] = [],
10161013
buildParameters: WorkspaceBuildParameter[] = [],
10171014
) => {
1018-
await page.goto(`/@admin/${workspaceName}/settings/parameters`, {
1015+
const user = currentUser(page);
1016+
await page.goto(`/@${user.username}/${workspaceName}/settings/parameters`, {
10191017
waitUntil: "domcontentloaded",
10201018
});
1021-
await expectUrl(page).toHavePathName(
1022-
`/@admin/${workspaceName}/settings/parameters`,
1023-
);
10241019

10251020
await fillParameters(page, richParameters, buildParameters);
10261021
await page.getByRole("button", { name: /submit and restart/i }).click();
@@ -1044,11 +1039,14 @@ export async function openTerminalWindow(
10441039

10451040
// Specify that the shell should be `bash`, to prevent inheriting a shell that
10461041
// isn't POSIX compatible, such as Fish.
1042+
const user = currentUser(page);
10471043
const commandQuery = `?command=${encodeURIComponent("/usr/bin/env bash")}`;
10481044
await expectUrl(terminal).toHavePathName(
1049-
`/@admin/${workspaceName}.${agentName}/terminal`,
1045+
`/@${user.username}/${workspaceName}.${agentName}/terminal`,
1046+
);
1047+
await terminal.goto(
1048+
`/@${user.username}/${workspaceName}.${agentName}/terminal${commandQuery}`,
10501049
);
1051-
await terminal.goto(`/@admin/${workspaceName}.dev/terminal${commandQuery}`);
10521050

10531051
return terminal;
10541052
}
@@ -1100,7 +1098,7 @@ export async function createUser(
11001098
// Give them a role
11011099
await addedRow.getByLabel("Edit user roles").click();
11021100
for (const role of roles) {
1103-
await page.getByText(role, { exact: true }).click();
1101+
await page.getByRole("group").getByText(role, { exact: true }).click();
11041102
}
11051103
await page.mouse.click(10, 10); // close the popover by clicking outside of it
11061104

site/e2e/tests/workspaces/autoCreateWorkspace.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ let template!: string;
1616

1717
test.beforeAll(async ({ browser }) => {
1818
const page = await (await browser.newContext()).newPage();
19-
await login(page);
19+
await login(page, users.templateAdmin);
2020

2121
const richParameters: RichParameter[] = [
2222
{ ...emptyParameter, name: "repo", type: "string" },
@@ -29,7 +29,7 @@ test.beforeAll(async ({ browser }) => {
2929

3030
test.beforeEach(async ({ page }) => {
3131
beforeCoderTest(page);
32-
await login(page, users.user);
32+
await login(page, users.member);
3333
});
3434

3535
test("create workspace in auto mode", async ({ page }) => {
@@ -40,7 +40,7 @@ test("create workspace in auto mode", async ({ page }) => {
4040
waitUntil: "domcontentloaded",
4141
},
4242
);
43-
await expect(page).toHaveTitle(`${users.user.username}/${name} - Coder`);
43+
await expect(page).toHaveTitle(`${users.member.username}/${name} - Coder`);
4444
});
4545

4646
test("use an existing workspace that matches the `match` parameter instead of creating a new one", async ({
@@ -54,7 +54,7 @@ test("use an existing workspace that matches the `match` parameter instead of cr
5454
},
5555
);
5656
await expect(page).toHaveTitle(
57-
`${users.user.username}/${prevWorkspace} - Coder`,
57+
`${users.member.username}/${prevWorkspace} - Coder`,
5858
);
5959
});
6060

site/e2e/tests/workspaces/createWorkspace.spec.ts

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { expect, test } from "@playwright/test";
2+
import { users } from "../../constants";
23
import {
34
StarterTemplates,
45
createTemplate,
@@ -26,27 +27,20 @@ test.describe.configure({ mode: "parallel" });
2627

2728
test.beforeEach(async ({ page }) => {
2829
beforeCoderTest(page);
29-
await login(page);
3030
});
3131

3232
test("create workspace", async ({ page }) => {
33+
await login(page, users.templateAdmin);
3334
const template = await createTemplate(page, {
34-
apply: [
35-
{
36-
apply: {
37-
resources: [
38-
{
39-
name: "example",
40-
},
41-
],
42-
},
43-
},
44-
],
35+
apply: [{ apply: { resources: [{ name: "example" }] } }],
4536
});
37+
38+
await login(page, users.member);
4639
await createWorkspace(page, template);
4740
});
4841

4942
test("create workspace with default immutable parameters", async ({ page }) => {
43+
await login(page, users.templateAdmin);
5044
const richParameters: RichParameter[] = [
5145
secondParameter,
5246
fourthParameter,
@@ -56,6 +50,8 @@ test("create workspace with default immutable parameters", async ({ page }) => {
5650
page,
5751
echoResponsesWithParameters(richParameters),
5852
);
53+
54+
await login(page, users.member);
5955
const workspaceName = await createWorkspace(page, template);
6056
await verifyParameters(page, workspaceName, richParameters, [
6157
{ name: secondParameter.name, value: secondParameter.defaultValue },
@@ -65,11 +61,14 @@ test("create workspace with default immutable parameters", async ({ page }) => {
6561
});
6662

6763
test("create workspace with default mutable parameters", async ({ page }) => {
64+
await login(page, users.templateAdmin);
6865
const richParameters: RichParameter[] = [firstParameter, thirdParameter];
6966
const template = await createTemplate(
7067
page,
7168
echoResponsesWithParameters(richParameters),
7269
);
70+
71+
await login(page, users.member);
7372
const workspaceName = await createWorkspace(page, template);
7473
await verifyParameters(page, workspaceName, richParameters, [
7574
{ name: firstParameter.name, value: firstParameter.defaultValue },
@@ -80,6 +79,7 @@ test("create workspace with default mutable parameters", async ({ page }) => {
8079
test("create workspace with default and required parameters", async ({
8180
page,
8281
}) => {
82+
await login(page, users.templateAdmin);
8383
const richParameters: RichParameter[] = [
8484
secondParameter,
8585
fourthParameter,
@@ -94,6 +94,8 @@ test("create workspace with default and required parameters", async ({
9494
page,
9595
echoResponsesWithParameters(richParameters),
9696
);
97+
98+
await login(page, users.member);
9799
const workspaceName = await createWorkspace(page, template, {
98100
richParameters,
99101
buildParameters,
@@ -108,6 +110,7 @@ test("create workspace with default and required parameters", async ({
108110
});
109111

110112
test("create workspace and overwrite default parameters", async ({ page }) => {
113+
await login(page, users.templateAdmin);
111114
// We use randParamName to prevent the new values from corrupting user_history
112115
// and thus affecting other tests.
113116
const richParameters: RichParameter[] = [
@@ -124,6 +127,7 @@ test("create workspace and overwrite default parameters", async ({ page }) => {
124127
echoResponsesWithParameters(richParameters),
125128
);
126129

130+
await login(page, users.member);
127131
const workspaceName = await createWorkspace(page, template, {
128132
richParameters,
129133
buildParameters,
@@ -132,6 +136,7 @@ test("create workspace and overwrite default parameters", async ({ page }) => {
132136
});
133137

134138
test("create workspace with disable_param search params", async ({ page }) => {
139+
await login(page, users.templateAdmin);
135140
const richParameters: RichParameter[] = [
136141
firstParameter, // mutable
137142
secondParameter, //immutable
@@ -142,6 +147,7 @@ test("create workspace with disable_param search params", async ({ page }) => {
142147
echoResponsesWithParameters(richParameters),
143148
);
144149

150+
await login(page, users.member);
145151
await page.goto(
146152
`/templates/${templateName}/workspace?disable_params=first_parameter,second_parameter`,
147153
{
@@ -157,8 +163,11 @@ test("create workspace with disable_param search params", async ({ page }) => {
157163
// the tests are over.
158164
test.skip("create docker workspace", async ({ context, page }) => {
159165
requireTerraformProvisioner();
166+
167+
await login(page, users.templateAdmin);
160168
const template = await createTemplate(page, StarterTemplates.STARTER_DOCKER);
161169

170+
await login(page, users.member);
162171
const workspaceName = await createWorkspace(page, template);
163172

164173
// The workspace agents must be ready before we try to interact with the workspace.
@@ -184,8 +193,6 @@ test.skip("create docker workspace", async ({ context, page }) => {
184193
);
185194
await terminal.waitForSelector(
186195
`//textarea[contains(@class,"xterm-helper-textarea")]`,
187-
{
188-
state: "visible",
189-
},
196+
{ state: "visible" },
190197
);
191198
});

site/e2e/tests/workspaces/restartWorkspace.spec.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { test } from "@playwright/test";
2+
import { users } from "../../constants";
23
import {
34
buildWorkspaceWithParameters,
45
createTemplate,
@@ -13,15 +14,17 @@ import type { RichParameter } from "../../provisionerGenerated";
1314

1415
test.beforeEach(async ({ page }) => {
1516
beforeCoderTest(page);
16-
await login(page);
1717
});
1818

1919
test("restart workspace with ephemeral parameters", async ({ page }) => {
20+
await login(page, users.templateAdmin);
2021
const richParameters: RichParameter[] = [firstBuildOption, secondBuildOption];
2122
const template = await createTemplate(
2223
page,
2324
echoResponsesWithParameters(richParameters),
2425
);
26+
27+
await login(page, users.member);
2528
const workspaceName = await createWorkspace(page, template);
2629

2730
// Verify that build options are default (not selected).

site/e2e/tests/workspaces/startWorkspace.spec.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { test } from "@playwright/test";
2+
import { users } from "../../constants";
23
import {
34
buildWorkspaceWithParameters,
45
createTemplate,
@@ -14,15 +15,17 @@ import type { RichParameter } from "../../provisionerGenerated";
1415

1516
test.beforeEach(async ({ page }) => {
1617
beforeCoderTest(page);
17-
await login(page);
1818
});
1919

2020
test("start workspace with ephemeral parameters", async ({ page }) => {
21+
await login(page, users.templateAdmin);
2122
const richParameters: RichParameter[] = [firstBuildOption, secondBuildOption];
2223
const template = await createTemplate(
2324
page,
2425
echoResponsesWithParameters(richParameters),
2526
);
27+
28+
await login(page, users.member);
2629
const workspaceName = await createWorkspace(page, template);
2730

2831
// Verify that build options are default (not selected).

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy