Skip to content

Commit 3650ef1

Browse files
committed
fix(site): show error on template upload failure
1 parent aa0dc2d commit 3650ef1

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

site/src/pages/CreateTemplatePage/CreateTemplatePage.test.tsx

+35-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { screen, waitFor, within } from "@testing-library/react";
1+
import { fireEvent, screen, waitFor, within } from "@testing-library/react";
22
import userEvent from "@testing-library/user-event";
33
import { API } from "api/api";
44
import {
5+
mockApiError,
56
MockTemplate,
67
MockTemplateExample,
78
MockTemplateVersion,
@@ -150,3 +151,36 @@ test("Create template from duplicating a template", async () => {
150151
);
151152
});
152153
});
154+
155+
test("The page displays an error if the upload fails", async () => {
156+
const errMsg = `Unsupported content type header`
157+
jest.spyOn(API, "uploadFile").mockRejectedValueOnce(
158+
mockApiError({
159+
message: errMsg,
160+
}),
161+
);
162+
await renderPage(new URLSearchParams());
163+
164+
const file = new File([""], "invalidfile.tar");
165+
const dropZone = screen.getByTestId("drop-zone");
166+
167+
fireEvent.drop(dropZone, {
168+
dataTransfer: { files: [file] },
169+
});
170+
171+
await waitFor(() => expect(API.uploadFile).toHaveBeenCalledTimes(1));
172+
173+
// Error toast should be displayed
174+
expect(
175+
await screen.findByText(
176+
errMsg,
177+
),
178+
).toBeInTheDocument();
179+
180+
// The upload box should have reset itself
181+
expect(
182+
await screen.findByText(
183+
/The template has to be a .tar or .zip file/,
184+
),
185+
).toBeInTheDocument();
186+
});

site/src/pages/CreateTemplatePage/UploadTemplateView.tsx

+10-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import { useNavigate } from "react-router-dom";
1212
import { CreateTemplateForm } from "./CreateTemplateForm";
1313
import type { CreateTemplatePageViewProps } from "./types";
1414
import { firstVersionFromFile, getFormPermissions, newTemplate } from "./utils";
15+
import { displayError } from "components/GlobalSnackbar/utils";
16+
import { getErrorMessage } from "api/errors";
1517

1618
export const UploadTemplateView: FC<CreateTemplatePageViewProps> = ({
1719
onCreateTemplate,
@@ -51,7 +53,14 @@ export const UploadTemplateView: FC<CreateTemplatePageViewProps> = ({
5153
jobError={isJobError ? error.job.error : undefined}
5254
logs={templateVersionLogsQuery.data}
5355
upload={{
54-
onUpload: uploadFileMutation.mutateAsync,
56+
onUpload: async (file: File) => {
57+
try {
58+
await uploadFileMutation.mutateAsync(file);
59+
} catch (error) {
60+
displayError(getErrorMessage(error, "Failed to upload file"));
61+
uploadFileMutation.reset()
62+
}
63+
},
5564
isUploading: uploadFileMutation.isLoading,
5665
onRemove: uploadFileMutation.reset,
5766
file: uploadFileMutation.variables,

0 commit comments

Comments
 (0)