Skip to content

Commit 2b99db9

Browse files
committed
Merge remote-tracking branch 'origin/main' into cj/dbcrypt
2 parents be996ba + 8a1da74 commit 2b99db9

File tree

4 files changed

+374
-2
lines changed

4 files changed

+374
-2
lines changed

site/e2e/helpers.ts

Lines changed: 132 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,135 @@ import {
1313
Provision_Complete,
1414
Provision_Response,
1515
Resource,
16+
RichParameter,
1617
} from "./provisionerGenerated"
1718
import { port } from "./playwright.config"
1819
import * as ssh from "ssh2"
1920
import { Duplex } from "stream"
21+
import { WorkspaceBuildParameter } from "api/typesGenerated"
2022

2123
// createWorkspace creates a workspace for a template.
2224
// It does not wait for it to be running, but it does navigate to the page.
2325
export const createWorkspace = async (
2426
page: Page,
2527
templateName: string,
28+
richParameters: RichParameter[] = [],
29+
buildParameters: WorkspaceBuildParameter[] = [],
2630
): Promise<string> => {
2731
await page.goto("/templates/" + templateName + "/workspace", {
2832
waitUntil: "networkidle",
2933
})
3034
const name = randomName()
3135
await page.getByLabel("name").fill(name)
36+
37+
for (const buildParameter of buildParameters) {
38+
const richParameter = richParameters.find(
39+
(richParam) => richParam.name === buildParameter.name,
40+
)
41+
if (!richParameter) {
42+
throw new Error(
43+
"build parameter is expected to be present in rich parameter schema",
44+
)
45+
}
46+
47+
const parameterLabel = await page.waitForSelector(
48+
"[data-testid='parameter-field-" + richParameter.name + "']",
49+
{ state: "visible" },
50+
)
51+
52+
if (richParameter.type === "bool") {
53+
const parameterField = await parameterLabel.waitForSelector(
54+
"[data-testid='parameter-field-bool'] .MuiRadio-root input[value='" +
55+
buildParameter.value +
56+
"']",
57+
)
58+
await parameterField.check()
59+
} else if (richParameter.options.length > 0) {
60+
const parameterField = await parameterLabel.waitForSelector(
61+
"[data-testid='parameter-field-options'] .MuiRadio-root input[value='" +
62+
buildParameter.value +
63+
"']",
64+
)
65+
await parameterField.check()
66+
} else if (richParameter.type === "list(string)") {
67+
throw new Error("not implemented yet") // FIXME
68+
} else {
69+
// text or number
70+
const parameterField = await parameterLabel.waitForSelector(
71+
"[data-testid='parameter-field-text'] input",
72+
)
73+
await parameterField.fill(buildParameter.value)
74+
}
75+
}
76+
3277
await page.getByTestId("form-submit").click()
3378

3479
await expect(page).toHaveURL("/@admin/" + name)
35-
await page.getByTestId("build-status").isVisible()
80+
await page.waitForSelector("[data-testid='build-status']", {
81+
state: "visible",
82+
})
3683
return name
3784
}
3885

86+
export const verifyParameters = async (
87+
page: Page,
88+
workspaceName: string,
89+
richParameters: RichParameter[],
90+
expectedBuildParameters: WorkspaceBuildParameter[],
91+
) => {
92+
await page.goto("/@admin/" + workspaceName + "/settings/parameters", {
93+
waitUntil: "networkidle",
94+
})
95+
await expect(page).toHaveURL(
96+
"/@admin/" + workspaceName + "/settings/parameters",
97+
)
98+
99+
for (const buildParameter of expectedBuildParameters) {
100+
const richParameter = richParameters.find(
101+
(richParam) => richParam.name === buildParameter.name,
102+
)
103+
if (!richParameter) {
104+
throw new Error(
105+
"build parameter is expected to be present in rich parameter schema",
106+
)
107+
}
108+
109+
const parameterLabel = await page.waitForSelector(
110+
"[data-testid='parameter-field-" + richParameter.name + "']",
111+
{ state: "visible" },
112+
)
113+
114+
const muiDisabled = richParameter.mutable ? "" : ".Mui-disabled"
115+
116+
if (richParameter.type === "bool") {
117+
const parameterField = await parameterLabel.waitForSelector(
118+
"[data-testid='parameter-field-bool'] .MuiRadio-root.Mui-checked" +
119+
muiDisabled +
120+
" input",
121+
)
122+
const value = await parameterField.inputValue()
123+
expect(value).toEqual(buildParameter.value)
124+
} else if (richParameter.options.length > 0) {
125+
const parameterField = await parameterLabel.waitForSelector(
126+
"[data-testid='parameter-field-options'] .MuiRadio-root.Mui-checked" +
127+
muiDisabled +
128+
" input",
129+
)
130+
const value = await parameterField.inputValue()
131+
expect(value).toEqual(buildParameter.value)
132+
} else if (richParameter.type === "list(string)") {
133+
throw new Error("not implemented yet") // FIXME
134+
} else {
135+
// text or number
136+
const parameterField = await parameterLabel.waitForSelector(
137+
"[data-testid='parameter-field-text'] input" + muiDisabled,
138+
)
139+
const value = await parameterField.inputValue()
140+
expect(value).toEqual(buildParameter.value)
141+
}
142+
}
143+
}
144+
39145
// createTemplate navigates to the /templates/new page and uploads a template
40146
// with the resources provided in the responses argument.
41147
export const createTemplate = async (
@@ -401,3 +507,28 @@ const findSessionToken = async (page: Page): Promise<string> => {
401507
}
402508
return sessionCookie.value
403509
}
510+
511+
export const echoResponsesWithParameters = (
512+
richParameters: RichParameter[],
513+
): EchoProvisionerResponses => {
514+
return {
515+
plan: [
516+
{
517+
complete: {
518+
parameters: richParameters,
519+
},
520+
},
521+
],
522+
apply: [
523+
{
524+
complete: {
525+
resources: [
526+
{
527+
name: "example",
528+
},
529+
],
530+
},
531+
},
532+
],
533+
}
534+
}

site/e2e/parameters.ts

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
import { RichParameter } from "./provisionerGenerated"
2+
3+
// Rich parameters
4+
5+
const emptyParameter: RichParameter = {
6+
name: "",
7+
description: "",
8+
type: "",
9+
mutable: false,
10+
defaultValue: "",
11+
icon: "",
12+
options: [],
13+
validationRegex: "",
14+
validationError: "",
15+
validationMin: undefined,
16+
validationMax: undefined,
17+
validationMonotonic: "",
18+
required: false,
19+
displayName: "",
20+
order: 0,
21+
ephemeral: false,
22+
}
23+
24+
// firstParameter is mutable string with a default value (parameter value not required).
25+
export const firstParameter: RichParameter = {
26+
...emptyParameter,
27+
28+
name: "first_parameter",
29+
displayName: "First parameter",
30+
type: "number",
31+
options: [],
32+
description: "This is first parameter.",
33+
icon: "/emojis/1f310.png",
34+
defaultValue: "123",
35+
mutable: true,
36+
order: 1,
37+
}
38+
39+
// secondParameter is immutable string with a default value (parameter value not required).
40+
export const secondParameter: RichParameter = {
41+
...emptyParameter,
42+
43+
name: "second_parameter",
44+
displayName: "Second parameter",
45+
type: "string",
46+
options: [],
47+
description: "This is second parameter.",
48+
defaultValue: "abc",
49+
icon: "",
50+
order: 2,
51+
}
52+
53+
// thirdParameter is mutable string with an empty default value (parameter value not required).
54+
export const thirdParameter: RichParameter = {
55+
...emptyParameter,
56+
57+
name: "third_parameter",
58+
type: "string",
59+
options: [],
60+
description: "This is third parameter.",
61+
defaultValue: "",
62+
mutable: true,
63+
order: 3,
64+
}
65+
66+
// fourthParameter is immutable boolean with a default "true" value (parameter value not required).
67+
export const fourthParameter: RichParameter = {
68+
...emptyParameter,
69+
70+
name: "fourth_parameter",
71+
type: "bool",
72+
options: [],
73+
description: "This is fourth parameter.",
74+
defaultValue: "true",
75+
icon: "",
76+
order: 3,
77+
}
78+
79+
// fifthParameter is immutable "string with options", with a default option selected (parameter value not required).
80+
export const fifthParameter: RichParameter = {
81+
...emptyParameter,
82+
83+
name: "fifth_parameter",
84+
displayName: "Fifth parameter",
85+
type: "string",
86+
options: [
87+
{
88+
name: "ABC",
89+
description: "This is ABC",
90+
value: "abc",
91+
icon: "",
92+
},
93+
{
94+
name: "DEF",
95+
description: "This is DEF",
96+
value: "def",
97+
icon: "",
98+
},
99+
{
100+
name: "GHI",
101+
description: "This is GHI",
102+
value: "ghi",
103+
icon: "",
104+
},
105+
],
106+
description: "This is fifth parameter.",
107+
defaultValue: "def",
108+
icon: "",
109+
order: 3,
110+
}
111+
112+
// sixthParameter is mutable string without a default value (parameter value is required).
113+
export const sixthParameter: RichParameter = {
114+
...emptyParameter,
115+
116+
name: "sixth_parameter",
117+
displayName: "Sixth parameter",
118+
type: "number",
119+
options: [],
120+
description: "This is sixth parameter.",
121+
icon: "/emojis/1f310.png",
122+
required: true,
123+
mutable: true,
124+
order: 1,
125+
}
126+
127+
// seventhParameter is immutable string without a default value (parameter value is required).
128+
export const seventhParameter: RichParameter = {
129+
...emptyParameter,
130+
131+
name: "seventh_parameter",
132+
displayName: "Seventh parameter",
133+
type: "string",
134+
options: [],
135+
description: "This is seventh parameter.",
136+
required: true,
137+
order: 1,
138+
}

0 commit comments

Comments
 (0)