shoc-frontend-new/src/test/app/(protected)/workorders/media-uploader-dropzone.test.tsx
2026-09-21 15:09:51 -03:00

50 lines
2 KiB
TypeScript

import { createRef } from "react";
import { fireEvent, screen } from "@testing-library/react";
import { describe, expect, it, vi } from "vitest";
import { toast } from "react-toastify";
import { MediaUploader } from "@/app/(protected)/workorders/_components/media/media-uploader";
import { MediaUploaderDropzone } from "@/app/(protected)/workorders/_components/media/media-uploader-dropzone";
import {
MAX_WORK_ORDER_MEDIA_BYTES,
workOrderMediaAcceptAttribute,
} from "@/domain/work-orders/utils/work-order-media-limits";
import { renderWithProviders } from "@/test/test-utils";
vi.mock("react-toastify", () => ({ toast: { error: vi.fn() } }));
describe("MediaUploaderDropzone", () => {
it("matches the AAP Photos accept copy and keeps it media-only", () => {
renderWithProviders(
<MediaUploaderDropzone
inputRef={createRef<HTMLInputElement>()}
pending={false}
onFilesSelected={vi.fn()}
/>,
);
expect(
screen.getByText("Accepted: JPG, PNG, MP4, MOV · Max 200MB per file"),
).toBeInTheDocument();
expect(screen.queryByText(/categorize after upload/i)).not.toBeInTheDocument();
expect(screen.queryByText(/PDF/)).not.toBeInTheDocument();
expect(screen.queryByText(/DOC/)).not.toBeInTheDocument();
const input = document.querySelector('input[type="file"]');
expect(input?.getAttribute("accept")).toBe(workOrderMediaAcceptAttribute());
expect(input?.getAttribute("accept")).not.toContain(".pdf");
});
it("rejects an oversized media file with the generic 200 MB toast", () => {
renderWithProviders(<MediaUploader uploads={[]} />);
const oversizedFile = {
name: "mobile-clip.MP4",
type: "application/octet-stream",
size: MAX_WORK_ORDER_MEDIA_BYTES + 1,
} as File;
const input = document.querySelector('input[type="file"]');
fireEvent.change(input as HTMLInputElement, { target: { files: [oversizedFile] } });
expect(toast.error).toHaveBeenCalledWith('"mobile-clip.MP4" exceeds the 200 MB limit.');
});
});