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( ()} 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(); 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.'); }); });