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 {
|
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: [],
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user