import React from "react"; import { MemoryRouter } from "react-router-dom"; import { renderToStaticMarkup } from "react-dom/server"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { DashboardPage } from "./DashboardPage"; const { useAuthMock, useOrdersMock } = vi.hoisted(() => ({ useAuthMock: vi.fn(), useOrdersMock: vi.fn(), })); vi.mock("../context/AuthContext", () => ({ useAuth: useAuthMock, })); vi.mock("../hooks/useOrders", () => ({ useOrders: useOrdersMock, })); vi.mock("../layouts/AppShell", () => ({ AppShell: ({ children, navItems, onOpenGuide, isGuideOpen }) => (
{children}
), })); const baseOrder = { id: "order-1", orderNumber: "CD-240031", status: "Ожидает согласования доставки", updatedAt: "2026-04-15T09:00:00Z", createdAt: "2026-04-14T09:00:00Z", scheduledDelivery: "2026-04-16T12:00:00Z", customer: { name: "Мария Волкова", phone: "+7 978 000-12-31", address: "Симферополь, ул. Ленина, 10", messenger: "СМС", items: ["Кухонный гарнитур | 1 комплект"], }, items: ["Кухонный гарнитур | 1 комплект"], comments: ["Нужен звонок за час"], orderNotes: [{ id: "note-1", text: "Подъезд узкий" }], history: [], chatMessages: [], deliverySlots: [], }; const baseDeliverySet = { key: "set-1", name: "Набор Марии Волковой", status: "ready_to_launch", readyAt: "2026-04-15T08:00:00Z", readyReason: "all_accepted", sourceCustomerCity: "Симферополь", orderCount: 1, linkedBillTexts: "УН-00031", orders: [baseOrder], }; const mockOrdersState = { orders: [baseOrder], allOrders: [baseOrder], selectedOrder: baseOrder, selectedOrderId: baseOrder.id, setSelectedOrderId: vi.fn(), filters: { query: "", status: "all", stage: "all", ownerRole: "all", agingState: "all", managerId: "all", logisticianId: "all", messenger: "all", }, setFilters: vi.fn(), notifications: [], pushNotification: vi.fn(), updateStatus: vi.fn(), addChatMessage: vi.fn(), addInternalMessage: vi.fn(), addOrderNote: vi.fn(), assignDriver: vi.fn(), reassignDelivery: vi.fn(), autoAssignLogisticians: vi.fn(), saveDriverRouteOrder: vi.fn(), metrics: { total: 1, readyToShip: 1, awaitingDeliveryCoordination: 1, exceptions: 0, inLogistics: 1, }, agingAlerts: [], agingSummary: { warning: 0, critical: 0 }, deliverySetBuckets: { approaching: [], ready_to_launch: [baseDeliverySet], awaiting_client: [], manual_work: [], agreed: [], completed: [], }, users: [ { id: "u-manager", name: "Анна", role: "manager" }, { id: "u-logistics", name: "Ольга", role: "logistician" }, { id: "u-driver", name: "Иван", role: "driver" }, ], isSupabaseBacked: true, isLoading: false, loadError: "", }; describe("DashboardPage", () => { beforeEach(() => { vi.useFakeTimers(); vi.setSystemTime(new Date("2026-04-15T09:00:00Z")); useOrdersMock.mockReturnValue(mockOrdersState); }); it("keeps the manager dashboard on the delivery registry only", () => { useAuthMock.mockReturnValue({ user: { id: "u-manager", name: "Анна", role: "manager" }, signOut: vi.fn(), }); const markup = renderToStaticMarkup( , ); expect(markup).toContain("Реестр заказов"); expect(markup).toContain("Поиск по номеру, клиенту и телефону."); expect(markup).toContain("aria-label=\"Справка\""); expect(markup).not.toContain("Справка"); expect(markup).not.toContain("доставочный контур"); expect(markup).not.toContain("Поиск по заказу, клиенту и телефону"); expect(markup).not.toContain("Интерфейс показывает"); expect(markup).not.toContain("Производство"); expect(markup).not.toContain("Администрирование"); expect(markup).not.toContain("Справочники"); expect(markup).not.toContain("Календарь"); expect(markup).not.toContain("Канбан"); expect(markup).not.toContain("История"); expect(markup).not.toContain("Архив"); }); afterEach(() => { vi.useRealTimers(); }); it("keeps the logistician dashboard free of bot control and extra workspace", () => { useAuthMock.mockReturnValue({ user: { id: "u-logistics", name: "Ольга", role: "logistician" }, signOut: vi.fn(), }); const markup = renderToStaticMarkup( , ); expect(markup).toContain("Наборы доставки"); expect(markup).toContain("Готово к запуску"); expect(markup).not.toContain("Управление ботами"); expect(markup).not.toContain("рабочая панель"); expect(markup).not.toContain("Сегодня"); expect(markup).not.toContain("Производство"); expect(markup).not.toContain("Администрирование"); expect(markup).not.toContain("Справочники"); }); it("keeps the driver dashboard on the deliveries list only", () => { useOrdersMock.mockReturnValue({ ...mockOrdersState, orders: [ { ...baseOrder, id: "driver-order-1", status: "Назначен водитель", scheduledDelivery: "2026-04-15T12:00:00Z", deliverySlots: [{ id: "slot-1", date: "2026-04-15", time: "До обеда" }], }, ], allOrders: [ { ...baseOrder, id: "driver-order-1", status: "Назначен водитель", scheduledDelivery: "2026-04-15T12:00:00Z", deliverySlots: [{ id: "slot-1", date: "2026-04-15", time: "До обеда" }], }, ], selectedOrder: { ...baseOrder, id: "driver-order-1", status: "Назначен водитель", scheduledDelivery: "2026-04-15T12:00:00Z", deliverySlots: [{ id: "slot-1", date: "2026-04-15", time: "До обеда" }], }, selectedOrderId: "driver-order-1", }); useAuthMock.mockReturnValue({ user: { id: "u-driver", name: "Иван", role: "driver" }, signOut: vi.fn(), }); const markup = renderToStaticMarkup( , ); expect(markup).toContain("Мои доставки"); expect(markup).toContain("CD-240031"); expect(markup).toContain("Мария Волкова"); expect(markup).not.toContain("Канбан"); expect(markup).not.toContain("Календарь"); expect(markup).not.toContain("История"); expect(markup).not.toContain("Архив"); expect(markup).not.toContain("Производство"); }); });