Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7f67000

Browse files
fix(site): send build parameters over the confirmation dialog on restart (#8660)
1 parent 30fe153 commit 7f67000

File tree

4 files changed

+98
-21
lines changed

4 files changed

+98
-21
lines changed

site/src/components/WorkspaceActions/BuildParametersPopover.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export const BuildParametersPopover = ({
4747
return (
4848
<>
4949
<Button
50+
data-testid="build-parameters-button"
5051
disabled={disabled}
5152
color="neutral"
5253
sx={{ px: 0 }}
@@ -159,7 +160,7 @@ const Form = ({
159160
const getFieldHelpers = getFormHelpers(form)
160161

161162
return (
162-
<form onSubmit={form.handleSubmit}>
163+
<form onSubmit={form.handleSubmit} data-testid="build-parameters-form">
163164
<FormFields>
164165
{ephemeralParameters.map((parameter, index) => {
165166
return (
@@ -182,6 +183,7 @@ const Form = ({
182183
</FormFields>
183184
<Box sx={{ py: 3, pb: 1 }}>
184185
<Button
186+
data-testid="build-parameters-submit"
185187
type="submit"
186188
variant="contained"
187189
color="primary"

site/src/pages/WorkspacePage/WorkspacePage.test.tsx

+76
Original file line numberDiff line numberDiff line change
@@ -411,4 +411,80 @@ describe("WorkspacePage", () => {
411411
await renderWorkspacePage()
412412
await screen.findByTestId("error-unsupported-workspaces")
413413
})
414+
415+
it("restart the workspace with one time parameters when having the confirmation dialog", async () => {
416+
window.localStorage.removeItem(`${MockUser.id}_ignoredWarnings`)
417+
jest.spyOn(api, "getWorkspaceParameters").mockResolvedValue({
418+
templateVersionRichParameters: [
419+
{
420+
...MockTemplateVersionParameter1,
421+
ephemeral: true,
422+
name: "rebuild",
423+
description: "Rebuild",
424+
required: false,
425+
},
426+
],
427+
buildParameters: [{ name: "rebuild", value: "false" }],
428+
})
429+
const restartWorkspaceSpy = jest.spyOn(api, "restartWorkspace")
430+
const user = userEvent.setup()
431+
await renderWorkspacePage()
432+
await user.click(screen.getByTestId("build-parameters-button"))
433+
const buildParametersForm = await screen.findByTestId(
434+
"build-parameters-form",
435+
)
436+
const rebuildField = within(buildParametersForm).getByLabelText("Rebuild", {
437+
exact: false,
438+
})
439+
await user.clear(rebuildField)
440+
await user.type(rebuildField, "true")
441+
await user.click(screen.getByTestId("build-parameters-submit"))
442+
await user.click(screen.getByTestId("confirm-button"))
443+
await waitFor(() => {
444+
expect(restartWorkspaceSpy).toBeCalledWith({
445+
workspace: MockWorkspace,
446+
buildParameters: [{ name: "rebuild", value: "true" }],
447+
})
448+
})
449+
})
450+
451+
it("restart the workspace with one time parameters without the confirmation dialog", async () => {
452+
window.localStorage.setItem(
453+
`${MockUser.id}_ignoredWarnings`,
454+
JSON.stringify({
455+
restart: new Date().toISOString(),
456+
}),
457+
)
458+
jest.spyOn(api, "getWorkspaceParameters").mockResolvedValue({
459+
templateVersionRichParameters: [
460+
{
461+
...MockTemplateVersionParameter1,
462+
ephemeral: true,
463+
name: "rebuild",
464+
description: "Rebuild",
465+
required: false,
466+
},
467+
],
468+
buildParameters: [{ name: "rebuild", value: "false" }],
469+
})
470+
const restartWorkspaceSpy = jest.spyOn(api, "restartWorkspace")
471+
const user = userEvent.setup()
472+
await renderWorkspacePage()
473+
await user.click(screen.getByTestId("build-parameters-button"))
474+
const buildParametersForm = await screen.findByTestId(
475+
"build-parameters-form",
476+
)
477+
const rebuildField = within(buildParametersForm).getByLabelText("Rebuild", {
478+
exact: false,
479+
})
480+
await user.clear(rebuildField)
481+
await user.type(rebuildField, "true")
482+
await user.click(screen.getByTestId("build-parameters-submit"))
483+
await waitFor(() => {
484+
expect(restartWorkspaceSpy).toBeCalledWith({
485+
workspace: MockWorkspace,
486+
buildParameters: [{ name: "rebuild", value: "true" }],
487+
})
488+
})
489+
})
414490
})

site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx

+19-12
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,8 @@ import {
2727
} from "../../xServices/workspace/workspaceXService"
2828
import { UpdateBuildParametersDialog } from "./UpdateBuildParametersDialog"
2929
import { ChangeVersionDialog } from "./ChangeVersionDialog"
30-
import { useQuery } from "@tanstack/react-query"
31-
import { getTemplateVersions } from "api/api"
32-
import { useRestartWorkspace } from "./hooks"
30+
import { useMutation, useQuery } from "@tanstack/react-query"
31+
import { getTemplateVersions, restartWorkspace } from "api/api"
3332
import {
3433
ConfirmDialog,
3534
ConfirmDialogProps,
@@ -89,7 +88,10 @@ export const WorkspaceReadyPage = ({
8988
enabled: changeVersionDialogOpen,
9089
})
9190
const [isConfirmingUpdate, setIsConfirmingUpdate] = useState(false)
92-
const [isConfirmingRestart, setIsConfirmingRestart] = useState(false)
91+
const [confirmingRestart, setConfirmingRestart] = useState<{
92+
open: boolean
93+
buildParameters?: TypesGen.WorkspaceBuildParameter[]
94+
}>({ open: false })
9395
const user = useMe()
9496
const { isWarningIgnored, ignoreWarning } = useIgnoreWarnings(user.id)
9597
const buildLogs = useBuildLogs(workspace)
@@ -99,10 +101,12 @@ export const WorkspaceReadyPage = ({
99101
workspace.latest_build.status,
100102
)
101103
const {
102-
mutate: restartWorkspace,
104+
mutate: mutateRestartWorkspace,
103105
error: restartBuildError,
104106
isLoading: isRestarting,
105-
} = useRestartWorkspace()
107+
} = useMutation({
108+
mutationFn: restartWorkspace,
109+
})
106110
// keep banner machine in sync with workspace
107111
useEffect(() => {
108112
bannerSend({ type: "REFRESH_WORKSPACE", workspace })
@@ -154,9 +158,9 @@ export const WorkspaceReadyPage = ({
154158
handleDelete={() => workspaceSend({ type: "ASK_DELETE" })}
155159
handleRestart={(buildParameters) => {
156160
if (isWarningIgnored("restart")) {
157-
restartWorkspace({ workspace, buildParameters })
161+
mutateRestartWorkspace({ workspace, buildParameters })
158162
} else {
159-
setIsConfirmingRestart(true)
163+
setConfirmingRestart({ open: true, buildParameters })
160164
}
161165
}}
162166
handleUpdate={() => {
@@ -253,15 +257,18 @@ export const WorkspaceReadyPage = ({
253257
/>
254258

255259
<WarningDialog
256-
open={isConfirmingRestart}
260+
open={confirmingRestart.open}
257261
onConfirm={(shouldIgnore) => {
258262
if (shouldIgnore) {
259263
ignoreWarning("restart")
260264
}
261-
restartWorkspace({ workspace })
262-
setIsConfirmingRestart(false)
265+
mutateRestartWorkspace({
266+
workspace,
267+
buildParameters: confirmingRestart.buildParameters,
268+
})
269+
setConfirmingRestart({ open: false })
263270
}}
264-
onClose={() => setIsConfirmingRestart(false)}
271+
onClose={() => setConfirmingRestart({ open: false })}
265272
title="Confirm restart"
266273
confirmText="Restart"
267274
description="Are you sure you want to restart your workspace? Updating your workspace will stop all running processes and delete non-persistent data."

site/src/pages/WorkspacePage/hooks.ts

-8
This file was deleted.

0 commit comments

Comments
 (0)