Skip to content

Commit f5d813c

Browse files
authored
test(site): e2e: update workspace with parameters (#9338)
1 parent 3557497 commit f5d813c

File tree

5 files changed

+252
-2
lines changed

5 files changed

+252
-2
lines changed

site/e2e/helpers.ts

+101
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ export const createWorkspace = async (
3131
await page.goto("/templates/" + templateName + "/workspace", {
3232
waitUntil: "networkidle",
3333
})
34+
await expect(page).toHaveURL("/templates/" + templateName + "/workspace")
35+
3436
const name = randomName()
3537
await page.getByLabel("name").fill(name)
3638

@@ -117,7 +119,10 @@ export const createTemplate = async (
117119
await page.addInitScript({
118120
content: "window.playwright = true",
119121
})
122+
120123
await page.goto("/templates/new", { waitUntil: "networkidle" })
124+
await expect(page).toHaveURL("/templates/new")
125+
121126
await page.getByTestId("file-upload").setInputFiles({
122127
buffer: await createTemplateVersionTar(responses),
123128
mimeType: "application/x-tar",
@@ -616,3 +621,99 @@ export const fillParameters = async (
616621
}
617622
}
618623
}
624+
625+
export const updateTemplate = async (
626+
page: Page,
627+
templateName: string,
628+
responses?: EchoProvisionerResponses,
629+
) => {
630+
const tarball = await createTemplateVersionTar(responses)
631+
632+
const sessionToken = await findSessionToken(page)
633+
const child = spawn(
634+
"go",
635+
[
636+
"run",
637+
coderMainPath(),
638+
"templates",
639+
"push",
640+
"--test.provisioner",
641+
"echo",
642+
"-y",
643+
"-d",
644+
"-",
645+
templateName,
646+
],
647+
{
648+
env: {
649+
...process.env,
650+
CODER_SESSION_TOKEN: sessionToken,
651+
CODER_URL: "http://localhost:3000",
652+
},
653+
},
654+
)
655+
656+
const uploaded = new Awaiter()
657+
child.on("exit", (code) => {
658+
if (code === 0) {
659+
uploaded.done()
660+
return
661+
}
662+
663+
throw new Error(`coder templates push failed with code ${code}`)
664+
})
665+
666+
child.stdin.write(tarball)
667+
child.stdin.end()
668+
669+
await uploaded.wait()
670+
}
671+
672+
export const updateWorkspace = async (
673+
page: Page,
674+
workspaceName: string,
675+
richParameters: RichParameter[] = [],
676+
buildParameters: WorkspaceBuildParameter[] = [],
677+
) => {
678+
await page.goto("/@admin/" + workspaceName, {
679+
waitUntil: "domcontentloaded",
680+
})
681+
await expect(page).toHaveURL("/@admin/" + workspaceName)
682+
683+
await page.getByTestId("workspace-update-button").click()
684+
await page.getByTestId("confirm-button").click()
685+
686+
await fillParameters(page, richParameters, buildParameters)
687+
await page.getByTestId("form-submit").click()
688+
689+
await page.waitForSelector(
690+
"span[data-testid='build-status'] >> text=Running",
691+
{
692+
state: "visible",
693+
},
694+
)
695+
}
696+
697+
export const updateWorkspaceParameters = async (
698+
page: Page,
699+
workspaceName: string,
700+
richParameters: RichParameter[] = [],
701+
buildParameters: WorkspaceBuildParameter[] = [],
702+
) => {
703+
await page.goto("/@admin/" + workspaceName + "/settings/parameters", {
704+
waitUntil: "domcontentloaded",
705+
})
706+
await expect(page).toHaveURL(
707+
"/@admin/" + workspaceName + "/settings/parameters",
708+
)
709+
710+
await fillParameters(page, richParameters, buildParameters)
711+
await page.getByTestId("form-submit").click()
712+
713+
await page.waitForSelector(
714+
"span[data-testid='build-status'] >> text=Running",
715+
{
716+
state: "visible",
717+
},
718+
)
719+
}

site/e2e/playwright.config.ts

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export default defineConfig({
4141
`--access-url=http://localhost:${port} ` +
4242
`--http-address=localhost:${port} ` +
4343
`--in-memory --telemetry=false ` +
44+
`--dangerous-disable-rate-limits ` +
4445
`--provisioner-daemons 10 ` +
4546
`--provisioner-daemons-echo ` +
4647
`--provisioner-daemon-poll-interval 50ms`,

site/e2e/tests/createWorkspace.spec.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { test } from "@playwright/test"
1+
import { test, Page } from "@playwright/test"
22
import {
33
createTemplate,
44
createWorkspace,
@@ -17,6 +17,11 @@ import {
1717
} from "../parameters"
1818
import { RichParameter } from "../provisionerGenerated"
1919

20+
test.beforeEach(async ({ page }: { page: Page }) => {
21+
// eslint-disable-next-line no-console -- For debugging purposes
22+
page.on("console", (msg) => console.log("Console: " + msg.text()))
23+
})
24+
2025
test("create workspace", async ({ page }) => {
2126
const template = await createTemplate(page, {
2227
apply: [
@@ -107,6 +112,7 @@ test("create workspace and overwrite default parameters", async ({ page }) => {
107112
page,
108113
echoResponsesWithParameters(richParameters),
109114
)
115+
110116
const workspaceName = await createWorkspace(
111117
page,
112118
template,
+136
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
import { test, Page } from "@playwright/test"
2+
3+
import {
4+
createTemplate,
5+
createWorkspace,
6+
echoResponsesWithParameters,
7+
updateTemplate,
8+
updateWorkspace,
9+
updateWorkspaceParameters,
10+
verifyParameters,
11+
} from "../helpers"
12+
13+
import {
14+
fifthParameter,
15+
firstParameter,
16+
secondParameter,
17+
sixthParameter,
18+
secondBuildOption,
19+
} from "../parameters"
20+
import { RichParameter } from "../provisionerGenerated"
21+
22+
test.beforeEach(async ({ page }: { page: Page }) => {
23+
// eslint-disable-next-line no-console -- For debugging purposes
24+
page.on("console", (msg) => console.log("Console: " + msg.text()))
25+
})
26+
27+
test("update workspace, new optional, immutable parameter added", async ({
28+
page,
29+
}) => {
30+
const richParameters: RichParameter[] = [firstParameter, secondParameter]
31+
const template = await createTemplate(
32+
page,
33+
echoResponsesWithParameters(richParameters),
34+
)
35+
36+
const workspaceName = await createWorkspace(page, template)
37+
38+
// Verify that parameter values are default.
39+
await verifyParameters(page, workspaceName, richParameters, [
40+
{ name: firstParameter.name, value: firstParameter.defaultValue },
41+
{ name: secondParameter.name, value: secondParameter.defaultValue },
42+
])
43+
44+
// Push updated template.
45+
const updatedRichParameters = [...richParameters, fifthParameter]
46+
await updateTemplate(
47+
page,
48+
template,
49+
echoResponsesWithParameters(updatedRichParameters),
50+
)
51+
52+
// Now, update the workspace, and select the value for immutable parameter.
53+
await updateWorkspace(page, workspaceName, updatedRichParameters, [
54+
{ name: fifthParameter.name, value: fifthParameter.options[0].value },
55+
])
56+
57+
// Verify parameter values.
58+
await verifyParameters(page, workspaceName, updatedRichParameters, [
59+
{ name: firstParameter.name, value: firstParameter.defaultValue },
60+
{ name: secondParameter.name, value: secondParameter.defaultValue },
61+
{ name: fifthParameter.name, value: fifthParameter.options[0].value },
62+
])
63+
})
64+
65+
test("update workspace, new required, mutable parameter added", async ({
66+
page,
67+
}) => {
68+
const richParameters: RichParameter[] = [firstParameter, secondParameter]
69+
const template = await createTemplate(
70+
page,
71+
echoResponsesWithParameters(richParameters),
72+
)
73+
74+
const workspaceName = await createWorkspace(page, template)
75+
76+
// Verify that parameter values are default.
77+
await verifyParameters(page, workspaceName, richParameters, [
78+
{ name: firstParameter.name, value: firstParameter.defaultValue },
79+
{ name: secondParameter.name, value: secondParameter.defaultValue },
80+
])
81+
82+
// Push updated template.
83+
const updatedRichParameters = [...richParameters, sixthParameter]
84+
await updateTemplate(
85+
page,
86+
template,
87+
echoResponsesWithParameters(updatedRichParameters),
88+
)
89+
90+
// Now, update the workspace, and provide the parameter value.
91+
const buildParameters = [{ name: sixthParameter.name, value: "99" }]
92+
await updateWorkspace(
93+
page,
94+
workspaceName,
95+
updatedRichParameters,
96+
buildParameters,
97+
)
98+
99+
// Verify parameter values.
100+
await verifyParameters(page, workspaceName, updatedRichParameters, [
101+
{ name: firstParameter.name, value: firstParameter.defaultValue },
102+
{ name: secondParameter.name, value: secondParameter.defaultValue },
103+
...buildParameters,
104+
])
105+
})
106+
107+
test("update workspace with ephemeral parameter enabled", async ({ page }) => {
108+
const richParameters: RichParameter[] = [firstParameter, secondBuildOption]
109+
const template = await createTemplate(
110+
page,
111+
echoResponsesWithParameters(richParameters),
112+
)
113+
114+
const workspaceName = await createWorkspace(page, template)
115+
116+
// Verify that parameter values are default.
117+
await verifyParameters(page, workspaceName, richParameters, [
118+
{ name: firstParameter.name, value: firstParameter.defaultValue },
119+
{ name: secondBuildOption.name, value: secondBuildOption.defaultValue },
120+
])
121+
122+
// Now, update the workspace, and select the value for ephemeral parameter.
123+
const buildParameters = [{ name: secondBuildOption.name, value: "true" }]
124+
await updateWorkspaceParameters(
125+
page,
126+
workspaceName,
127+
richParameters,
128+
buildParameters,
129+
)
130+
131+
// Verify that parameter values are default.
132+
await verifyParameters(page, workspaceName, richParameters, [
133+
{ name: firstParameter.name, value: firstParameter.defaultValue },
134+
{ name: secondBuildOption.name, value: secondBuildOption.defaultValue },
135+
])
136+
})

site/src/pages/WorkspacePage/UpdateBuildParametersDialog.tsx

+7-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,13 @@ export const UpdateBuildParametersDialog: FC<
111111
<Button fullWidth type="button" onClick={dialogProps.onClose}>
112112
Cancel
113113
</Button>
114-
<Button color="primary" fullWidth type="submit" form="updateParameters">
114+
<Button
115+
color="primary"
116+
fullWidth
117+
type="submit"
118+
form="updateParameters"
119+
data-testid="form-submit"
120+
>
115121
Update
116122
</Button>
117123
</DialogActions>

0 commit comments

Comments
 (0)