mirror of
https://github.com/coder/coder.git
synced 2025-07-15 22:20:27 +00:00
fix(site): Do not require immutable parameters (#6637)
This commit is contained in:
@ -2,8 +2,10 @@ import axios from "axios"
|
||||
import {
|
||||
MockTemplate,
|
||||
MockTemplateVersionParameter1,
|
||||
MockTemplateVersionParameter2,
|
||||
MockWorkspace,
|
||||
MockWorkspaceBuild,
|
||||
MockWorkspaceBuildParameter1,
|
||||
} from "testHelpers/entities"
|
||||
import * as api from "./api"
|
||||
import * as TypesGen from "./typesGenerated"
|
||||
@ -178,16 +180,50 @@ describe("api.ts", () => {
|
||||
it("fails when having missing parameters", async () => {
|
||||
jest
|
||||
.spyOn(api, "postWorkspaceBuild")
|
||||
.mockResolvedValueOnce(MockWorkspaceBuild)
|
||||
jest.spyOn(api, "getTemplate").mockResolvedValueOnce(MockTemplate)
|
||||
jest.spyOn(api, "getWorkspaceBuildParameters").mockResolvedValueOnce([])
|
||||
.mockResolvedValue(MockWorkspaceBuild)
|
||||
jest.spyOn(api, "getTemplate").mockResolvedValue(MockTemplate)
|
||||
jest.spyOn(api, "getWorkspaceBuildParameters").mockResolvedValue([])
|
||||
jest
|
||||
.spyOn(api, "getTemplateVersionRichParameters")
|
||||
.mockResolvedValueOnce([MockTemplateVersionParameter1])
|
||||
.mockResolvedValue([
|
||||
MockTemplateVersionParameter1,
|
||||
{ ...MockTemplateVersionParameter2, mutable: false },
|
||||
])
|
||||
|
||||
await expect(api.updateWorkspace(MockWorkspace)).rejects.toThrow(
|
||||
api.MissingBuildParameters,
|
||||
)
|
||||
let error = new Error()
|
||||
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: [],
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
@ -946,11 +946,12 @@ export const updateWorkspace = async (
|
||||
const templateParameters = await getTemplateVersionRichParameters(
|
||||
activeVersionId,
|
||||
)
|
||||
const [updatedBuildParameters, missingParameters] = updateBuildParameters(
|
||||
const missingParameters = getMissingParameters(
|
||||
oldBuildParameters,
|
||||
newBuildParameters,
|
||||
templateParameters,
|
||||
)
|
||||
|
||||
if (missingParameters.length > 0) {
|
||||
throw new MissingBuildParameters(missingParameters)
|
||||
}
|
||||
@ -958,19 +959,21 @@ export const updateWorkspace = async (
|
||||
return postWorkspaceBuild(workspace.id, {
|
||||
transition: "start",
|
||||
template_version_id: activeVersionId,
|
||||
rich_parameter_values: updatedBuildParameters,
|
||||
rich_parameter_values: newBuildParameters,
|
||||
})
|
||||
}
|
||||
|
||||
const updateBuildParameters = (
|
||||
const getMissingParameters = (
|
||||
oldBuildParameters: TypesGen.WorkspaceBuildParameter[],
|
||||
newBuildParameters: TypesGen.WorkspaceBuildParameter[],
|
||||
templateParameters: 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
|
||||
let buildParameter = newBuildParameters.find(
|
||||
(p) => p.name === parameter.name,
|
||||
@ -981,17 +984,13 @@ const updateBuildParameters = (
|
||||
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) {
|
||||
updatedBuildParameters.push(buildParameter)
|
||||
continue
|
||||
}
|
||||
|
||||
// If there is no value and it is required, add it to the list of missing parameters
|
||||
if (parameter.required) {
|
||||
missingParameters.push(parameter)
|
||||
}
|
||||
missingParameters.push(parameter)
|
||||
}
|
||||
|
||||
return [updatedBuildParameters, missingParameters] as const
|
||||
return missingParameters
|
||||
}
|
||||
|
Reference in New Issue
Block a user