import { describe, it, expect, beforeEach, vi } from "vitest"; import { screen, fireEvent } from "@testing-library/react"; import { renderWithProviders } from "../test/utils"; vi.mock("sonner", () => ({ toast: { success: vi.fn(), error: vi.fn() } })); vi.mock("../lib/api", () => ({ api: { get: vi.fn(), post: vi.fn(), patch: vi.fn(), put: vi.fn(), delete: vi.fn() }, ApiError: class extends Error {}, })); vi.mock("../stores/authStore", () => ({ useAuthStore: () => ({ doctorUuid: "doc-1", dbUuid: "doc-1", primaryRole: "doctor" }), })); vi.mock("../hooks/useSubscription", () => ({ useSubscription: () => ({ maxSecretaries: 5 }), })); import { api } from "../lib/api"; import MySecretariesPage from "./MySecretariesPage"; const get = api.get as ReturnType; const fullPerms = { appointments: { view: true, create: false, cancel: false, update_status: false }, patients: { view: false, create: false, update: false, delete: false }, payments: { view: false, create: false, update: false, delete: false }, insurances: { view: false, create: false, update: false, delete: false }, addresses: { view: false, create: false, update: false, delete: false }, clinic_info: { view: false, update: false }, }; const activeSecretary = { uuid: "sec-1", user_name: "سارا احمدی", mobile_number: "09121234567", doctor_name: "دکتر تست", doctor_uuid: "doc-1", is_active: true, national_code: "1234567890", address: "یزد", permissions: fullPerms, created_at: 1700000000, }; const previousSecretary = { ...activeSecretary, uuid: "sec-2", user_name: "مینا رضایی", mobile_number: "09129876543", is_active: false, national_code: "9999999999", }; function mockData(rows = [activeSecretary, previousSecretary]) { get.mockImplementation((url: string) => { if (url.includes("/secretaries/")) return Promise.resolve({ success: true, data: rows }); return Promise.resolve({ success: true, data: [] }); }); } beforeEach(() => { get.mockReset(); mockData(); }); describe("MySecretariesPage", () => { it("renders the title and both tabs", async () => { renderWithProviders(, { route: "/admin/my-secretaries" }); expect(await screen.findByText("لیست منشی ها")).toBeInTheDocument(); expect(screen.getByText("منشی های فعلی")).toBeInTheDocument(); expect(screen.getByText("منشی های قبلی")).toBeInTheDocument(); }); it("shows active secretaries with national code on the default tab", async () => { renderWithProviders(, { route: "/admin/my-secretaries" }); expect(await screen.findAllByText("سارا احمدی")).not.toHaveLength(0); expect(screen.getAllByText("1234567890").length).toBeGreaterThan(0); // inactive secretary is hidden on the active tab expect(screen.queryByText("مینا رضایی")).not.toBeInTheDocument(); }); it("switches to the previous tab and lists inactive secretaries", async () => { renderWithProviders(, { route: "/admin/my-secretaries" }); await screen.findAllByText("سارا احمدی"); fireEvent.click(screen.getByText("منشی های قبلی")); expect(await screen.findAllByText("مینا رضایی")).not.toHaveLength(0); expect(screen.queryByText("سارا احمدی")).not.toBeInTheDocument(); }); it("shows an empty state when there are no active secretaries", async () => { mockData([previousSecretary]); renderWithProviders(, { route: "/admin/my-secretaries" }); expect(await screen.findByText("هنوز منشی فعالی اضافه نشده است")).toBeInTheDocument(); }); it("opens the add modal with permission sections based on existing pages", async () => { renderWithProviders(, { route: "/admin/my-secretaries" }); await screen.findAllByText("سارا احمدی"); fireEvent.click(screen.getByText("اضافه کردن منشی")); expect(await screen.findByText("اضافه کردن منشی جدید")).toBeInTheDocument(); expect(screen.getByText("مجوزهای دسترسی")).toBeInTheDocument(); expect(screen.getByText("مدیریت نوبت‌ها")).toBeInTheDocument(); expect(screen.getByText("پرونده بیماران")).toBeInTheDocument(); expect(screen.getByText("مدیریت پرداخت‌ها")).toBeInTheDocument(); expect(screen.getByText("مدیریت بیمه‌ها")).toBeInTheDocument(); }); });