supersam/src/services/driverDeliveries.test.js

127 lines
3.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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"]);
});
});