supersam/src/components/orders/OrderHistoryTimeline.test.jsx

84 lines
4.2 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 React from "react";
import { renderToStaticMarkup } from "react-dom/server";
import { describe, expect, it } from "vitest";
import { ProgressStepper, getAutocallStepState, autocallStepHint } from "./OrderHistoryTimeline";
const orderDelivery = {
id: "g-1",
deliveryType: "delivery",
deliveryStatus: "pending_confirmation",
notificationStatus: "first_sms_sent",
firstSmsSentAt: "2026-09-27T10:00:00Z",
};
const orderPickup = {
id: "g-2",
deliveryType: "pickup",
deliveryStatus: "pending_confirmation",
notificationStatus: "first_sms_sent",
firstSmsSentAt: "2026-09-27T10:00:00Z",
};
const call = (outcome, extra = {}) => ({
id: Math.random().toString(36).slice(2),
outcome,
attempt_no: 1,
created_at: "2026-09-28T10:00:00Z",
was_test_mode: false,
...extra,
});
describe("шаг «Звонок» в цепочке заказа", () => {
it("цепочка доставки содержит шаг звонка сразу после SMS", () => {
const markup = renderToStaticMarkup(<ProgressStepper order={orderDelivery} smsLogs={[]} autocallLogs={[]} />);
const labels = ["Добавлен", "SMS", "Звонок", "Согласовано", "Водитель", "Доставлено"];
let prev = -1;
for (const l of labels) {
const at = markup.indexOf(`>${l}</span>`);
expect(at, `шаг «${l}» есть в цепочке`).toBeGreaterThan(-1);
expect(at, `шаг «${l}» идёт по порядку`).toBeGreaterThan(prev);
prev = at;
}
});
it("цепочка самовывоза тоже содержит звонок и заканчивается «Вывезено»", () => {
const markup = renderToStaticMarkup(<ProgressStepper order={orderPickup} smsLogs={[]} autocallLogs={[]} />);
expect(markup).toContain(">Звонок</span>");
expect(markup).toContain(">Вывезено</span>");
expect(markup).not.toContain(">Водитель</span>");
});
it("без звонков шаг «Звонок» не отмечен пройденным", () => {
const markup = renderToStaticMarkup(<ProgressStepper order={orderDelivery} smsLogs={[]} autocallLogs={[]} />);
expect(getAutocallStepState([])).toBe("empty");
// ни один ✓ не должен стоять на шаге звонка: до звонка и на нём самом пройдены только Добавлен и SMS
const callSegment = markup.slice(markup.indexOf(">Звонок</span>") - 400, markup.indexOf(">Звонок</span>"));
expect(callSegment.split("✓").length - 1).toBe(0);
});
it("согласованный роботом слот отмечает шаг «Звонок» пройденным", () => {
const logs = [call("confirmed")];
const markup = renderToStaticMarkup(<ProgressStepper order={{ ...orderDelivery, deliveryStatus: "agreed", notificationStatus: "confirmed" }} smsLogs={[]} autocallLogs={logs} />);
expect(getAutocallStepState(logs)).toBe("done");
const callSegment = markup.slice(markup.indexOf(">Звонок</span>") - 400, markup.indexOf(">Звонок</span>"));
expect(callSegment).toContain("✓");
});
it("неудачные звонки дают состояние «требует внимания», а не «пройдено»", () => {
const logs = [call("no_answer")];
expect(getAutocallStepState(logs)).toBe("warn");
const markup = renderToStaticMarkup(<ProgressStepper order={orderDelivery} smsLogs={[]} autocallLogs={logs} />);
const callSegment = markup.slice(markup.indexOf(">Звонок</span>") - 400, markup.indexOf(">Звонок</span>"));
expect(callSegment).not.toContain("✓");
expect(callSegment).toContain("🤖");
expect(callSegment).toContain("--color-warning");
});
it("подсказка к шагу описывает последний звонок словами логиста", () => {
expect(autocallStepHint([])).toBe("Звонков не было");
expect(autocallStepHint([call("no_answer")])).toBe("Звонков: 1 · последний: не взял трубку");
expect(autocallStepHint([call("confirmed", { was_test_mode: true })]))
.toBe("Звонков: 1 · последний: клиент согласовал слот · 🧪 тест");
});
});