From fc1ada037b5e7277fad9d6558a7112e7c30ccbb7 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Fri, 18 Aug 2023 16:12:02 +0200 Subject: [PATCH 01/13] WIP --- site/e2e/tests/createWorkspace.spec.ts | 101 +++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/site/e2e/tests/createWorkspace.spec.ts b/site/e2e/tests/createWorkspace.spec.ts index 3317691300f5f..bbac2ce519fe5 100644 --- a/site/e2e/tests/createWorkspace.spec.ts +++ b/site/e2e/tests/createWorkspace.spec.ts @@ -17,3 +17,104 @@ test("create workspace", async ({ page }) => { }) await createWorkspace(page, template) }) + +test("create workspace with default parameters", async ({ page }) => { + const template = await createTemplate(page, { + plan: [ + { + complete: { + parameters: [ + { + name: "first_parameter", + displayName: "First parameter", + type: "number", + options: [], + description: "This is first parameter.", + icon: "/emojis/1f310.png", + defaultValue: "123", + mutable: true, + required: false, + order: 1, + validationRegex: "", + validationError: "", + validationMonotonic: "", + }, + { + name: "second_parameter", + displayName: "Second parameter", + type: "string", + options: [], + description: "This is second parameter.", + defaultValue: "abc", + icon: "", + mutable: false, + required: false, + order: 2, + validationRegex: "", + validationError: "", + validationMonotonic: "", + }, + { + name: "third_parameter", + displayName: "", + type: "string", + options: [], + description: "This is third parameter.", + defaultValue: "", + icon: "", + mutable: false, + required: true, + order: 3, + validationRegex: "", + validationError: "", + validationMonotonic: "", + }, + { + name: "fourth_parameter", + displayName: "", + type: "bool", + options: [], + description: "This is fourth parameter.", + defaultValue: "true", + icon: "", + mutable: false, + required: true, + order: 3, + validationRegex: "", + validationError: "", + validationMonotonic: "", + }, + { + name: "first_build_option", + displayName: "First build option", + type: "bool", + options: [], + description: "This is first build option.", + defaultValue: "false", + icon: "", + mutable: true, + ephemeral: true, + required: false, + order: 1, + validationRegex: "", + validationError: "", + validationMonotonic: "", + } + ], + }, + }, + ], + apply: [ + { + complete: { + resources: [ + { + name: "example", + }, + ], + }, + }, + ], + }) + await createWorkspace(page, template) +}) From 234d002a1c269e0540f215d8e9022eaae857b0f9 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Mon, 21 Aug 2023 14:49:44 +0200 Subject: [PATCH 02/13] Check text parameter value --- site/e2e/helpers.ts | 51 +++++++++- site/e2e/parameters.ts | 98 +++++++++++++++++++ site/e2e/tests/createWorkspace.spec.ts | 91 +++-------------- .../RichParameterInput/RichParameterInput.tsx | 5 + 4 files changed, 164 insertions(+), 81 deletions(-) create mode 100644 site/e2e/parameters.ts diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index bdfc8b015352d..e90d2d231d328 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -13,10 +13,12 @@ import { Provision_Complete, Provision_Response, Resource, + RichParameter, } from "./provisionerGenerated" import { port } from "./playwright.config" import * as ssh from "ssh2" import { Duplex } from "stream" +import { WorkspaceBuildParameter } from "api/typesGenerated" // createWorkspace creates a workspace for a template. // It does not wait for it to be running, but it does navigate to the page. @@ -32,10 +34,57 @@ export const createWorkspace = async ( await page.getByTestId("form-submit").click() await expect(page).toHaveURL("/@admin/" + name) - await page.getByTestId("build-status").isVisible() + await page.waitForSelector("[data-testid='build-status']", { + state: "visible", + }) return name } +export const verifyParameters = async ( + page: Page, + workspaceName: string, + richParameters: RichParameter[], + expectedBuildParameters: WorkspaceBuildParameter[], +) => { + await page.goto("/@admin/" + workspaceName + "/settings/parameters", { + waitUntil: "networkidle", + }) + await expect(page).toHaveURL( + "/@admin/" + workspaceName + "/settings/parameters", + ) + + for (const buildParameter of expectedBuildParameters) { + const richParameter = richParameters.find( + (richParam) => richParam.name === buildParameter.name, + ) + if (!richParameter) { + throw new Error( + "build parameter is expected to be present in rich parameter schema", + ) + } + + const parameterLabel = await page.waitForSelector( + "[data-testid='parameter-field-" + richParameter.name + "']", + { state: "visible" }, + ) + + if (richParameter.type === "bool") { + throw new Error("not implemented yet") + } else if (richParameter.options.length > 0) { + throw new Error("not implemented yet") + } else if (richParameter.type === "list(string)") { + throw new Error("not implemented yet") + } else { + // text or number + const parameterField = await parameterLabel.waitForSelector( + "[data-testid='parameter-field-text'] .MuiOutlinedInput-input", + ) + const value = await parameterField.inputValue() + expect(value).toEqual(buildParameter.value) + } + } +} + // createTemplate navigates to the /templates/new page and uploads a template // with the resources provided in the responses argument. export const createTemplate = async ( diff --git a/site/e2e/parameters.ts b/site/e2e/parameters.ts new file mode 100644 index 0000000000000..6b931aa213ee7 --- /dev/null +++ b/site/e2e/parameters.ts @@ -0,0 +1,98 @@ +import { RichParameter } from "./provisionerGenerated" + +// Rich parameters + +const emptyParameter: RichParameter = { + name: "", + description: "", + type: "", + mutable: false, + defaultValue: "", + icon: "", + options: [], + validationRegex: "", + validationError: "", + validationMin: undefined, + validationMax: undefined, + validationMonotonic: "", + required: false, + displayName: "", + order: 0, + ephemeral: false, +} + +export const firstParameter: RichParameter = { + ...emptyParameter, + + name: "first_parameter", + displayName: "First parameter", + type: "number", + options: [], + description: "This is first parameter.", + icon: "/emojis/1f310.png", + defaultValue: "123", + mutable: true, + order: 1, +} + +export const secondParameter: RichParameter = { + ...emptyParameter, + + name: "second_parameter", + displayName: "Second parameter", + type: "string", + options: [], + description: "This is second parameter.", + defaultValue: "abc", + icon: "", + mutable: false, + required: false, + order: 2, +} + +export const thirdParameter: RichParameter = { + ...emptyParameter, + + name: "third_parameter", + type: "string", + options: [], + description: "This is third parameter.", + mutable: false, + required: true, + order: 3, +} + +export const fourthParameter: RichParameter = { + ...emptyParameter, + + name: "fourth_parameter", + type: "bool", + options: [], + description: "This is fourth parameter.", + defaultValue: "true", + icon: "", + mutable: false, + required: true, + order: 3, +} + +// Build options + +export const firstBuildOption: RichParameter = { + ...emptyParameter, + + name: "first_build_option", + displayName: "First build option", + type: "bool", + options: [], + description: "This is first build option.", + defaultValue: "false", + mutable: true, + ephemeral: true, + required: false, + order: 1, +} + +// TODO Options + +// TODO list(string) diff --git a/site/e2e/tests/createWorkspace.spec.ts b/site/e2e/tests/createWorkspace.spec.ts index bbac2ce519fe5..738fdb28e12cd 100644 --- a/site/e2e/tests/createWorkspace.spec.ts +++ b/site/e2e/tests/createWorkspace.spec.ts @@ -1,5 +1,8 @@ import { test } from "@playwright/test" -import { createTemplate, createWorkspace } from "../helpers" +import { createTemplate, createWorkspace, verifyParameters } from "../helpers" + +import { secondParameter, fourthParameter } from "../parameters" +import { RichParameter } from "../provisionerGenerated" test("create workspace", async ({ page }) => { const template = await createTemplate(page, { @@ -19,88 +22,12 @@ test("create workspace", async ({ page }) => { }) test("create workspace with default parameters", async ({ page }) => { + const richParameters: RichParameter[] = [secondParameter, fourthParameter] const template = await createTemplate(page, { plan: [ { complete: { - parameters: [ - { - name: "first_parameter", - displayName: "First parameter", - type: "number", - options: [], - description: "This is first parameter.", - icon: "/emojis/1f310.png", - defaultValue: "123", - mutable: true, - required: false, - order: 1, - validationRegex: "", - validationError: "", - validationMonotonic: "", - }, - { - name: "second_parameter", - displayName: "Second parameter", - type: "string", - options: [], - description: "This is second parameter.", - defaultValue: "abc", - icon: "", - mutable: false, - required: false, - order: 2, - validationRegex: "", - validationError: "", - validationMonotonic: "", - }, - { - name: "third_parameter", - displayName: "", - type: "string", - options: [], - description: "This is third parameter.", - defaultValue: "", - icon: "", - mutable: false, - required: true, - order: 3, - validationRegex: "", - validationError: "", - validationMonotonic: "", - }, - { - name: "fourth_parameter", - displayName: "", - type: "bool", - options: [], - description: "This is fourth parameter.", - defaultValue: "true", - icon: "", - mutable: false, - required: true, - order: 3, - validationRegex: "", - validationError: "", - validationMonotonic: "", - }, - { - name: "first_build_option", - displayName: "First build option", - type: "bool", - options: [], - description: "This is first build option.", - defaultValue: "false", - icon: "", - mutable: true, - ephemeral: true, - required: false, - order: 1, - validationRegex: "", - validationError: "", - validationMonotonic: "", - } - ], + parameters: richParameters, }, }, ], @@ -116,5 +43,9 @@ test("create workspace with default parameters", async ({ page }) => { }, ], }) - await createWorkspace(page, template) + const workspaceName = await createWorkspace(page, template) + await verifyParameters(page, workspaceName, richParameters, [ + { name: secondParameter.name, value: secondParameter.defaultValue }, + { name: fourthParameter.name, value: fourthParameter.defaultValue }, + ]) }) diff --git a/site/src/components/RichParameterInput/RichParameterInput.tsx b/site/src/components/RichParameterInput/RichParameterInput.tsx index 7d5b83894f09e..4387a58cea8bd 100644 --- a/site/src/components/RichParameterInput/RichParameterInput.tsx +++ b/site/src/components/RichParameterInput/RichParameterInput.tsx @@ -84,6 +84,7 @@ export const RichParameterInput: FC = ({ direction="column" spacing={size === "small" ? 1.25 : 2} className={size} + data-testid={`parameter-field-${parameter.name}`} > @@ -114,6 +115,7 @@ const RichParameterField: React.FC = ({ if (isBoolean(parameter)) { return ( { @@ -139,6 +141,7 @@ const RichParameterField: React.FC = ({ if (parameter.options.length > 0) { return ( { @@ -185,6 +188,7 @@ const RichParameterField: React.FC = ({ return ( { @@ -206,6 +210,7 @@ const RichParameterField: React.FC = ({ return ( Date: Mon, 21 Aug 2023 15:09:26 +0200 Subject: [PATCH 03/13] Check mutability --- site/e2e/helpers.ts | 10 ++++++++-- .../RichParameterInput/RichParameterInput.tsx | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index e90d2d231d328..bebf86454c019 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -68,8 +68,14 @@ export const verifyParameters = async ( { state: "visible" }, ) + const muiDisabled = richParameter.mutable ? "" : ".Mui-disabled" + if (richParameter.type === "bool") { - throw new Error("not implemented yet") + const parameterField = await parameterLabel.waitForSelector( + "[data-testid='parameter-field-bool'] .MuiRadio-root.Mui-checked" + muiDisabled + " input", + ) + const value = await parameterField.inputValue() + expect(value).toEqual(buildParameter.value) } else if (richParameter.options.length > 0) { throw new Error("not implemented yet") } else if (richParameter.type === "list(string)") { @@ -77,7 +83,7 @@ export const verifyParameters = async ( } else { // text or number const parameterField = await parameterLabel.waitForSelector( - "[data-testid='parameter-field-text'] .MuiOutlinedInput-input", + "[data-testid='parameter-field-text'] input" + muiDisabled, ) const value = await parameterField.inputValue() expect(value).toEqual(buildParameter.value) diff --git a/site/src/components/RichParameterInput/RichParameterInput.tsx b/site/src/components/RichParameterInput/RichParameterInput.tsx index 4387a58cea8bd..4e3a67170601f 100644 --- a/site/src/components/RichParameterInput/RichParameterInput.tsx +++ b/site/src/components/RichParameterInput/RichParameterInput.tsx @@ -115,7 +115,7 @@ const RichParameterField: React.FC = ({ if (isBoolean(parameter)) { return ( { From d784d466df47b78cbaea6d7cfb1c3291a6b33f04 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Mon, 21 Aug 2023 15:16:07 +0200 Subject: [PATCH 04/13] Support options --- site/e2e/helpers.ts | 6 ++++- site/e2e/parameters.ts | 36 ++++++++++++++++++++++++-- site/e2e/tests/createWorkspace.spec.ts | 7 ++--- 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index bebf86454c019..e75f74f83bc70 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -77,7 +77,11 @@ export const verifyParameters = async ( const value = await parameterField.inputValue() expect(value).toEqual(buildParameter.value) } else if (richParameter.options.length > 0) { - throw new Error("not implemented yet") + const parameterField = await parameterLabel.waitForSelector( + "[data-testid='parameter-field-options'] .MuiRadio-root.Mui-checked" + muiDisabled + " input", + ) + const value = await parameterField.inputValue() + expect(value).toEqual(buildParameter.value) } else if (richParameter.type === "list(string)") { throw new Error("not implemented yet") } else { diff --git a/site/e2e/parameters.ts b/site/e2e/parameters.ts index 6b931aa213ee7..c2cb3515873a0 100644 --- a/site/e2e/parameters.ts +++ b/site/e2e/parameters.ts @@ -76,6 +76,40 @@ export const fourthParameter: RichParameter = { order: 3, } +export const sixthParameter: RichParameter = { + ...emptyParameter, + + name: "sixth_parameter", + displayName: "Sixth parameter", + type: "string", + options: [ + { + name: "ABC", + description: "This is ABC", + value: "abc", + icon: "", + }, + { + name: "DEF", + description: "This is DEF", + value: "def", + icon: "", + }, + { + name: "GHI", + description: "This is GHI", + value: "ghi", + icon: "", + }, + ], + description: "This is sixth parameter.", + defaultValue: "def", + icon: "", + mutable: false, + required: false, + order: 3, +} + // Build options export const firstBuildOption: RichParameter = { @@ -93,6 +127,4 @@ export const firstBuildOption: RichParameter = { order: 1, } -// TODO Options - // TODO list(string) diff --git a/site/e2e/tests/createWorkspace.spec.ts b/site/e2e/tests/createWorkspace.spec.ts index 738fdb28e12cd..ae700d3c8349c 100644 --- a/site/e2e/tests/createWorkspace.spec.ts +++ b/site/e2e/tests/createWorkspace.spec.ts @@ -1,7 +1,7 @@ import { test } from "@playwright/test" import { createTemplate, createWorkspace, verifyParameters } from "../helpers" -import { secondParameter, fourthParameter } from "../parameters" +import { secondParameter, fourthParameter, sixthParameter } from "../parameters" import { RichParameter } from "../provisionerGenerated" test("create workspace", async ({ page }) => { @@ -21,8 +21,8 @@ test("create workspace", async ({ page }) => { await createWorkspace(page, template) }) -test("create workspace with default parameters", async ({ page }) => { - const richParameters: RichParameter[] = [secondParameter, fourthParameter] +test("create workspace with default immutable parameters", async ({ page }) => { + const richParameters: RichParameter[] = [secondParameter, fourthParameter, sixthParameter] const template = await createTemplate(page, { plan: [ { @@ -47,5 +47,6 @@ test("create workspace with default parameters", async ({ page }) => { await verifyParameters(page, workspaceName, richParameters, [ { name: secondParameter.name, value: secondParameter.defaultValue }, { name: fourthParameter.name, value: fourthParameter.defaultValue }, + { name: sixthParameter.name, value: sixthParameter.defaultValue }, ]) }) From 06c091292fba2298f31bb9a481badffba6a2dfd7 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Mon, 21 Aug 2023 15:18:29 +0200 Subject: [PATCH 05/13] make fmt --- site/e2e/helpers.ts | 8 ++++++-- site/e2e/tests/createWorkspace.spec.ts | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index e75f74f83bc70..4badea7f4c216 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -72,13 +72,17 @@ export const verifyParameters = async ( if (richParameter.type === "bool") { const parameterField = await parameterLabel.waitForSelector( - "[data-testid='parameter-field-bool'] .MuiRadio-root.Mui-checked" + muiDisabled + " input", + "[data-testid='parameter-field-bool'] .MuiRadio-root.Mui-checked" + + muiDisabled + + " input", ) const value = await parameterField.inputValue() expect(value).toEqual(buildParameter.value) } else if (richParameter.options.length > 0) { const parameterField = await parameterLabel.waitForSelector( - "[data-testid='parameter-field-options'] .MuiRadio-root.Mui-checked" + muiDisabled + " input", + "[data-testid='parameter-field-options'] .MuiRadio-root.Mui-checked" + + muiDisabled + + " input", ) const value = await parameterField.inputValue() expect(value).toEqual(buildParameter.value) diff --git a/site/e2e/tests/createWorkspace.spec.ts b/site/e2e/tests/createWorkspace.spec.ts index ae700d3c8349c..20b5d944e9212 100644 --- a/site/e2e/tests/createWorkspace.spec.ts +++ b/site/e2e/tests/createWorkspace.spec.ts @@ -22,7 +22,11 @@ test("create workspace", async ({ page }) => { }) test("create workspace with default immutable parameters", async ({ page }) => { - const richParameters: RichParameter[] = [secondParameter, fourthParameter, sixthParameter] + const richParameters: RichParameter[] = [ + secondParameter, + fourthParameter, + sixthParameter, + ] const template = await createTemplate(page, { plan: [ { From beb4639707f7e8bb8fc127ff8df1457f32c1953b Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Mon, 21 Aug 2023 15:27:37 +0200 Subject: [PATCH 06/13] Mutable parameters --- site/e2e/parameters.ts | 13 ++++---- site/e2e/tests/createWorkspace.spec.ts | 41 ++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/site/e2e/parameters.ts b/site/e2e/parameters.ts index c2cb3515873a0..c2ae984fd39de 100644 --- a/site/e2e/parameters.ts +++ b/site/e2e/parameters.ts @@ -57,8 +57,9 @@ export const thirdParameter: RichParameter = { type: "string", options: [], description: "This is third parameter.", - mutable: false, - required: true, + defaultValue: "", + mutable: true, + required: false, order: 3, } @@ -76,11 +77,11 @@ export const fourthParameter: RichParameter = { order: 3, } -export const sixthParameter: RichParameter = { +export const fifthParameter: RichParameter = { ...emptyParameter, - name: "sixth_parameter", - displayName: "Sixth parameter", + name: "fifth_parameter", + displayName: "Fifth parameter", type: "string", options: [ { @@ -102,7 +103,7 @@ export const sixthParameter: RichParameter = { icon: "", }, ], - description: "This is sixth parameter.", + description: "This is fifth parameter.", defaultValue: "def", icon: "", mutable: false, diff --git a/site/e2e/tests/createWorkspace.spec.ts b/site/e2e/tests/createWorkspace.spec.ts index 20b5d944e9212..1d8c14b86bb41 100644 --- a/site/e2e/tests/createWorkspace.spec.ts +++ b/site/e2e/tests/createWorkspace.spec.ts @@ -1,7 +1,13 @@ import { test } from "@playwright/test" import { createTemplate, createWorkspace, verifyParameters } from "../helpers" -import { secondParameter, fourthParameter, sixthParameter } from "../parameters" +import { + secondParameter, + fourthParameter, + fifthParameter, + firstParameter, + thirdParameter, +} from "../parameters" import { RichParameter } from "../provisionerGenerated" test("create workspace", async ({ page }) => { @@ -25,7 +31,7 @@ test("create workspace with default immutable parameters", async ({ page }) => { const richParameters: RichParameter[] = [ secondParameter, fourthParameter, - sixthParameter, + fifthParameter, ] const template = await createTemplate(page, { plan: [ @@ -51,6 +57,35 @@ test("create workspace with default immutable parameters", async ({ page }) => { await verifyParameters(page, workspaceName, richParameters, [ { name: secondParameter.name, value: secondParameter.defaultValue }, { name: fourthParameter.name, value: fourthParameter.defaultValue }, - { name: sixthParameter.name, value: sixthParameter.defaultValue }, + { name: fifthParameter.name, value: fifthParameter.defaultValue }, + ]) +}) + +test("create workspace with default mutable parameters", async ({ page }) => { + const richParameters: RichParameter[] = [firstParameter, thirdParameter] + const template = await createTemplate(page, { + plan: [ + { + complete: { + parameters: richParameters, + }, + }, + ], + apply: [ + { + complete: { + resources: [ + { + name: "example", + }, + ], + }, + }, + ], + }) + const workspaceName = await createWorkspace(page, template) + await verifyParameters(page, workspaceName, richParameters, [ + { name: firstParameter.name, value: firstParameter.defaultValue }, + { name: thirdParameter.name, value: thirdParameter.defaultValue }, ]) }) From 193630394f6f50d4fcd27029494f2698a78851ec Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Mon, 21 Aug 2023 15:31:14 +0200 Subject: [PATCH 07/13] TODOs --- site/e2e/parameters.ts | 19 ------------------- site/e2e/tests/createWorkspace.spec.ts | 4 ++++ 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/site/e2e/parameters.ts b/site/e2e/parameters.ts index c2ae984fd39de..6b3cc030ba1cf 100644 --- a/site/e2e/parameters.ts +++ b/site/e2e/parameters.ts @@ -110,22 +110,3 @@ export const fifthParameter: RichParameter = { required: false, order: 3, } - -// Build options - -export const firstBuildOption: RichParameter = { - ...emptyParameter, - - name: "first_build_option", - displayName: "First build option", - type: "bool", - options: [], - description: "This is first build option.", - defaultValue: "false", - mutable: true, - ephemeral: true, - required: false, - order: 1, -} - -// TODO list(string) diff --git a/site/e2e/tests/createWorkspace.spec.ts b/site/e2e/tests/createWorkspace.spec.ts index 1d8c14b86bb41..59309ddd61bf8 100644 --- a/site/e2e/tests/createWorkspace.spec.ts +++ b/site/e2e/tests/createWorkspace.spec.ts @@ -89,3 +89,7 @@ test("create workspace with default mutable parameters", async ({ page }) => { { name: thirdParameter.name, value: thirdParameter.defaultValue }, ]) }) + +// TODO refactor: EchoProvisionerResponses +// TODO custom parameter values +// TODO describe parameters From 9532040a3a5b24962d014a436c02d65a5703751a Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Tue, 22 Aug 2023 10:21:37 +0200 Subject: [PATCH 08/13] WIP --- site/e2e/helpers.ts | 25 ++++++++++++++ site/e2e/parameters.ts | 12 +++---- site/e2e/tests/createWorkspace.spec.ts | 47 +++----------------------- 3 files changed, 34 insertions(+), 50 deletions(-) diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index 4badea7f4c216..7f5582ff63c0b 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -464,3 +464,28 @@ const findSessionToken = async (page: Page): Promise => { } return sessionCookie.value } + +export const echoResponsesWithParameters = ( + richParameters: RichParameter[] +): EchoProvisionerResponses => { + return { + plan: [ + { + complete: { + parameters: richParameters, + }, + }, + ], + apply: [ + { + complete: { + resources: [ + { + name: "example", + }, + ], + }, + }, + ], + } +} diff --git a/site/e2e/parameters.ts b/site/e2e/parameters.ts index 6b3cc030ba1cf..003636d7c6a18 100644 --- a/site/e2e/parameters.ts +++ b/site/e2e/parameters.ts @@ -21,6 +21,7 @@ const emptyParameter: RichParameter = { ephemeral: false, } +// firstParameter is mutable string with a default value (parameter value not required). export const firstParameter: RichParameter = { ...emptyParameter, @@ -35,6 +36,7 @@ export const firstParameter: RichParameter = { order: 1, } +// secondParameter is immutable string with a default value (parameter value not required). export const secondParameter: RichParameter = { ...emptyParameter, @@ -45,11 +47,10 @@ export const secondParameter: RichParameter = { description: "This is second parameter.", defaultValue: "abc", icon: "", - mutable: false, - required: false, order: 2, } +// thirdParameter is mutable string with an empty default value (parameter value not required). export const thirdParameter: RichParameter = { ...emptyParameter, @@ -59,10 +60,10 @@ export const thirdParameter: RichParameter = { description: "This is third parameter.", defaultValue: "", mutable: true, - required: false, order: 3, } +// fourthParameter is immutable boolean with a default "true" value (parameter value not required). export const fourthParameter: RichParameter = { ...emptyParameter, @@ -72,11 +73,10 @@ export const fourthParameter: RichParameter = { description: "This is fourth parameter.", defaultValue: "true", icon: "", - mutable: false, - required: true, order: 3, } +// fifthParameter is immutable "string with options", with a default option selected (parameter value not required). export const fifthParameter: RichParameter = { ...emptyParameter, @@ -106,7 +106,5 @@ export const fifthParameter: RichParameter = { description: "This is fifth parameter.", defaultValue: "def", icon: "", - mutable: false, - required: false, order: 3, } diff --git a/site/e2e/tests/createWorkspace.spec.ts b/site/e2e/tests/createWorkspace.spec.ts index 59309ddd61bf8..577742d514cb3 100644 --- a/site/e2e/tests/createWorkspace.spec.ts +++ b/site/e2e/tests/createWorkspace.spec.ts @@ -1,5 +1,5 @@ import { test } from "@playwright/test" -import { createTemplate, createWorkspace, verifyParameters } from "../helpers" +import { createTemplate, createWorkspace, echoResponsesWithParameters, verifyParameters } from "../helpers" import { secondParameter, @@ -33,26 +33,7 @@ test("create workspace with default immutable parameters", async ({ page }) => { fourthParameter, fifthParameter, ] - const template = await createTemplate(page, { - plan: [ - { - complete: { - parameters: richParameters, - }, - }, - ], - apply: [ - { - complete: { - resources: [ - { - name: "example", - }, - ], - }, - }, - ], - }) + const template = await createTemplate(page, echoResponsesWithParameters(richParameters)) const workspaceName = await createWorkspace(page, template) await verifyParameters(page, workspaceName, richParameters, [ { name: secondParameter.name, value: secondParameter.defaultValue }, @@ -63,26 +44,7 @@ test("create workspace with default immutable parameters", async ({ page }) => { test("create workspace with default mutable parameters", async ({ page }) => { const richParameters: RichParameter[] = [firstParameter, thirdParameter] - const template = await createTemplate(page, { - plan: [ - { - complete: { - parameters: richParameters, - }, - }, - ], - apply: [ - { - complete: { - resources: [ - { - name: "example", - }, - ], - }, - }, - ], - }) + const template = await createTemplate(page, echoResponsesWithParameters(richParameters)) const workspaceName = await createWorkspace(page, template) await verifyParameters(page, workspaceName, richParameters, [ { name: firstParameter.name, value: firstParameter.defaultValue }, @@ -90,6 +52,5 @@ test("create workspace with default mutable parameters", async ({ page }) => { ]) }) -// TODO refactor: EchoProvisionerResponses // TODO custom parameter values -// TODO describe parameters + From 2ffc3d44271690c55838a97f8247fe7843d4139c Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Tue, 22 Aug 2023 11:25:46 +0200 Subject: [PATCH 09/13] more tests --- site/e2e/helpers.ts | 4 ++- site/e2e/parameters.ts | 28 +++++++++++++++ site/e2e/tests/createWorkspace.spec.ts | 47 +++++++++++++++++++++++--- 3 files changed, 74 insertions(+), 5 deletions(-) diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index 7f5582ff63c0b..5e813de09f822 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -25,12 +25,14 @@ import { WorkspaceBuildParameter } from "api/typesGenerated" export const createWorkspace = async ( page: Page, templateName: string, + buildParameters: WorkspaceBuildParameter[] = [], ): Promise => { await page.goto("/templates/" + templateName + "/workspace", { waitUntil: "networkidle", }) const name = randomName() await page.getByLabel("name").fill(name) + await page.getByTestId("form-submit").click() await expect(page).toHaveURL("/@admin/" + name) @@ -466,7 +468,7 @@ const findSessionToken = async (page: Page): Promise => { } export const echoResponsesWithParameters = ( - richParameters: RichParameter[] + richParameters: RichParameter[], ): EchoProvisionerResponses => { return { plan: [ diff --git a/site/e2e/parameters.ts b/site/e2e/parameters.ts index 003636d7c6a18..c575fdcf83162 100644 --- a/site/e2e/parameters.ts +++ b/site/e2e/parameters.ts @@ -108,3 +108,31 @@ export const fifthParameter: RichParameter = { icon: "", order: 3, } + +// sixthParameter is mutable string without a default value (parameter value is required). +export const sixthParameter: RichParameter = { + ...emptyParameter, + + name: "sixth_parameter", + displayName: "Sixth parameter", + type: "number", + options: [], + description: "This is sixth parameter.", + icon: "/emojis/1f310.png", + required: true, + mutable: true, + order: 1, +} + +// seventhParameter is immutable string without a default value (parameter value is required). +export const seventhParameter: RichParameter = { + ...emptyParameter, + + name: "seventh_parameter", + displayName: "Seventh parameter", + type: "string", + options: [], + description: "This is seventh parameter.", + required: true, + order: 1, +} diff --git a/site/e2e/tests/createWorkspace.spec.ts b/site/e2e/tests/createWorkspace.spec.ts index 577742d514cb3..f56e73841277e 100644 --- a/site/e2e/tests/createWorkspace.spec.ts +++ b/site/e2e/tests/createWorkspace.spec.ts @@ -1,5 +1,10 @@ import { test } from "@playwright/test" -import { createTemplate, createWorkspace, echoResponsesWithParameters, verifyParameters } from "../helpers" +import { + createTemplate, + createWorkspace, + echoResponsesWithParameters, + verifyParameters, +} from "../helpers" import { secondParameter, @@ -7,6 +12,8 @@ import { fifthParameter, firstParameter, thirdParameter, + seventhParameter, + sixthParameter, } from "../parameters" import { RichParameter } from "../provisionerGenerated" @@ -33,7 +40,10 @@ test("create workspace with default immutable parameters", async ({ page }) => { fourthParameter, fifthParameter, ] - const template = await createTemplate(page, echoResponsesWithParameters(richParameters)) + const template = await createTemplate( + page, + echoResponsesWithParameters(richParameters), + ) const workspaceName = await createWorkspace(page, template) await verifyParameters(page, workspaceName, richParameters, [ { name: secondParameter.name, value: secondParameter.defaultValue }, @@ -44,7 +54,10 @@ test("create workspace with default immutable parameters", async ({ page }) => { test("create workspace with default mutable parameters", async ({ page }) => { const richParameters: RichParameter[] = [firstParameter, thirdParameter] - const template = await createTemplate(page, echoResponsesWithParameters(richParameters)) + const template = await createTemplate( + page, + echoResponsesWithParameters(richParameters), + ) const workspaceName = await createWorkspace(page, template) await verifyParameters(page, workspaceName, richParameters, [ { name: firstParameter.name, value: firstParameter.defaultValue }, @@ -52,5 +65,31 @@ test("create workspace with default mutable parameters", async ({ page }) => { ]) }) -// TODO custom parameter values +test("create workspace with default and required parameters", async ({ + page, +}) => { + const richParameters: RichParameter[] = [ + secondParameter, + fourthParameter, + sixthParameter, + seventhParameter, + ] + const buildParameters = [ + { name: sixthParameter.name, value: "12345" }, + { name: seventhParameter.name, value: "abcdef" }, + ] + const template = await createTemplate( + page, + echoResponsesWithParameters(richParameters), + ) + const workspaceName = await createWorkspace(page, template, buildParameters) + await verifyParameters(page, workspaceName, richParameters, [ + // user values: + ...buildParameters, + // default values: + { name: secondParameter.name, value: secondParameter.defaultValue }, + { name: fourthParameter.name, value: fourthParameter.defaultValue }, + ]) +}) +// TODO custom parameter values From cd96b18bd0145abf19a9d4dce413825f279e54b6 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Tue, 22 Aug 2023 11:44:50 +0200 Subject: [PATCH 10/13] Create workspace with params --- site/e2e/helpers.ts | 41 ++++++++++++++++++++++++++ site/e2e/tests/createWorkspace.spec.ts | 7 ++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index 5e813de09f822..20a33befb0abc 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -25,6 +25,7 @@ import { WorkspaceBuildParameter } from "api/typesGenerated" export const createWorkspace = async ( page: Page, templateName: string, + richParameters: RichParameter[] = [], buildParameters: WorkspaceBuildParameter[] = [], ): Promise => { await page.goto("/templates/" + templateName + "/workspace", { @@ -33,6 +34,46 @@ export const createWorkspace = async ( const name = randomName() await page.getByLabel("name").fill(name) + for (const buildParameter of buildParameters) { + const richParameter = richParameters.find( + (richParam) => richParam.name === buildParameter.name, + ) + if (!richParameter) { + throw new Error( + "build parameter is expected to be present in rich parameter schema", + ) + } + + const parameterLabel = await page.waitForSelector( + "[data-testid='parameter-field-" + richParameter.name + "']", + { state: "visible" }, + ) + + if (richParameter.type === "bool") { + const parameterField = await parameterLabel.waitForSelector( + "[data-testid='parameter-field-bool'] .MuiRadio-root input[value='" + + buildParameter.value + + "']", + ) + await parameterField.check() + } else if (richParameter.options.length > 0) { + const parameterField = await parameterLabel.waitForSelector( + "[data-testid='parameter-field-options'] .MuiRadio-root input[value='" + + buildParameter.value + + "']", + ) + await parameterField.check() + } else if (richParameter.type === "list(string)") { + throw new Error("not implemented yet") + } else { + // text or number + const parameterField = await parameterLabel.waitForSelector( + "[data-testid='parameter-field-text'] input", + ) + await parameterField.fill(buildParameter.value) + } + } + await page.getByTestId("form-submit").click() await expect(page).toHaveURL("/@admin/" + name) diff --git a/site/e2e/tests/createWorkspace.spec.ts b/site/e2e/tests/createWorkspace.spec.ts index f56e73841277e..279a477f04171 100644 --- a/site/e2e/tests/createWorkspace.spec.ts +++ b/site/e2e/tests/createWorkspace.spec.ts @@ -82,7 +82,12 @@ test("create workspace with default and required parameters", async ({ page, echoResponsesWithParameters(richParameters), ) - const workspaceName = await createWorkspace(page, template, buildParameters) + const workspaceName = await createWorkspace( + page, + template, + richParameters, + buildParameters, + ) await verifyParameters(page, workspaceName, richParameters, [ // user values: ...buildParameters, From 1622ec5e442e42d239972f17217bbd59467e3a36 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Tue, 22 Aug 2023 11:46:15 +0200 Subject: [PATCH 11/13] fixmes --- site/e2e/helpers.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index 20a33befb0abc..6525fa3b01f9f 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -64,7 +64,7 @@ export const createWorkspace = async ( ) await parameterField.check() } else if (richParameter.type === "list(string)") { - throw new Error("not implemented yet") + throw new Error("not implemented yet") // FIXME } else { // text or number const parameterField = await parameterLabel.waitForSelector( @@ -130,7 +130,7 @@ export const verifyParameters = async ( const value = await parameterField.inputValue() expect(value).toEqual(buildParameter.value) } else if (richParameter.type === "list(string)") { - throw new Error("not implemented yet") + throw new Error("not implemented yet") // FIXME } else { // text or number const parameterField = await parameterLabel.waitForSelector( From b202030037cabcc2047ae00012dd61a3ba12288d Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Tue, 22 Aug 2023 12:06:51 +0200 Subject: [PATCH 12/13] test: overwrite default parameters --- site/e2e/tests/createWorkspace.spec.ts | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/site/e2e/tests/createWorkspace.spec.ts b/site/e2e/tests/createWorkspace.spec.ts index 279a477f04171..fca453af59b43 100644 --- a/site/e2e/tests/createWorkspace.spec.ts +++ b/site/e2e/tests/createWorkspace.spec.ts @@ -97,4 +97,26 @@ test("create workspace with default and required parameters", async ({ ]) }) -// TODO custom parameter values +test("create workspace and overwrite default parameters", async ({ + page, +}) => { + const richParameters: RichParameter[] = [ + secondParameter, + fourthParameter, + ] + const buildParameters = [ + { name: secondParameter.name, value: "AAAAA" }, + { name: fourthParameter.name, value: "false" }, + ] + const template = await createTemplate( + page, + echoResponsesWithParameters(richParameters), + ) + const workspaceName = await createWorkspace( + page, + template, + richParameters, + buildParameters, + ) + await verifyParameters(page, workspaceName, richParameters, buildParameters) +}) From e3dc05112f1bcdac310a7732c5800ca53cf1dca2 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Tue, 22 Aug 2023 12:07:36 +0200 Subject: [PATCH 13/13] make fmt --- site/e2e/tests/createWorkspace.spec.ts | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/site/e2e/tests/createWorkspace.spec.ts b/site/e2e/tests/createWorkspace.spec.ts index fca453af59b43..10630e2f46ab3 100644 --- a/site/e2e/tests/createWorkspace.spec.ts +++ b/site/e2e/tests/createWorkspace.spec.ts @@ -97,13 +97,8 @@ test("create workspace with default and required parameters", async ({ ]) }) -test("create workspace and overwrite default parameters", async ({ - page, -}) => { - const richParameters: RichParameter[] = [ - secondParameter, - fourthParameter, - ] +test("create workspace and overwrite default parameters", async ({ page }) => { + const richParameters: RichParameter[] = [secondParameter, fourthParameter] const buildParameters = [ { name: secondParameter.name, value: "AAAAA" }, { name: fourthParameter.name, value: "false" },