shoc-frontend-new/src/test/app/(protected)/workorders/slide-over-extras-aveta.test.tsx

123 lines
4 KiB
TypeScript
Raw Normal View History

import { fireEvent, screen } from "@testing-library/react";
import { afterEach, describe, expect, it, vi } from "vitest";
import { SlideOverExtrasTab } from "@/app/(protected)/workorders/_components/detail/tabs/slide-over-extras-tab";
import { workOrdersApi } from "@/domain/work-orders/api/work-orders-api";
import type { MediaFile } from "@/domain/work-orders/types/work-order-media";
import { renderWithProviders } from "@/test/test-utils";
const photo: MediaFile = {
id: "m1",
name: "safety-form.pdf",
fileType: "pdf",
url: "blob:1",
category: "Report",
};
const avetaDoc: MediaFile = {
id: "m2",
name: "aveta-clearance.pdf",
fileType: "pdf",
url: "blob:2",
category: "Aveta",
};
describe("SlideOverExtrasTab Aveta", () => {
afterEach(() => {
vi.restoreAllMocks();
vi.unstubAllGlobals();
});
it("does not label the first extra document as Aveta when none is explicitly Aveta", () => {
renderWithProviders(
<SlideOverExtrasTab
uploads={[photo]}
avetaRequired
isReadOnly
onUpload={vi.fn()}
onRemove={vi.fn()}
/>,
);
expect(screen.getByText("safety-form.pdf")).toBeInTheDocument();
expect(screen.getAllByText("Aveta")).toHaveLength(1);
});
it("labels only an explicitly Aveta-categorized extra document", () => {
renderWithProviders(
<SlideOverExtrasTab
uploads={[photo, avetaDoc]}
avetaRequired
isReadOnly
onUpload={vi.fn()}
onRemove={vi.fn()}
/>,
);
expect(screen.getByText("safety-form.pdf")).toBeInTheDocument();
expect(screen.getByText("aveta-clearance.pdf")).toBeInTheDocument();
expect(screen.getAllByText("Aveta").length).toBeGreaterThanOrEqual(2);
});
it("categorizes an Extra file as Aveta without auto-labeling the first upload", () => {
const onCategorize = vi.fn();
renderWithProviders(
<SlideOverExtrasTab
uploads={[photo]}
avetaRequired
isReadOnly={false}
onUpload={vi.fn()}
onRemove={vi.fn()}
onCategorize={onCategorize}
/>,
);
fireEvent.change(screen.getByLabelText("Category for safety-form.pdf"), {
target: { value: "Aveta" },
});
expect(onCategorize).toHaveBeenCalledWith("m1", "Aveta");
expect(screen.queryByText("safety-form.pdf")).toBeInTheDocument();
});
it("opens Extra Docs through authenticated content instead of a static href", async () => {
const blob = new Blob(["pdf"], { type: "application/pdf" });
const getMediaContent = vi.spyOn(workOrdersApi, "getMediaContent").mockResolvedValue(blob);
const createObjectURL = vi.fn(() => "blob:authorized");
vi.stubGlobal("URL", { ...URL, createObjectURL, revokeObjectURL: vi.fn() });
const open = vi.fn();
vi.stubGlobal("open", open);
renderWithProviders(
<SlideOverExtrasTab
uploads={[{ ...photo, url: "https://cdn.example.com/Assets/Documents/secret.pdf" }]}
workOrderId={10}
avetaRequired
isReadOnly
onUpload={vi.fn()}
onRemove={vi.fn()}
/>,
);
expect(screen.queryByRole("link")).not.toBeInTheDocument();
fireEvent.click(screen.getByRole("button", { name: "safety-form.pdf" }));
await vi.waitFor(() => {
expect(getMediaContent).toHaveBeenCalledWith(10, "m1");
});
expect(createObjectURL).toHaveBeenCalledWith(blob);
expect(open).toHaveBeenCalledWith("blob:authorized", "_blank", "noopener,noreferrer");
});
it("shows Extra Docs accept copy with PDF DOC and 50MB", () => {
renderWithProviders(
<SlideOverExtrasTab uploads={[]} isReadOnly={false} onUpload={vi.fn()} onRemove={vi.fn()} />,
);
expect(
screen.getByText("Accepted: JPG, PNG, MP4, MOV, PDF, DOC · Max 50 MB"),
).toBeInTheDocument();
const input = document.querySelector('input[type="file"]');
expect(input?.getAttribute("accept")).toContain(".pdf");
expect(input?.getAttribute("accept")).toContain(".doc");
expect(input?.getAttribute("accept")).toContain(".docx");
});
});