diff --git a/site/src/api/api.ts b/site/src/api/api.ts index a4d52c2850..0a2e421ecc 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -321,7 +321,7 @@ export const getPreviousTemplateVersionByName = async ( organizationId: string, templateName: string, versionName: string, -): Promise => { +) => { try { const response = await axios.get( `/api/v2/organizations/${organizationId}/templates/${templateName}/versions/${versionName}/previous`, diff --git a/site/src/api/queries/templates.ts b/site/src/api/queries/templates.ts index 9eddafc780..c0ba39e7cb 100644 --- a/site/src/api/queries/templates.ts +++ b/site/src/api/queries/templates.ts @@ -266,12 +266,15 @@ export const previousTemplateVersion = ( versionName, "previous", ], - queryFn: () => - API.getPreviousTemplateVersionByName( + queryFn: async () => { + const result = await API.getPreviousTemplateVersionByName( organizationId, templateName, versionName, - ), + ); + + return result ?? null; + }, }; }; diff --git a/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.test.tsx b/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.test.tsx new file mode 100644 index 0000000000..eda7fd600f --- /dev/null +++ b/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.test.tsx @@ -0,0 +1,56 @@ +import { render, screen } from "@testing-library/react"; +import { AppProviders } from "App"; +import { RequireAuth } from "contexts/auth/RequireAuth"; +import { RouterProvider, createMemoryRouter } from "react-router-dom"; +import { TemplateLayout } from "../TemplateLayout"; +import TemplateFilesPage from "./TemplateFilesPage"; +import { MockTemplate } from "testHelpers/entities"; +import { server } from "testHelpers/server"; +import { rest } from "msw"; + +// Occasionally, Jest encounters HTML5 canvas errors. As the SyntaxHighlight is +// not required for these tests, we can safely mock it. +jest.mock("components/SyntaxHighlighter/SyntaxHighlighter", () => ({ + SyntaxHighlighter: () =>
, +})); + +test("displays the template files even when there is no previous version", async () => { + server.use( + rest.get( + "/api/v2/organizations/:orgId/templates/:template/versions/:version/previous", + (req, res, ctx) => { + return res(ctx.status(404)); + }, + ), + ); + + render( + + , + children: [ + { + element: , + children: [ + { + path: "/templates/:template/files", + element: , + }, + ], + }, + ], + }, + ], + { + initialEntries: [`/templates/${MockTemplate.name}/files`], + }, + )} + /> + , + ); + + await screen.findByTestId("syntax-highlighter"); +}); diff --git a/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx b/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx index 23013451d0..12600c4cf4 100644 --- a/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx +++ b/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx @@ -14,13 +14,18 @@ const TemplateFilesPage: FC = () => { const { data: currentFiles } = useQuery( templateFiles(activeVersion.job.file_id), ); - const { data: previousTemplate } = useQuery( + const previousVersionQuery = useQuery( previousTemplateVersion(orgId, template.name, activeVersion.name), ); + const previousVersion = previousVersionQuery.data; + const hasPreviousVersion = + previousVersionQuery.isSuccess && previousVersion !== null; const { data: previousFiles } = useQuery({ - ...templateFiles(previousTemplate?.job.file_id ?? ""), - enabled: Boolean(previousTemplate), + ...templateFiles(previousVersion?.job.file_id ?? ""), + enabled: hasPreviousVersion, }); + const shouldDisplayFiles = + currentFiles && (!hasPreviousVersion || previousFiles); return ( <> @@ -28,7 +33,7 @@ const TemplateFilesPage: FC = () => { {getTemplatePageTitle("Source Code", template)} - {previousFiles && currentFiles ? ( + {shouldDisplayFiles ? (