Skip to content

Commit 8499eac

Browse files
chore(site): add tests for deprecate template flow (#12685)
Closes #12505
1 parent 131d0bd commit 8499eac

File tree

2 files changed

+75
-19
lines changed

2 files changed

+75
-19
lines changed

site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx

+4-17
Original file line numberDiff line numberDiff line change
@@ -236,24 +236,11 @@ export const TemplateSettingsForm: FC<TemplateSettingsForm> = ({
236236
description="Deprecating a template prevents any new workspaces from being created. Existing workspaces will continue to function."
237237
>
238238
<FormFields>
239-
<Stack direction="column" spacing={0.5}>
240-
<Stack
241-
direction="row"
242-
alignItems="center"
243-
spacing={0.5}
244-
css={styles.optionText}
245-
>
246-
Deprecation Message
247-
</Stack>
248-
<span css={styles.optionHelperText}>
249-
Leave the message empty to keep the template active. Any message
250-
provided will mark the template as deprecated. Use this message to
251-
inform users of the deprecation and how to migrate to a new
252-
template.
253-
</span>
254-
</Stack>
255239
<TextField
256-
{...getFieldHelpers("deprecation_message")}
240+
{...getFieldHelpers("deprecation_message", {
241+
helperText:
242+
"Leave the message empty to keep the template active. Any message provided will mark the template as deprecated. Use this message to inform users of the deprecation and how to migrate to a new template.",
243+
})}
257244
disabled={isSubmitting || !accessControlEnabled}
258245
fullWidth
259246
label="Deprecation Message"

site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.test.tsx

+71-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import { screen, waitFor } from "@testing-library/react";
22
import userEvent from "@testing-library/user-event";
3+
import { http, HttpResponse } from "msw";
34
import * as API from "api/api";
4-
import type { UpdateTemplateMeta } from "api/typesGenerated";
5+
import type { Template, UpdateTemplateMeta } from "api/typesGenerated";
56
import { Language as FooterFormLanguage } from "components/FormFooter/FormFooter";
6-
import { MockTemplate } from "testHelpers/entities";
7+
import { MockEntitlements, MockTemplate } from "testHelpers/entities";
78
import {
89
renderWithTemplateSettingsLayout,
910
waitForLoaderToBeRemoved,
1011
} from "testHelpers/renderHelpers";
12+
import { server } from "testHelpers/server";
1113
import { getValidationSchema } from "./TemplateSettingsForm";
1214
import { TemplateSettingsPage } from "./TemplateSettingsPage";
1315

@@ -55,6 +57,9 @@ const renderTemplateSettingsPage = async () => {
5557
renderWithTemplateSettingsLayout(<TemplateSettingsPage />, {
5658
route: `/templates/${MockTemplate.name}/settings`,
5759
path: `/templates/:template/settings`,
60+
extraRoutes: [
61+
{ path: "/templates/:template", element: <div>Template</div> },
62+
],
5863
});
5964
await waitForLoaderToBeRemoved();
6065
};
@@ -126,4 +131,68 @@ describe("TemplateSettingsPage", () => {
126131
const validate = () => getValidationSchema().validateSync(values);
127132
expect(validate).toThrowError();
128133
});
134+
135+
describe("Deprecate template", () => {
136+
it("deprecates a template when has access control", async () => {
137+
server.use(
138+
http.get("/api/v2/entitlements", () => {
139+
return HttpResponse.json({
140+
...MockEntitlements,
141+
features: API.withDefaultFeatures({
142+
access_control: { enabled: true, entitlement: "entitled" },
143+
}),
144+
});
145+
}),
146+
);
147+
const updateTemplateMetaSpy = jest.spyOn(API, "updateTemplateMeta");
148+
const deprecationMessage = "This template is deprecated";
149+
150+
await renderTemplateSettingsPage();
151+
await deprecateTemplate(MockTemplate, deprecationMessage);
152+
153+
const [templateId, data] = updateTemplateMetaSpy.mock.calls[0];
154+
155+
expect(templateId).toEqual(MockTemplate.id);
156+
expect(data).toEqual(
157+
expect.objectContaining({ deprecation_message: deprecationMessage }),
158+
);
159+
});
160+
161+
it("does not deprecate a template when does not have access control", async () => {
162+
server.use(
163+
http.get("/api/v2/entitlements", () => {
164+
return HttpResponse.json({
165+
...MockEntitlements,
166+
features: API.withDefaultFeatures({
167+
access_control: { enabled: false, entitlement: "not_entitled" },
168+
}),
169+
});
170+
}),
171+
);
172+
const updateTemplateMetaSpy = jest.spyOn(API, "updateTemplateMeta");
173+
174+
await renderTemplateSettingsPage();
175+
await deprecateTemplate(
176+
MockTemplate,
177+
"This template should not be able to deprecate",
178+
);
179+
180+
const [templateId, data] = updateTemplateMetaSpy.mock.calls[0];
181+
182+
expect(templateId).toEqual(MockTemplate.id);
183+
expect(data).toEqual(
184+
expect.objectContaining({ deprecation_message: "" }),
185+
);
186+
});
187+
});
129188
});
189+
190+
async function deprecateTemplate(template: Template, message: string) {
191+
const deprecationField = screen.getByLabelText("Deprecation Message");
192+
await userEvent.type(deprecationField, message);
193+
194+
const submitButton = await screen.findByText(
195+
FooterFormLanguage.defaultSubmitLabel,
196+
);
197+
await userEvent.click(submitButton);
198+
}

0 commit comments

Comments
 (0)