88 lines
3.8 KiB
JavaScript
88 lines
3.8 KiB
JavaScript
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: () => <div data-testid="qr" /> }));
|
|
vi.mock("@/components/doctor/poster/QrImg", () => ({ default: () => <div data-testid="qr" /> }));
|
|
|
|
// همان شش تخصص دکتر محمدباقر جهانتاب، با همان شکلی که 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(<Component data={JAHANTAB} />);
|
|
|
|
expect(screen.getByText("جراحی عمومی")).toBeInTheDocument();
|
|
});
|
|
|
|
it("زیرتخصصها یک خط متنیاند، نه چیپ جداگانه", () => {
|
|
render(<Component data={JAHANTAB} />);
|
|
|
|
// اگر چیپ بودند، هر نام یک گرهٔ متنی مستقل داشت.
|
|
expect(screen.queryByText("جراح گوارش")).not.toBeInTheDocument();
|
|
expect(screen.getByText(/جراح گوارش/)).toBeInTheDocument();
|
|
});
|
|
|
|
it("مازاد را میشمارد و نمیبرد", () => {
|
|
render(<Component data={JAHANTAB} />);
|
|
|
|
expect(screen.getByText(/تخصص دیگر/)).toBeInTheDocument();
|
|
});
|
|
|
|
// ۱۰۸۰×۱۵۲۷ همان نسبت A4 است (۲۱۰:۲۹۷). هر عدد دیگری یعنی PDF یا حاشیهٔ سفید
|
|
// میگیرد یا از کاغذ بیرون میزند.
|
|
it("کادر ثابت ۱۰۸۰×۱۵۲۷ با نسبت A4 و overflow-hidden دستنخورده است", () => {
|
|
const { container } = render(<Component data={JAHANTAB} />);
|
|
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(<Component data={JAHANTAB} />);
|
|
|
|
const line = screen.getByText(/جراح گوارش/);
|
|
expect(line.textContent.length).toBeLessThan(120);
|
|
});
|
|
|
|
it("پزشک تکتخصص خط زیرتخصص ندارد", () => {
|
|
render(
|
|
<Component
|
|
data={{ ...JAHANTAB, specialties: [{ id: "13", name: "جراحی عمومی", parent_id: null }] }}
|
|
/>
|
|
);
|
|
|
|
expect(screen.getByText("جراحی عمومی")).toBeInTheDocument();
|
|
expect(screen.queryByText(/تخصص دیگر/)).not.toBeInTheDocument();
|
|
});
|
|
|
|
it("پزشک بدون تخصص کرش نمیکند", () => {
|
|
expect(() => render(<Component data={{ ...JAHANTAB, specialties: [] }} />)).not.toThrow();
|
|
});
|
|
});
|