127 lines
3.5 KiB
JavaScript
127 lines
3.5 KiB
JavaScript
import { describe, expect, it } from "vitest";
|
||
import {
|
||
buildDriverKanbanColumns,
|
||
filterDriverDeliveries,
|
||
getDeliveryCity,
|
||
getDeliveryHalfDay,
|
||
groupDriverDeliveriesByDate,
|
||
reorderDriverDeliveries,
|
||
} from "./driverDeliveries";
|
||
|
||
const driverOrders = [
|
||
{
|
||
id: "d-1",
|
||
status: "Назначен водитель",
|
||
scheduledDelivery: "2026-03-14T08:30:00Z",
|
||
driverRouteOrder: 2,
|
||
customer: {
|
||
address: "Симферополь, ул. Тургенева, 18",
|
||
},
|
||
deliverySlots: [
|
||
{
|
||
date: "2026-03-14",
|
||
time: "Первая половина дня",
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: "d-2",
|
||
status: "В пути",
|
||
scheduledDelivery: "2026-03-14T13:00:00Z",
|
||
driverRouteOrder: 1,
|
||
customer: {
|
||
address: "Симферополь, ул. Крылова, 4",
|
||
},
|
||
deliverySlots: [
|
||
{
|
||
date: "2026-03-14",
|
||
time: "Вторая половина дня",
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: "d-3",
|
||
status: "Доставлен",
|
||
scheduledDelivery: "2026-03-15T09:00:00Z",
|
||
driverRouteOrder: 1,
|
||
customer: {
|
||
address: "Ялта, ул. Московская, 14",
|
||
},
|
||
deliverySlots: [
|
||
{
|
||
date: "2026-03-15",
|
||
time: "Первая половина дня",
|
||
},
|
||
],
|
||
},
|
||
];
|
||
|
||
describe("driverDeliveries helpers", () => {
|
||
it("extracts city from delivery address", () => {
|
||
expect(getDeliveryCity(driverOrders[0])).toBe("Симферополь");
|
||
});
|
||
|
||
it("derives half-day from delivery slot", () => {
|
||
expect(getDeliveryHalfDay(driverOrders[1])).toBe("Вторая половина дня");
|
||
});
|
||
|
||
it("filters deliveries by date range, city, half-day and view mode", () => {
|
||
const filtered = filterDriverDeliveries(driverOrders, {
|
||
dateFrom: "2026-03-14",
|
||
dateTo: "2026-03-14",
|
||
city: "Симферополь",
|
||
timeSlot: "all",
|
||
viewMode: "active",
|
||
showCompleted: false,
|
||
});
|
||
|
||
expect(filtered.map((order) => order.id)).toEqual(["d-1", "d-2"]);
|
||
});
|
||
|
||
it("can include completed deliveries back into the main list", () => {
|
||
const filtered = filterDriverDeliveries(driverOrders, {
|
||
dateFrom: "",
|
||
dateTo: "",
|
||
city: "all",
|
||
timeSlot: "all",
|
||
viewMode: "active",
|
||
showCompleted: true,
|
||
});
|
||
|
||
expect(filtered.map((order) => order.id)).toEqual(["d-1", "d-2", "d-3"]);
|
||
});
|
||
|
||
it("groups deliveries by day and sorts them by route order", () => {
|
||
const grouped = groupDriverDeliveriesByDate(driverOrders);
|
||
|
||
expect(grouped).toHaveLength(2);
|
||
expect(grouped[0].date).toBe("2026-03-14");
|
||
expect(grouped[0].items.map((order) => order.id)).toEqual(["d-2", "d-1"]);
|
||
});
|
||
|
||
it("reorders deliveries and rewrites route positions", () => {
|
||
const reordered = reorderDriverDeliveries(driverOrders, ["d-1", "d-2"]);
|
||
|
||
const first = reordered.find((order) => order.id === "d-1");
|
||
const second = reordered.find((order) => order.id === "d-2");
|
||
|
||
expect(first.driverRouteOrder).toBe(1);
|
||
expect(second.driverRouteOrder).toBe(2);
|
||
});
|
||
|
||
it("builds driver kanban columns from filtered deliveries", () => {
|
||
const columns = buildDriverKanbanColumns(driverOrders);
|
||
|
||
expect(columns.map((column) => column.key)).toEqual([
|
||
"assigned",
|
||
"loaded",
|
||
"on_route",
|
||
"delivered",
|
||
"problem",
|
||
]);
|
||
expect(columns[0].items.map((order) => order.id)).toEqual(["d-1"]);
|
||
expect(columns[2].items.map((order) => order.id)).toEqual(["d-2"]);
|
||
expect(columns[3].items.map((order) => order.id)).toEqual(["d-3"]);
|
||
});
|
||
});
|