import { describe, expect, it, vi } from "vitest"; import { render, screen } from "@testing-library/react"; import Poster from "@/components/doctor/poster"; import PosterLight from "@/components/doctor/poster/PosterLight"; vi.mock("@/lib/getStateInfoClient", () => ({ getStateInfoClient: () => ({ matchedCity: { site_name: "یاسوج نوبت", domain: "yasuj-nobat.ir" } }), })); vi.mock("./QrImg", () => ({ default: () =>
})); vi.mock("@/components/doctor/poster/QrImg", () => ({ default: () =>
})); // همان شش تخصص دکتر محمدباقر جهانتاب، با همان شکلی که API برمی‌گرداند. const JAHANTAB = { name: "محمدباقر جهانتاب", specialties: [ { id: "13", name: "جراحی عمومی", parent_id: null }, { id: "14", name: "جراحی پلاستیک و زیبایی", parent_id: "13" }, { id: "167", name: "جراحی لاپاراسکوپی", parent_id: "13" }, { id: "168", name: "جراح تیروئید", parent_id: "13" }, { id: "169", name: "جراح گوارش", parent_id: "13" }, { id: "170", name: "جراحی سرطانها", parent_id: "13" }, ], expertise: [], address: [], }; describe.each([ ["پوستر تیره", Poster], ["پوستر روشن", PosterLight], ])("%s", (_label, Component) => { it("تخصص والد را به‌عنوان تیتر نشان می‌دهد", () => { render(); expect(screen.getByText("جراحی عمومی")).toBeInTheDocument(); }); it("زیرتخصص‌ها یک خط متنی‌اند، نه چیپ جداگانه", () => { render(); // اگر چیپ بودند، هر نام یک گرهٔ متنی مستقل داشت. expect(screen.queryByText("جراح گوارش")).not.toBeInTheDocument(); expect(screen.getByText(/جراح گوارش/)).toBeInTheDocument(); }); it("مازاد را می‌شمارد و نمی‌برد", () => { render(); expect(screen.getByText(/تخصص دیگر/)).toBeInTheDocument(); }); // ۱۰۸۰×۱۵۲۷ همان نسبت A4 است (۲۱۰:۲۹۷). هر عدد دیگری یعنی PDF یا حاشیهٔ سفید // می‌گیرد یا از کاغذ بیرون می‌زند. it("کادر ثابت ۱۰۸۰×۱۵۲۷ با نسبت A4 و overflow-hidden دست‌نخورده است", () => { const { container } = render(); const frame = container.firstChild; expect(frame.className).toContain("w-[1080px]"); expect(frame.className).toContain("h-[1527px]"); expect(frame.className).toContain("overflow-hidden"); expect(1527 / 1080).toBeCloseTo(297 / 210, 2); }); it("خط زیرتخصص از بودجهٔ کاراکتر نمی‌گذرد", () => { // jsdom چیدمان را اندازه نمی‌گیرد، پس سرریزِ پیکسلی اینجا اثبات‌شدنی نیست. // چیزی که اثبات می‌شود همان سازوکاری است که سرریز را می‌بندد: طول متن کراندار. render(); const line = screen.getByText(/جراح گوارش/); expect(line.textContent.length).toBeLessThan(120); }); it("پزشک تک‌تخصص خط زیرتخصص ندارد", () => { render( ); expect(screen.getByText("جراحی عمومی")).toBeInTheDocument(); expect(screen.queryByText(/تخصص دیگر/)).not.toBeInTheDocument(); }); it("پزشک بدون تخصص کرش نمی‌کند", () => { expect(() => render()).not.toThrow(); }); });