Skip to content

Commit 47bbc4d

Browse files
committed
Restart ephemeral parameters
1 parent 970072f commit 47bbc4d

File tree

3 files changed

+136
-12
lines changed

3 files changed

+136
-12
lines changed

site/e2e/helpers.ts

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,12 @@ export const createWorkspace = async (
7777
await page.getByTestId("form-submit").click()
7878

7979
await expect(page).toHaveURL("/@admin/" + name)
80-
await page.waitForSelector("[data-testid='build-status']", {
81-
state: "visible",
82-
})
80+
await page.waitForSelector(
81+
"span[data-testid='build-status'] >> text=Running",
82+
{
83+
state: "visible",
84+
},
85+
)
8386
return name
8487
}
8588

@@ -213,6 +216,70 @@ export const sshIntoWorkspace = async (
213216
})
214217
}
215218

219+
export const restartWorkspace = async (
220+
page: Page,
221+
workspaceName: string,
222+
richParameters: RichParameter[] = [],
223+
buildParameters: WorkspaceBuildParameter[] = [],
224+
) => {
225+
await page.goto("/@admin/" + workspaceName, {
226+
waitUntil: "domcontentloaded",
227+
})
228+
await expect(page).toHaveURL("/@admin/" + workspaceName)
229+
230+
await page.getByTestId("build-parameters-button").click()
231+
232+
for (const buildParameter of buildParameters) {
233+
const richParameter = richParameters.find(
234+
(richParam) => richParam.name === buildParameter.name,
235+
)
236+
if (!richParameter) {
237+
throw new Error(
238+
"build parameter is expected to be present in rich parameter schema",
239+
)
240+
}
241+
242+
const parameterLabel = await page.waitForSelector(
243+
"[data-testid='parameter-field-" + richParameter.name + "']",
244+
{ state: "visible" },
245+
)
246+
247+
if (richParameter.type === "bool") {
248+
const parameterField = await parameterLabel.waitForSelector(
249+
"[data-testid='parameter-field-bool'] .MuiRadio-root input[value='" +
250+
buildParameter.value +
251+
"']",
252+
)
253+
await parameterField.check()
254+
} else if (richParameter.options.length > 0) {
255+
const parameterField = await parameterLabel.waitForSelector(
256+
"[data-testid='parameter-field-options'] .MuiRadio-root input[value='" +
257+
buildParameter.value +
258+
"']",
259+
)
260+
await parameterField.check()
261+
} else if (richParameter.type === "list(string)") {
262+
throw new Error("not implemented yet") // FIXME
263+
} else {
264+
// text or number
265+
const parameterField = await parameterLabel.waitForSelector(
266+
"[data-testid='parameter-field-text'] input",
267+
)
268+
await parameterField.fill(buildParameter.value)
269+
}
270+
}
271+
272+
await page.getByTestId("build-parameters-submit").click()
273+
await page.getByTestId("confirm-button").click()
274+
275+
await page.waitForSelector(
276+
"span[data-testid='build-status'] >> text=Running",
277+
{
278+
state: "visible",
279+
},
280+
)
281+
}
282+
216283
// startAgent runs the coder agent with the provided token.
217284
// It awaits the agent to be ready before returning.
218285
export const startAgent = async (page: Page, token: string): Promise<void> => {

site/e2e/parameters.ts

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ export const firstParameter: RichParameter = {
2828
name: "first_parameter",
2929
displayName: "First parameter",
3030
type: "number",
31-
options: [],
3231
description: "This is first parameter.",
3332
icon: "/emojis/1f310.png",
3433
defaultValue: "123",
@@ -43,10 +42,8 @@ export const secondParameter: RichParameter = {
4342
name: "second_parameter",
4443
displayName: "Second parameter",
4544
type: "string",
46-
options: [],
4745
description: "This is second parameter.",
4846
defaultValue: "abc",
49-
icon: "",
5047
order: 2,
5148
}
5249

@@ -56,7 +53,6 @@ export const thirdParameter: RichParameter = {
5653

5754
name: "third_parameter",
5855
type: "string",
59-
options: [],
6056
description: "This is third parameter.",
6157
defaultValue: "",
6258
mutable: true,
@@ -69,10 +65,8 @@ export const fourthParameter: RichParameter = {
6965

7066
name: "fourth_parameter",
7167
type: "bool",
72-
options: [],
7368
description: "This is fourth parameter.",
7469
defaultValue: "true",
75-
icon: "",
7670
order: 3,
7771
}
7872

@@ -105,7 +99,6 @@ export const fifthParameter: RichParameter = {
10599
],
106100
description: "This is fifth parameter.",
107101
defaultValue: "def",
108-
icon: "",
109102
order: 3,
110103
}
111104

@@ -116,7 +109,6 @@ export const sixthParameter: RichParameter = {
116109
name: "sixth_parameter",
117110
displayName: "Sixth parameter",
118111
type: "number",
119-
options: [],
120112
description: "This is sixth parameter.",
121113
icon: "/emojis/1f310.png",
122114
required: true,
@@ -131,8 +123,34 @@ export const seventhParameter: RichParameter = {
131123
name: "seventh_parameter",
132124
displayName: "Seventh parameter",
133125
type: "string",
134-
options: [],
135126
description: "This is seventh parameter.",
136127
required: true,
137128
order: 1,
138129
}
130+
131+
// Build options
132+
133+
export const firstBuildOption: RichParameter = {
134+
...emptyParameter,
135+
136+
name: "first_build_option",
137+
displayName: "First build option",
138+
type: "string",
139+
description: "This is first build option.",
140+
icon: "/emojis/1f310.png",
141+
defaultValue: "ABCDEF",
142+
mutable: true,
143+
ephemeral: true,
144+
}
145+
146+
export const secondBuildOption: RichParameter = {
147+
...emptyParameter,
148+
149+
name: "second_build_option",
150+
displayName: "Second build option",
151+
type: "bool",
152+
description: "This is second build option.",
153+
defaultValue: "false",
154+
mutable: true,
155+
ephemeral: true,
156+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { test } from "@playwright/test"
2+
import {
3+
createTemplate,
4+
createWorkspace,
5+
echoResponsesWithParameters,
6+
restartWorkspace,
7+
verifyParameters,
8+
} from "../helpers"
9+
10+
import { firstBuildOption, secondBuildOption } from "../parameters"
11+
import { RichParameter } from "../provisionerGenerated"
12+
13+
test("restart workspace with ephemeral parameters", async ({ page }) => {
14+
const richParameters: RichParameter[] = [firstBuildOption, secondBuildOption]
15+
const template = await createTemplate(
16+
page,
17+
echoResponsesWithParameters(richParameters),
18+
)
19+
const workspaceName = await createWorkspace(page, template)
20+
21+
// Verify that build options are default (not selected).
22+
await verifyParameters(page, workspaceName, richParameters, [
23+
{ name: firstBuildOption.name, value: firstBuildOption.defaultValue },
24+
{ name: secondBuildOption.name, value: secondBuildOption.defaultValue },
25+
])
26+
27+
// Now, restart the workspace with ephemeral parameters selected.
28+
const buildParameters = [
29+
{ name: firstBuildOption.name, value: "AAAAA" },
30+
{ name: secondBuildOption.name, value: "true" },
31+
]
32+
await restartWorkspace(page, workspaceName, richParameters, buildParameters)
33+
34+
// Verify that build options are default (not selected).
35+
await verifyParameters(page, workspaceName, richParameters, [
36+
{ name: firstBuildOption.name, value: buildParameters[0].value },
37+
{ name: secondBuildOption.name, value: buildParameters[1].value },
38+
])
39+
})

0 commit comments

Comments
 (0)