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

Skip to content

Commit a322339

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

7 files changed

+70
-43
lines changed

site/e2e/constants.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,22 @@ export const users = {
2424
password: defaultPassword,
2525
2626
},
27+
templateAdmin: {
28+
username: "template-admin",
29+
password: defaultPassword,
30+
31+
roles: ["Template Admin"],
32+
},
2733
auditor: {
2834
username: "auditor",
2935
password: defaultPassword,
3036
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

+16-18
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

+4-4
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

+22-15
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

+4-1
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

+4-1
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)