Skip to content

Commit 234d002

Browse files
committed
Check text parameter value
1 parent cd068b5 commit 234d002

File tree

4 files changed

+164
-81
lines changed

4 files changed

+164
-81
lines changed

site/e2e/helpers.ts

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@ 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.
@@ -32,10 +34,57 @@ export const createWorkspace = async (
3234
await page.getByTestId("form-submit").click()
3335

3436
await expect(page).toHaveURL("/@admin/" + name)
35-
await page.getByTestId("build-status").isVisible()
37+
await page.waitForSelector("[data-testid='build-status']", {
38+
state: "visible",
39+
})
3640
return name
3741
}
3842

43+
export const verifyParameters = async (
44+
page: Page,
45+
workspaceName: string,
46+
richParameters: RichParameter[],
47+
expectedBuildParameters: WorkspaceBuildParameter[],
48+
) => {
49+
await page.goto("/@admin/" + workspaceName + "/settings/parameters", {
50+
waitUntil: "networkidle",
51+
})
52+
await expect(page).toHaveURL(
53+
"/@admin/" + workspaceName + "/settings/parameters",
54+
)
55+
56+
for (const buildParameter of expectedBuildParameters) {
57+
const richParameter = richParameters.find(
58+
(richParam) => richParam.name === buildParameter.name,
59+
)
60+
if (!richParameter) {
61+
throw new Error(
62+
"build parameter is expected to be present in rich parameter schema",
63+
)
64+
}
65+
66+
const parameterLabel = await page.waitForSelector(
67+
"[data-testid='parameter-field-" + richParameter.name + "']",
68+
{ state: "visible" },
69+
)
70+
71+
if (richParameter.type === "bool") {
72+
throw new Error("not implemented yet")
73+
} else if (richParameter.options.length > 0) {
74+
throw new Error("not implemented yet")
75+
} else if (richParameter.type === "list(string)") {
76+
throw new Error("not implemented yet")
77+
} else {
78+
// text or number
79+
const parameterField = await parameterLabel.waitForSelector(
80+
"[data-testid='parameter-field-text'] .MuiOutlinedInput-input",
81+
)
82+
const value = await parameterField.inputValue()
83+
expect(value).toEqual(buildParameter.value)
84+
}
85+
}
86+
}
87+
3988
// createTemplate navigates to the /templates/new page and uploads a template
4089
// with the resources provided in the responses argument.
4190
export const createTemplate = async (

site/e2e/parameters.ts

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
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+
export const firstParameter: RichParameter = {
25+
...emptyParameter,
26+
27+
name: "first_parameter",
28+
displayName: "First parameter",
29+
type: "number",
30+
options: [],
31+
description: "This is first parameter.",
32+
icon: "/emojis/1f310.png",
33+
defaultValue: "123",
34+
mutable: true,
35+
order: 1,
36+
}
37+
38+
export const secondParameter: RichParameter = {
39+
...emptyParameter,
40+
41+
name: "second_parameter",
42+
displayName: "Second parameter",
43+
type: "string",
44+
options: [],
45+
description: "This is second parameter.",
46+
defaultValue: "abc",
47+
icon: "",
48+
mutable: false,
49+
required: false,
50+
order: 2,
51+
}
52+
53+
export const thirdParameter: RichParameter = {
54+
...emptyParameter,
55+
56+
name: "third_parameter",
57+
type: "string",
58+
options: [],
59+
description: "This is third parameter.",
60+
mutable: false,
61+
required: true,
62+
order: 3,
63+
}
64+
65+
export const fourthParameter: RichParameter = {
66+
...emptyParameter,
67+
68+
name: "fourth_parameter",
69+
type: "bool",
70+
options: [],
71+
description: "This is fourth parameter.",
72+
defaultValue: "true",
73+
icon: "",
74+
mutable: false,
75+
required: true,
76+
order: 3,
77+
}
78+
79+
// Build options
80+
81+
export const firstBuildOption: RichParameter = {
82+
...emptyParameter,
83+
84+
name: "first_build_option",
85+
displayName: "First build option",
86+
type: "bool",
87+
options: [],
88+
description: "This is first build option.",
89+
defaultValue: "false",
90+
mutable: true,
91+
ephemeral: true,
92+
required: false,
93+
order: 1,
94+
}
95+
96+
// TODO Options
97+
98+
// TODO list(string)
Lines changed: 11 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import { test } from "@playwright/test"
2-
import { createTemplate, createWorkspace } from "../helpers"
2+
import { createTemplate, createWorkspace, verifyParameters } from "../helpers"
3+
4+
import { secondParameter, fourthParameter } from "../parameters"
5+
import { RichParameter } from "../provisionerGenerated"
36

47
test("create workspace", async ({ page }) => {
58
const template = await createTemplate(page, {
@@ -19,88 +22,12 @@ test("create workspace", async ({ page }) => {
1922
})
2023

2124
test("create workspace with default parameters", async ({ page }) => {
25+
const richParameters: RichParameter[] = [secondParameter, fourthParameter]
2226
const template = await createTemplate(page, {
2327
plan: [
2428
{
2529
complete: {
26-
parameters: [
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-
required: false,
37-
order: 1,
38-
validationRegex: "",
39-
validationError: "",
40-
validationMonotonic: "",
41-
},
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-
mutable: false,
51-
required: false,
52-
order: 2,
53-
validationRegex: "",
54-
validationError: "",
55-
validationMonotonic: "",
56-
},
57-
{
58-
name: "third_parameter",
59-
displayName: "",
60-
type: "string",
61-
options: [],
62-
description: "This is third parameter.",
63-
defaultValue: "",
64-
icon: "",
65-
mutable: false,
66-
required: true,
67-
order: 3,
68-
validationRegex: "",
69-
validationError: "",
70-
validationMonotonic: "",
71-
},
72-
{
73-
name: "fourth_parameter",
74-
displayName: "",
75-
type: "bool",
76-
options: [],
77-
description: "This is fourth parameter.",
78-
defaultValue: "true",
79-
icon: "",
80-
mutable: false,
81-
required: true,
82-
order: 3,
83-
validationRegex: "",
84-
validationError: "",
85-
validationMonotonic: "",
86-
},
87-
{
88-
name: "first_build_option",
89-
displayName: "First build option",
90-
type: "bool",
91-
options: [],
92-
description: "This is first build option.",
93-
defaultValue: "false",
94-
icon: "",
95-
mutable: true,
96-
ephemeral: true,
97-
required: false,
98-
order: 1,
99-
validationRegex: "",
100-
validationError: "",
101-
validationMonotonic: "",
102-
}
103-
],
30+
parameters: richParameters,
10431
},
10532
},
10633
],
@@ -116,5 +43,9 @@ test("create workspace with default parameters", async ({ page }) => {
11643
},
11744
],
11845
})
119-
await createWorkspace(page, template)
46+
const workspaceName = await createWorkspace(page, template)
47+
await verifyParameters(page, workspaceName, richParameters, [
48+
{ name: secondParameter.name, value: secondParameter.defaultValue },
49+
{ name: fourthParameter.name, value: fourthParameter.defaultValue },
50+
])
12051
})

site/src/components/RichParameterInput/RichParameterInput.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ export const RichParameterInput: FC<RichParameterInputProps> = ({
8484
direction="column"
8585
spacing={size === "small" ? 1.25 : 2}
8686
className={size}
87+
data-testid={`parameter-field-${parameter.name}`}
8788
>
8889
<ParameterLabel id={fieldProps.id} parameter={parameter} />
8990
<Box sx={{ display: "flex", flexDirection: "column" }}>
@@ -114,6 +115,7 @@ const RichParameterField: React.FC<RichParameterInputProps> = ({
114115
if (isBoolean(parameter)) {
115116
return (
116117
<RadioGroup
118+
data-testid="parameter-field-boolean"
117119
className={styles.radioGroup}
118120
defaultValue={parameterValue}
119121
onChange={(event) => {
@@ -139,6 +141,7 @@ const RichParameterField: React.FC<RichParameterInputProps> = ({
139141
if (parameter.options.length > 0) {
140142
return (
141143
<RadioGroup
144+
data-testid="parameter-field-options"
142145
className={styles.radioGroup}
143146
defaultValue={parameterValue}
144147
onChange={(event) => {
@@ -185,6 +188,7 @@ const RichParameterField: React.FC<RichParameterInputProps> = ({
185188

186189
return (
187190
<MultiTextField
191+
data-testid="parameter-field-list-of-string"
188192
label={props.label as string}
189193
values={values}
190194
onChange={(values) => {
@@ -206,6 +210,7 @@ const RichParameterField: React.FC<RichParameterInputProps> = ({
206210
return (
207211
<TextField
208212
{...props}
213+
data-testid="parameter-field-text"
209214
className={styles.textField}
210215
type={parameter.type}
211216
disabled={disabled}

0 commit comments

Comments
 (0)