From 68ff6f8ef32262d23052f8b0864d9ec8e67366e4 Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Tue, 28 Mar 2023 13:27:49 +0000 Subject: [PATCH 1/8] Add base structure for copy template --- .../TemplateLayout/TemplatePageHeader.tsx | 8 +++ .../CreateTemplatePage/CreateTemplateForm.tsx | 49 +++++++++---- .../CreateTemplatePage/CreateTemplatePage.tsx | 2 + .../createTemplate/createTemplateXService.ts | 71 +++++++++++++++++++ 4 files changed, 117 insertions(+), 13 deletions(-) diff --git a/site/src/components/TemplateLayout/TemplatePageHeader.tsx b/site/src/components/TemplateLayout/TemplatePageHeader.tsx index 11fc83223a980..ce58134533a08 100644 --- a/site/src/components/TemplateLayout/TemplatePageHeader.tsx +++ b/site/src/components/TemplateLayout/TemplatePageHeader.tsx @@ -28,6 +28,7 @@ const Language = { createButton: "Create workspace", deleteButton: "Delete", editFilesButton: "Edit files", + duplicateButton: "Duplicate", } const TemplateMenu: FC<{ @@ -67,6 +68,13 @@ const TemplateMenu: FC<{ > {Language.settingsButton} + + {Language.duplicateButton} + {canEditFiles && ( { let initialValues = defaultInitialValues if (!canSetMaxTTL) { @@ -117,17 +121,27 @@ const getInitialValues = ( max_ttl_hours: 0, } } - if (!starterTemplate) { - return initialValues + + if (fromExample) { + return { + ...initialValues, + name: fromExample.id, + display_name: fromExample.name, + icon: fromExample.icon, + description: fromExample.description, + } } - return { - ...initialValues, - name: starterTemplate.id, - display_name: starterTemplate.name, - icon: starterTemplate.icon, - description: starterTemplate.description, + if (fromCopy) { + return { + ...initialValues, + ...fromCopy, + name: `${fromCopy.name}-copy`, + display_name: `${fromCopy.display_name} Copy`, + } } + + return initialValues } export interface CreateTemplateFormProps { @@ -142,12 +156,14 @@ export interface CreateTemplateFormProps { jobError?: string logs?: ProvisionerJobLog[] canSetMaxTTL: boolean + copiedTemplate?: Template } export const CreateTemplateForm: FC = ({ onCancel, onSubmit, starterTemplate, + copiedTemplate, parameters, variables, isSubmitting, @@ -157,9 +173,13 @@ export const CreateTemplateForm: FC = ({ logs, canSetMaxTTL, }) => { + console.log(copiedTemplate) const styles = useStyles() const form = useFormik({ - initialValues: getInitialValues(canSetMaxTTL, starterTemplate), + initialValues: getInitialValues(canSetMaxTTL, { + fromExample: starterTemplate, + fromCopy: copiedTemplate, + }), validationSchema, onSubmit, }) @@ -177,6 +197,8 @@ export const CreateTemplateForm: FC = ({ {starterTemplate ? ( + ) : copiedTemplate ? ( + ) : ( = ({ {/* Parameters */} - {parameters && ( + {parameters && parameters.length > 0 && ( = ({ )} {/* Variables */} - {variables && ( + {variables && variables.length > 0 && ( = ({ {variables.map((variable, index) => ( { await form.setFieldValue("user_variable_values." + index, { name: variable.name, - value: value, + value, }) }} /> diff --git a/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx b/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx index 4692bbd346b02..64d214ff62882 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx @@ -24,6 +24,7 @@ const CreateTemplatePage: FC = () => { context: { organizationId, exampleId: searchParams.get("exampleId"), + templateNameToCopy: searchParams.get("copyTemplate"), }, actions: { onCreate: (_, { data }) => { @@ -67,6 +68,7 @@ const CreateTemplatePage: FC = () => { {shouldDisplayForm && ( { + if (!organizationId) { + throw new Error("No organization ID provided") + } + if (!templateNameToCopy) { + throw new Error("No template name to copy provided") + } + const template = await getTemplateByName( + organizationId, + templateNameToCopy, + ) + const [version, parameters, variables] = await Promise.all([ + getTemplateVersion(template.active_version_id), + getTemplateVersionSchema(template.active_version_id), + getTemplateVersionVariables(template.active_version_id), + ]) + return { + template, + version, + parameters, + variables, + } + }, createFirstVersion: async ({ organizationId, exampleId, @@ -456,9 +516,17 @@ export const createTemplateMachine = uploadResponse: (_) => undefined, }), assignJobLogs: assign({ jobLogs: (_, { data }) => data }), + assignCopiedTemplateData: assign({ + copiedTemplate: (_, { data }) => data.template, + version: (_, { data }) => data.version, + parameters: (_, { data }) => data.parameters, + variables: (_, { data }) => data.variables, + }), }, guards: { isExampleProvided: ({ exampleId }) => Boolean(exampleId), + isTemplateIdToCopyProvided: ({ templateNameToCopy }) => + Boolean(templateNameToCopy), isNotUsingExample: ({ exampleId }) => !exampleId, hasFile: ({ file }) => Boolean(file), hasFailed: (_, { data }) => @@ -469,6 +537,9 @@ export const createTemplateMachine = ), hasNoParametersOrVariables: (_, { data }) => data.parameters === undefined && data.variables === undefined, + hasParametersOrVariables: (_, { data }) => { + return data.parameters.length > 0 || data.variables.length > 0 + }, }, }, ) From def3a368e5bf4c39c45f9c90a2e19dd3b73e219f Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Tue, 28 Mar 2023 16:10:17 +0000 Subject: [PATCH 2/8] Prefill variables --- .../CreateTemplatePage/CreateTemplateForm.tsx | 48 ++++++++++++++----- .../createTemplate/createTemplateXService.ts | 14 +++--- 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx index 35940f6d21a5c..ac33ad4e6b206 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx @@ -107,14 +107,22 @@ const defaultInitialValues: CreateTemplateData = { allow_user_cancel_workspace_jobs: false, } -const getInitialValues = ( - canSetMaxTTL: boolean, - { - fromExample, - fromCopy, - }: { fromExample?: TemplateExample; fromCopy?: Template }, -) => { +type GetInitialValuesParams = { + fromExample?: TemplateExample + fromCopy?: Template + parameters?: ParameterSchema[] + variables?: TemplateVersionVariable[] + canSetMaxTTL: boolean +} + +const getInitialValues = ({ + fromExample, + fromCopy, + canSetMaxTTL, + variables, +}: GetInitialValuesParams) => { let initialValues = defaultInitialValues + if (!canSetMaxTTL) { initialValues = { ...initialValues, @@ -123,7 +131,7 @@ const getInitialValues = ( } if (fromExample) { - return { + initialValues = { ...initialValues, name: fromExample.id, display_name: fromExample.name, @@ -133,7 +141,7 @@ const getInitialValues = ( } if (fromCopy) { - return { + initialValues = { ...initialValues, ...fromCopy, name: `${fromCopy.name}-copy`, @@ -141,6 +149,21 @@ const getInitialValues = ( } } + if (variables) { + variables.forEach((variable) => { + if (variable.sensitive) { + return + } + if (!initialValues.user_variable_values) { + initialValues.user_variable_values = [] + } + initialValues.user_variable_values.push({ + name: variable.name, + value: variable.value, + }) + }) + } + return initialValues } @@ -173,12 +196,13 @@ export const CreateTemplateForm: FC = ({ logs, canSetMaxTTL, }) => { - console.log(copiedTemplate) const styles = useStyles() const form = useFormik({ - initialValues: getInitialValues(canSetMaxTTL, { + initialValues: getInitialValues({ + canSetMaxTTL, fromExample: starterTemplate, fromCopy: copiedTemplate, + variables, }), validationSchema, onSubmit, @@ -383,7 +407,7 @@ export const CreateTemplateForm: FC = ({ {variables.map((variable, index) => ( data.template, version: (_, { data }) => data.version, - parameters: (_, { data }) => data.parameters, variables: (_, { data }) => data.variables, }), }, @@ -537,8 +535,8 @@ export const createTemplateMachine = ), hasNoParametersOrVariables: (_, { data }) => data.parameters === undefined && data.variables === undefined, - hasParametersOrVariables: (_, { data }) => { - return data.parameters.length > 0 || data.variables.length > 0 + hasVariables: (_, { data }) => { + return data.variables.length > 0 }, }, }, From 03d832c451db8f8fad9ec53fa62d10003b66fe97 Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Tue, 28 Mar 2023 16:43:35 +0000 Subject: [PATCH 3/8] Copy from template --- site/src/api/api.ts | 2 +- .../CreateTemplatePage/CreateTemplateForm.tsx | 19 ++++++--- .../createTemplate/createTemplateXService.ts | 40 +++++++++++++++---- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/site/src/api/api.ts b/site/src/api/api.ts index a1763ab75fcb6..209c4f322ccd7 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -335,7 +335,7 @@ export const getTemplateVersionGitAuth = async ( export const getTemplateVersionParameters = async ( versionId: string, -): Promise => { +): Promise => { const response = await axios.get( `/api/v2/templateversions/${versionId}/parameters`, ) diff --git a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx index ac33ad4e6b206..ee8c1f1ae272a 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx @@ -120,6 +120,7 @@ const getInitialValues = ({ fromCopy, canSetMaxTTL, variables, + parameters, }: GetInitialValuesParams) => { let initialValues = defaultInitialValues @@ -151,19 +152,26 @@ const getInitialValues = ({ if (variables) { variables.forEach((variable) => { - if (variable.sensitive) { - return - } if (!initialValues.user_variable_values) { initialValues.user_variable_values = [] } initialValues.user_variable_values.push({ name: variable.name, - value: variable.value, + value: variable.sensitive ? "" : variable.value, }) }) } + if (parameters) { + parameters.forEach((parameter) => { + if (!initialValues.parameter_values_by_name) { + initialValues.parameter_values_by_name = {} + } + initialValues.parameter_values_by_name[parameter.name] = + parameter.default_source_value + }) + } + return initialValues } @@ -203,6 +211,7 @@ export const CreateTemplateForm: FC = ({ fromExample: starterTemplate, fromCopy: copiedTemplate, variables, + parameters, }), validationSchema, onSubmit, @@ -407,7 +416,7 @@ export const CreateTemplateForm: FC = ({ {variables.map((variable, index) => ( { + const schema = schemaParameters.find( + (schema) => schema.name === computedParameter.name, + ) + if (!schema) { + throw new Error( + `Parameter ${computedParameter.name} not found in schema`, + ) + } + parameters.push({ + ...schema, + default_source_value: computedParameter.source_value, + }) + }) - getTemplateVersionVariables(template.active_version_id), - ]) return { template, version, + parameters, variables, } }, @@ -518,6 +541,7 @@ export const createTemplateMachine = assignCopiedTemplateData: assign({ copiedTemplate: (_, { data }) => data.template, version: (_, { data }) => data.version, + parameters: (_, { data }) => data.parameters, variables: (_, { data }) => data.variables, }), }, @@ -535,8 +559,8 @@ export const createTemplateMachine = ), hasNoParametersOrVariables: (_, { data }) => data.parameters === undefined && data.variables === undefined, - hasVariables: (_, { data }) => { - return data.variables.length > 0 + hasParametersOrVariables: (_, { data }) => { + return data.parameters.length > 0 || data.variables.length > 0 }, }, }, From 7cd4101ecea2ae32c3f454df7df14be5e7b1d8c9 Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Wed, 29 Mar 2023 18:09:26 +0000 Subject: [PATCH 4/8] Fix copy from file template --- .../TemplateLayout/TemplatePageHeader.tsx | 16 +++++++++------- .../CreateTemplatePage/CreateTemplateForm.tsx | 4 +++- .../createTemplate/createTemplateXService.ts | 15 +++++++++++++++ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/site/src/components/TemplateLayout/TemplatePageHeader.tsx b/site/src/components/TemplateLayout/TemplatePageHeader.tsx index ce58134533a08..f6e2fadd04c10 100644 --- a/site/src/components/TemplateLayout/TemplatePageHeader.tsx +++ b/site/src/components/TemplateLayout/TemplatePageHeader.tsx @@ -68,13 +68,15 @@ const TemplateMenu: FC<{ > {Language.settingsButton} - - {Language.duplicateButton} - + {canEditFiles && ( + + {Language.duplicateButton} + + )} {canEditFiles && ( { if (exampleId) { return createTemplateVersion(organizationId, { @@ -388,6 +390,19 @@ export const createTemplateMachine = }) } + if (templateNameToCopy) { + if (!version) { + throw new Error("Not able to copy without having a version") + } + + return createTemplateVersion(organizationId, { + storage_method: "file", + file_id: version.job.file_id, + provisioner: "terraform", + tags: {}, + }) + } + if (uploadResponse) { return createTemplateVersion(organizationId, { storage_method: "file", From 7f2b66bbebfe25314e9938db9b87b81e61269be1 Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Wed, 29 Mar 2023 20:12:19 +0000 Subject: [PATCH 5/8] Setup missing handlers for test --- .../CreateTemplatePage.test.tsx | 9 ++++-- site/src/testHelpers/handlers.ts | 30 ++++++++++++++++++- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/site/src/pages/CreateTemplatePage/CreateTemplatePage.test.tsx b/site/src/pages/CreateTemplatePage/CreateTemplatePage.test.tsx index c338bc18ced1e..9b2a912ffed8e 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplatePage.test.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplatePage.test.tsx @@ -14,10 +14,10 @@ import { MockProvisionerJob, } from "testHelpers/entities" -const renderPage = async () => { +const renderPage = async (searchParams: URLSearchParams) => { // Render with the example ID so we don't need to upload a file const view = renderWithAuth(, { - route: `/templates/new?exampleId=${MockTemplateExample.id}`, + route: `/templates/new?${searchParams.toString()}`, path: "/templates/new", // We need this because after creation, the user will be redirected to here extraRoutes: [{ path: "templates/:template", element: <> }], @@ -56,7 +56,10 @@ test("Create template with variables", async () => { ]) // Render page, fill the name and submit - const { router, container } = await renderPage() + const searchParams = new URLSearchParams({ + exampleId: MockTemplateExample.id, + }) + const { router, container } = await renderPage(searchParams) const form = container.querySelector("form") as HTMLFormElement await userEvent.type(screen.getByLabelText(/Name/), "my-template") await userEvent.click( diff --git a/site/src/testHelpers/handlers.ts b/site/src/testHelpers/handlers.ts index 9a0bc8f309cfb..ade5c1e06cce3 100644 --- a/site/src/testHelpers/handlers.ts +++ b/site/src/testHelpers/handlers.ts @@ -321,7 +321,7 @@ export const handlers = [ }, ), - rest.get("api/v2/files/:fileId", (_, res, ctx) => { + rest.get("/api/v2/files/:fileId", (_, res, ctx) => { const fileBuffer = fs.readFileSync( path.resolve(__dirname, "./templateFiles.tar"), ) @@ -333,4 +333,32 @@ export const handlers = [ ctx.body(fileBuffer), ) }), + + rest.get( + "/api/v2/templateversions/:templateVersionId/parameters", + (_, res, ctx) => { + return res( + ctx.status(200), + ctx.json([ + M.MockTemplateVersionParameter1, + M.MockTemplateVersionParameter2, + M.MockTemplateVersionParameter3, + ]), + ) + }, + ), + + rest.get( + "/api/v2/templateversions/:templateVersionId/variables", + (_, res, ctx) => { + return res( + ctx.status(200), + ctx.json([ + M.MockTemplateVersionVariable1, + M.MockTemplateVersionVariable2, + M.MockTemplateVersionVariable3, + ]), + ) + }, + ), ] From bf8c1bc61a8b5186374a3c8fbe790461bf456aad Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Thu, 30 Mar 2023 11:35:50 +0000 Subject: [PATCH 6/8] Improve verbiage --- site/src/components/TemplateLayout/TemplatePageHeader.tsx | 2 +- site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx | 2 +- site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx | 2 +- site/src/xServices/createTemplate/createTemplateXService.ts | 6 ++++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/site/src/components/TemplateLayout/TemplatePageHeader.tsx b/site/src/components/TemplateLayout/TemplatePageHeader.tsx index f6e2fadd04c10..636d3dcb9db77 100644 --- a/site/src/components/TemplateLayout/TemplatePageHeader.tsx +++ b/site/src/components/TemplateLayout/TemplatePageHeader.tsx @@ -72,7 +72,7 @@ const TemplateMenu: FC<{ {Language.duplicateButton} diff --git a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx index bf743afa29b6c..53453761053c9 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx @@ -147,7 +147,7 @@ const getInitialValues = ({ ...fromCopy, name: `${fromCopy.name}-copy`, display_name: fromCopy.display_name - ? `${fromCopy.display_name} Copy` + ? `Copy of ${fromCopy.display_name}` : "", } } diff --git a/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx b/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx index 64d214ff62882..6a420122dd452 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx @@ -24,7 +24,7 @@ const CreateTemplatePage: FC = () => { context: { organizationId, exampleId: searchParams.get("exampleId"), - templateNameToCopy: searchParams.get("copyTemplate"), + templateNameToCopy: searchParams.get("fromTemplate"), }, actions: { onCreate: (_, { data }) => { diff --git a/site/src/xServices/createTemplate/createTemplateXService.ts b/site/src/xServices/createTemplate/createTemplateXService.ts index 437139a1d789e..9548e483c8334 100644 --- a/site/src/xServices/createTemplate/createTemplateXService.ts +++ b/site/src/xServices/createTemplate/createTemplateXService.ts @@ -63,7 +63,7 @@ interface CreateTemplateContext { // uploadedFile is the response from the server to use in the API file?: File uploadResponse?: UploadResponse - // When wanting to copy a Template + // When wanting to duplicate a Template templateNameToCopy: string | null // It can be null because it is passed from query string copiedTemplate?: Template } @@ -392,7 +392,9 @@ export const createTemplateMachine = if (templateNameToCopy) { if (!version) { - throw new Error("Not able to copy without having a version") + throw new Error( + "Can't copy template due to a missing template version", + ) } return createTemplateVersion(organizationId, { From bbc10f06009c8294c8db7f89ade5e148507d0a51 Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Thu, 30 Mar 2023 11:58:09 +0000 Subject: [PATCH 7/8] Fix tests --- .../CreateTemplatePage.test.tsx | 29 ++++++++++++++ .../CreateTemplatePage/CreateTemplatePage.tsx | 1 + site/src/testHelpers/entities.ts | 38 ++++++++++--------- site/src/testHelpers/handlers.ts | 20 +++++++++- 4 files changed, 69 insertions(+), 19 deletions(-) diff --git a/site/src/pages/CreateTemplatePage/CreateTemplatePage.test.tsx b/site/src/pages/CreateTemplatePage/CreateTemplatePage.test.tsx index 9b2a912ffed8e..5d0c7d9abe52c 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplatePage.test.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplatePage.test.tsx @@ -106,3 +106,32 @@ test("Create template with variables", async () => { ], }) }) + +test("Create template from another template", async () => { + const searchParams = new URLSearchParams({ + fromTemplate: MockTemplate.name, + }) + const { router } = await renderPage(searchParams) + // Name and display name are using copy prefixes + expect(screen.getByLabelText(/Name/)).toHaveValue(`${MockTemplate.name}-copy`) + expect(screen.getByLabelText(/Display name/)).toHaveValue( + `Copy of ${MockTemplate.display_name}`, + ) + // Variables are using the same values + expect( + screen.getByLabelText(MockTemplateVersionVariable1.description, { + exact: false, + }), + ).toHaveValue(MockTemplateVersionVariable1.value) + // Create template + jest + .spyOn(API, "createTemplateVersion") + .mockResolvedValue(MockTemplateVersion) + jest.spyOn(API, "createTemplate").mockResolvedValue(MockTemplate) + await userEvent.click( + screen.getByRole("button", { name: /create template/i }), + ) + expect(router.state.location.pathname).toEqual( + `/templates/${MockTemplate.name}`, + ) +}) diff --git a/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx b/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx index 6a420122dd452..e6443f48f3bf2 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx @@ -32,6 +32,7 @@ const CreateTemplatePage: FC = () => { }, }, }) + const { starterTemplate, parameters, diff --git a/site/src/testHelpers/entities.ts b/site/src/testHelpers/entities.ts index 0d866762e48d9..39a1335ef1a4a 100644 --- a/site/src/testHelpers/entities.ts +++ b/site/src/testHelpers/entities.ts @@ -1492,27 +1492,31 @@ export const MockWorkspaceBuildParameter5: TypesGen.WorkspaceBuildParameter = { value: "5", } +export const MockParameterSchema: TypesGen.ParameterSchema = { + id: "000000", + job_id: "000000", + allow_override_destination: false, + allow_override_source: true, + created_at: "", + default_destination_scheme: "none", + default_refresh: "", + default_source_scheme: "data", + default_source_value: "default-value", + name: "parameter name", + description: "Some description!", + redisplay_value: false, + validation_condition: "", + validation_contains: [], + validation_error: "", + validation_type_system: "", + validation_value_type: "", +} + export const mockParameterSchema = ( partial: Partial, ): TypesGen.ParameterSchema => { return { - id: "000000", - job_id: "000000", - allow_override_destination: false, - allow_override_source: true, - created_at: "", - default_destination_scheme: "none", - default_refresh: "", - default_source_scheme: "data", - default_source_value: "default-value", - name: "parameter name", - description: "Some description!", - redisplay_value: false, - validation_condition: "", - validation_contains: [], - validation_error: "", - validation_type_system: "", - validation_value_type: "", + ...MockParameterSchema, ...partial, } } diff --git a/site/src/testHelpers/handlers.ts b/site/src/testHelpers/handlers.ts index ade5c1e06cce3..787c291ff78ca 100644 --- a/site/src/testHelpers/handlers.ts +++ b/site/src/testHelpers/handlers.ts @@ -3,7 +3,7 @@ import { WorkspaceBuildTransition } from "../api/types" import { CreateWorkspaceBuildRequest } from "../api/typesGenerated" import { permissionsToCheck } from "../xServices/auth/authXService" import * as M from "./entities" -import { MockGroup, MockWorkspaceQuota } from "./entities" +import { MockGroup, mockParameterSchema, MockWorkspaceQuota } from "./entities" import fs from "fs" import path from "path" @@ -79,7 +79,23 @@ export const handlers = [ rest.get( "/api/v2/templateversions/:templateVersionId/schema", async (req, res, ctx) => { - return res(ctx.status(200), ctx.json([])) + return res( + ctx.status(200), + ctx.json([ + mockParameterSchema({ + id: "1", + name: M.MockTemplateVersionParameter1.name, + }), + mockParameterSchema({ + id: "2", + name: M.MockTemplateVersionParameter2.name, + }), + mockParameterSchema({ + id: "3", + name: M.MockTemplateVersionParameter3.name, + }), + ]), + ) }, ), rest.get( From da0a2c1e36b81ef77f00897e5118d01046c44ab7 Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Thu, 30 Mar 2023 12:04:48 +0000 Subject: [PATCH 8/8] Fix test --- site/src/pages/CreateWorkspacePage/CreateWorkspacePage.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.test.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.test.tsx index 31740ff193ee6..22ecfe4aafa08 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.test.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.test.tsx @@ -79,6 +79,7 @@ describe("CreateWorkspacePage", () => { }) it("succeeds with default owner", async () => { + jest.spyOn(API, "getTemplateVersionSchema").mockResolvedValueOnce([]) jest .spyOn(API, "getUsers") .mockResolvedValueOnce({ users: [MockUser], count: 1 }) pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy