Skip to content

Commit 01a6af9

Browse files
fix(site): Do not require immutable parameters (#6637)
1 parent 446bd30 commit 01a6af9

File tree

2 files changed

+53
-18
lines changed

2 files changed

+53
-18
lines changed

site/src/api/api.test.ts

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ import axios from "axios"
22
import {
33
MockTemplate,
44
MockTemplateVersionParameter1,
5+
MockTemplateVersionParameter2,
56
MockWorkspace,
67
MockWorkspaceBuild,
8+
MockWorkspaceBuildParameter1,
79
} from "testHelpers/entities"
810
import * as api from "./api"
911
import * as TypesGen from "./typesGenerated"
@@ -176,18 +178,52 @@ describe("api.ts", () => {
176178
})
177179

178180
it("fails when having missing parameters", async () => {
181+
jest
182+
.spyOn(api, "postWorkspaceBuild")
183+
.mockResolvedValue(MockWorkspaceBuild)
184+
jest.spyOn(api, "getTemplate").mockResolvedValue(MockTemplate)
185+
jest.spyOn(api, "getWorkspaceBuildParameters").mockResolvedValue([])
186+
jest
187+
.spyOn(api, "getTemplateVersionRichParameters")
188+
.mockResolvedValue([
189+
MockTemplateVersionParameter1,
190+
{ ...MockTemplateVersionParameter2, mutable: false },
191+
])
192+
193+
let error = new Error()
194+
try {
195+
await api.updateWorkspace(MockWorkspace)
196+
} catch (e) {
197+
error = e as Error
198+
}
199+
200+
expect(error).toBeInstanceOf(api.MissingBuildParameters)
201+
// Verify if the correct missing parameters are being passed
202+
// It should not require immutable parameters
203+
expect((error as api.MissingBuildParameters).parameters).toEqual([
204+
MockTemplateVersionParameter1,
205+
])
206+
})
207+
208+
it("creates a build with the no parameters if it is already filled", async () => {
179209
jest
180210
.spyOn(api, "postWorkspaceBuild")
181211
.mockResolvedValueOnce(MockWorkspaceBuild)
182212
jest.spyOn(api, "getTemplate").mockResolvedValueOnce(MockTemplate)
183-
jest.spyOn(api, "getWorkspaceBuildParameters").mockResolvedValueOnce([])
213+
jest
214+
.spyOn(api, "getWorkspaceBuildParameters")
215+
.mockResolvedValue([MockWorkspaceBuildParameter1])
184216
jest
185217
.spyOn(api, "getTemplateVersionRichParameters")
186-
.mockResolvedValueOnce([MockTemplateVersionParameter1])
187-
188-
await expect(api.updateWorkspace(MockWorkspace)).rejects.toThrow(
189-
api.MissingBuildParameters,
190-
)
218+
.mockResolvedValue([
219+
{ ...MockTemplateVersionParameter1, required: true, mutable: false },
220+
])
221+
await api.updateWorkspace(MockWorkspace)
222+
expect(api.postWorkspaceBuild).toHaveBeenCalledWith(MockWorkspace.id, {
223+
transition: "start",
224+
template_version_id: MockTemplate.active_version_id,
225+
rich_parameter_values: [],
226+
})
191227
})
192228
})
193229
})

site/src/api/api.ts

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -946,31 +946,34 @@ export const updateWorkspace = async (
946946
const templateParameters = await getTemplateVersionRichParameters(
947947
activeVersionId,
948948
)
949-
const [updatedBuildParameters, missingParameters] = updateBuildParameters(
949+
const missingParameters = getMissingParameters(
950950
oldBuildParameters,
951951
newBuildParameters,
952952
templateParameters,
953953
)
954+
954955
if (missingParameters.length > 0) {
955956
throw new MissingBuildParameters(missingParameters)
956957
}
957958

958959
return postWorkspaceBuild(workspace.id, {
959960
transition: "start",
960961
template_version_id: activeVersionId,
961-
rich_parameter_values: updatedBuildParameters,
962+
rich_parameter_values: newBuildParameters,
962963
})
963964
}
964965

965-
const updateBuildParameters = (
966+
const getMissingParameters = (
966967
oldBuildParameters: TypesGen.WorkspaceBuildParameter[],
967968
newBuildParameters: TypesGen.WorkspaceBuildParameter[],
968969
templateParameters: TypesGen.TemplateVersionParameter[],
969970
) => {
970971
const missingParameters: TypesGen.TemplateVersionParameter[] = []
971-
const updatedBuildParameters: TypesGen.WorkspaceBuildParameter[] = []
972+
const requiredParameters = templateParameters.filter(
973+
(p) => p.required && p.mutable,
974+
)
972975

973-
for (const parameter of templateParameters) {
976+
for (const parameter of requiredParameters) {
974977
// Check if there is a new value
975978
let buildParameter = newBuildParameters.find(
976979
(p) => p.name === parameter.name,
@@ -981,17 +984,13 @@ const updateBuildParameters = (
981984
buildParameter = oldBuildParameters.find((p) => p.name === parameter.name)
982985
}
983986

984-
// If there is a value from the new or old one, add it to the list
987+
// If there is a value from the new or old one, it is not missed
985988
if (buildParameter) {
986-
updatedBuildParameters.push(buildParameter)
987989
continue
988990
}
989991

990-
// If there is no value and it is required, add it to the list of missing parameters
991-
if (parameter.required) {
992-
missingParameters.push(parameter)
993-
}
992+
missingParameters.push(parameter)
994993
}
995994

996-
return [updatedBuildParameters, missingParameters] as const
995+
return missingParameters
997996
}

0 commit comments

Comments
 (0)