fix(site): Do not require immutable parameters (#6637)

This commit is contained in:
Bruno Quaresma
2023-03-17 10:09:10 -03:00
committed by GitHub
parent 446bd30c32
commit 01a6af98b4
2 changed files with 54 additions and 19 deletions

View File

@ -2,8 +2,10 @@ import axios from "axios"
import { import {
MockTemplate, MockTemplate,
MockTemplateVersionParameter1, MockTemplateVersionParameter1,
MockTemplateVersionParameter2,
MockWorkspace, MockWorkspace,
MockWorkspaceBuild, MockWorkspaceBuild,
MockWorkspaceBuildParameter1,
} from "testHelpers/entities" } from "testHelpers/entities"
import * as api from "./api" import * as api from "./api"
import * as TypesGen from "./typesGenerated" import * as TypesGen from "./typesGenerated"
@ -178,16 +180,50 @@ describe("api.ts", () => {
it("fails when having missing parameters", async () => { it("fails when having missing parameters", async () => {
jest jest
.spyOn(api, "postWorkspaceBuild") .spyOn(api, "postWorkspaceBuild")
.mockResolvedValueOnce(MockWorkspaceBuild) .mockResolvedValue(MockWorkspaceBuild)
jest.spyOn(api, "getTemplate").mockResolvedValueOnce(MockTemplate) jest.spyOn(api, "getTemplate").mockResolvedValue(MockTemplate)
jest.spyOn(api, "getWorkspaceBuildParameters").mockResolvedValueOnce([]) jest.spyOn(api, "getWorkspaceBuildParameters").mockResolvedValue([])
jest jest
.spyOn(api, "getTemplateVersionRichParameters") .spyOn(api, "getTemplateVersionRichParameters")
.mockResolvedValueOnce([MockTemplateVersionParameter1]) .mockResolvedValue([
MockTemplateVersionParameter1,
{ ...MockTemplateVersionParameter2, mutable: false },
])
await expect(api.updateWorkspace(MockWorkspace)).rejects.toThrow( let error = new Error()
api.MissingBuildParameters, try {
) await api.updateWorkspace(MockWorkspace)
} catch (e) {
error = e as Error
}
expect(error).toBeInstanceOf(api.MissingBuildParameters)
// Verify if the correct missing parameters are being passed
// It should not require immutable parameters
expect((error as api.MissingBuildParameters).parameters).toEqual([
MockTemplateVersionParameter1,
])
})
it("creates a build with the no parameters if it is already filled", async () => {
jest
.spyOn(api, "postWorkspaceBuild")
.mockResolvedValueOnce(MockWorkspaceBuild)
jest.spyOn(api, "getTemplate").mockResolvedValueOnce(MockTemplate)
jest
.spyOn(api, "getWorkspaceBuildParameters")
.mockResolvedValue([MockWorkspaceBuildParameter1])
jest
.spyOn(api, "getTemplateVersionRichParameters")
.mockResolvedValue([
{ ...MockTemplateVersionParameter1, required: true, mutable: false },
])
await api.updateWorkspace(MockWorkspace)
expect(api.postWorkspaceBuild).toHaveBeenCalledWith(MockWorkspace.id, {
transition: "start",
template_version_id: MockTemplate.active_version_id,
rich_parameter_values: [],
})
}) })
}) })
}) })

View File

@ -946,11 +946,12 @@ export const updateWorkspace = async (
const templateParameters = await getTemplateVersionRichParameters( const templateParameters = await getTemplateVersionRichParameters(
activeVersionId, activeVersionId,
) )
const [updatedBuildParameters, missingParameters] = updateBuildParameters( const missingParameters = getMissingParameters(
oldBuildParameters, oldBuildParameters,
newBuildParameters, newBuildParameters,
templateParameters, templateParameters,
) )
if (missingParameters.length > 0) { if (missingParameters.length > 0) {
throw new MissingBuildParameters(missingParameters) throw new MissingBuildParameters(missingParameters)
} }
@ -958,19 +959,21 @@ export const updateWorkspace = async (
return postWorkspaceBuild(workspace.id, { return postWorkspaceBuild(workspace.id, {
transition: "start", transition: "start",
template_version_id: activeVersionId, template_version_id: activeVersionId,
rich_parameter_values: updatedBuildParameters, rich_parameter_values: newBuildParameters,
}) })
} }
const updateBuildParameters = ( const getMissingParameters = (
oldBuildParameters: TypesGen.WorkspaceBuildParameter[], oldBuildParameters: TypesGen.WorkspaceBuildParameter[],
newBuildParameters: TypesGen.WorkspaceBuildParameter[], newBuildParameters: TypesGen.WorkspaceBuildParameter[],
templateParameters: TypesGen.TemplateVersionParameter[], templateParameters: TypesGen.TemplateVersionParameter[],
) => { ) => {
const missingParameters: TypesGen.TemplateVersionParameter[] = [] const missingParameters: TypesGen.TemplateVersionParameter[] = []
const updatedBuildParameters: TypesGen.WorkspaceBuildParameter[] = [] const requiredParameters = templateParameters.filter(
(p) => p.required && p.mutable,
)
for (const parameter of templateParameters) { for (const parameter of requiredParameters) {
// Check if there is a new value // Check if there is a new value
let buildParameter = newBuildParameters.find( let buildParameter = newBuildParameters.find(
(p) => p.name === parameter.name, (p) => p.name === parameter.name,
@ -981,17 +984,13 @@ const updateBuildParameters = (
buildParameter = oldBuildParameters.find((p) => p.name === parameter.name) buildParameter = oldBuildParameters.find((p) => p.name === parameter.name)
} }
// If there is a value from the new or old one, add it to the list // If there is a value from the new or old one, it is not missed
if (buildParameter) { if (buildParameter) {
updatedBuildParameters.push(buildParameter)
continue continue
} }
// If there is no value and it is required, add it to the list of missing parameters missingParameters.push(parameter)
if (parameter.required) {
missingParameters.push(parameter)
}
} }
return [updatedBuildParameters, missingParameters] as const return missingParameters
} }