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, useOrderGroupsMock } = vi.hoisted(() => ({
useAuthMock: vi.fn(),
useOrderGroupsMock: vi.fn(),
}));
vi.mock("../context/AuthContext", () => ({
useAuth: useAuthMock,
}));
vi.mock("../hooks/useOrderGroups", () => ({
useOrderGroups: useOrderGroupsMock,
}));
vi.mock("../layouts/AppShell", () => ({
AppShell: ({ children, navItems, onOpenGuide, isGuideOpen }) => (
{children}
),
}));
const baseGroup = {
id: "group-1",
groupKey: "9780001231|16.04.26",
displayTitle: "Мария Волкова",
displaySubtitle: "+7 978 000-12-31 · 16.04.26",
customerName: "Мария Волкова",
customerPhone: "+7 978 000-12-31",
customerDate: "16.04.26",
ordersCount: 1,
readyCount: 1,
notReadyCount: 0,
orderNumbers: ["CD-240031"],
status: "ready_for_notification",
deliveryStatus: "agreed",
delivery_status: "agreed",
deliveryDate: "2026-04-16",
deliveryTime: "Первая половина дня",
updatedAt: "2026-04-15T09:00:00Z",
};
const mockOrderGroupsState = {
orderGroups: [baseGroup],
allOrderGroups: [baseGroup],
filteredOrderGroups: [baseGroup],
visibleOrderGroups: [baseGroup],
selectedOrderGroup: baseGroup,
selectedOrderGroupId: baseGroup.id,
setSelectedOrderGroupId: vi.fn(),
filters: {
query: "",
displayStatus: "all",
},
setFilters: vi.fn(),
deliverySetBuckets: {
ready_to_launch: [baseGroup],
sms_sent: [],
manual_work: [],
},
statusOptions: [
{ value: "all", label: "Все статусы" },
{ value: "status:ready_for_notification", label: "Готово к уведомлению" },
{ value: "delivery:agreed", label: "Согласовано" },
],
isLoading: false,
loadError: "",
saveManualDeliveryChoice: vi.fn(),
isSavingDeliveryChoice: false,
};
describe("DashboardPage", () => {
beforeEach(() => {
vi.useFakeTimers();
vi.setSystemTime(new Date("2026-04-15T09:00:00Z"));
useOrderGroupsMock.mockReturnValue(mockOrderGroupsState);
});
it("keeps the manager dashboard on the group 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", () => {
useOrderGroupsMock.mockReturnValue({
...mockOrderGroupsState,
orderGroups: [baseGroup],
allOrderGroups: [baseGroup],
filteredOrderGroups: [baseGroup],
visibleOrderGroups: [baseGroup],
selectedOrderGroup: baseGroup,
selectedOrderGroupId: baseGroup.id,
});
useAuthMock.mockReturnValue({
user: { id: "u-driver", name: "Иван", role: "driver" },
signOut: vi.fn(),
});
const markup = renderToStaticMarkup(
,
);
expect(markup).toContain("Мои доставки");
expect(markup).toContain("Мария Волкова");
expect(markup).toContain("CD-240031");
expect(markup).not.toContain("Канбан");
expect(markup).not.toContain("Календарь");
expect(markup).not.toContain("История");
expect(markup).not.toContain("Архив");
expect(markup).not.toContain("Производство");
});
});