import type { ReportParameter } from "@olenbetong/appframe-core"; import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { describe, expect, it, vi } from "vitest"; let parameterOptions: { value: string; label: string }[] = []; vi.mock("@olenbetong/appframe-react", async (importOriginal) => ({ ...(await importOriginal>()), useParameterOptions: () => ({ options: parameterOptions, loading: false, error: null }), })); const { ReportParameters } = await import("./ReportParameters.js"); function parameter(overrides: Partial & Pick): ReportParameter { return { label: overrides.name, description: null, type: "String", editor: "text", defaultValue: null, items: [], recordSource: null, valueMember: null, displayMember: null, sortOrder: 0, lookupWidth: null, lookupHeight: null, ...overrides, }; } describe("ReportParameters", () => { it("renders nothing when the report has no parameters", () => { let { container } = render(); expect(container).toBeEmptyDOMElement(); }); it("renders a labelled editor per parameter with the description as help text", () => { render( , ); expect(screen.getByLabelText("Periode")).toHaveValue(202601); expect(screen.getByLabelText("Kommentar")).toBeInTheDocument(); expect(screen.getByText("Vises på forsiden")).toBeInTheDocument(); }); it("coerces numeric input to a number", async () => { let onChange = vi.fn(); let user = userEvent.setup(); render( , ); await user.type(screen.getByLabelText("Period"), "7"); expect(onChange).toHaveBeenCalledWith({ Period: 7 }); }); it("renders a checkbox for boolean parameters", async () => { let onChange = vi.fn(); let user = userEvent.setup(); render( , ); await user.click(screen.getByLabelText("IncludeClosed")); expect(onChange).toHaveBeenCalledWith({ IncludeClosed: true }); }); it("renders a select for parameters with a fixed item list", async () => { let onChange = vi.fn(); let user = userEvent.setup(); render( , ); await user.selectOptions(screen.getByLabelText("Type"), "Åpne"); expect(onChange).toHaveBeenCalledWith({ Type: "Åpne" }); }); it("renders lookup options from the record source", () => { parameterOptions = [ { value: "1", label: "1 - Første" }, { value: "2", label: "2 - Andre" }, ]; render( , ); expect(screen.getByLabelText("Type")).toHaveValue("2 - Andre"); }); });