fix: přesnější stav kurýra u sledování Wolt
CI / Generate TypeScript types (push) Successful in 10s
CI / Server unit tests (push) Successful in 24s
CI / Build server (push) Successful in 29s
CI / Build client (push) Successful in 40s
CI / Playwright E2E tests (push) Successful in 1m46s
CI / Build and push Docker image (push) Successful in 48s
CI / Notify (push) Successful in 3s

Wolt hlásí stav podniku, ne rozvozu — status zůstane na "ready" i celou dobu,
co kurýr objednávku veze. Vyzvednutí proto poznáme podle pickup_eta: dokud je
v budoucnosti, jídlo ještě čeká v podniku, po vyzvednutí se ustálí na skutečném
čase. Dřív se stav odvozoval jen z příznaků kurýra, takže objednávka zůstala
viset na kroku "Vyzvedávání", i když už byla na cestě.

Kurýr má nově tři odvozené stavy: assigned (ještě nevyzvedl), delivering (veze
ji k nám) a delivering_other (veze ji, ale nejdřív doručuje cizí objednávku —
Wolt objednávky spojuje a kurýr se pak na mapě vzdaluje). Oba stavy delivering*
znamenají krok "Na cestě", tooltip u nich vysvětlí objížďku.
This commit is contained in:
batmanisko committed 2026-08-24 12:06:43 +02:00
1 parent 5c048fe1f1
commit 936ce2a9e4
4 files changed
+56 -17

No files matched your search

+22 -3
View File
@@ -314,6 +314,10 @@ describe('checkOrderTracking (Wolt)', () => {
return { data: { refresh_in_seconds: 30, timezone: 'Europe/Prague', ...details } };
}
/** ISO čas N minut v minulosti/budoucnosti — pickup_eta se posuzuje vůči teď. */
const past = (minutes: number) => new Date(Date.now() - minutes * 60_000).toISOString();
const future = (minutes: number) => new Date(Date.now() + minutes * 60_000).toISOString();
/** 404 z Wolt API (neznámý nebo expirovaný tracking code). */
function woltNotFound() {
(mockedAxios.isAxiosError as unknown as jest.Mock).mockImplementation((e: any) => !!e?.isAxiosError);
@@ -364,10 +368,11 @@ describe('checkOrderTracking (Wolt)', () => {
expect(mockedAxios.post).not.toHaveBeenCalled();
});
test('kurýr doručující cizí objednávku je jen assigned', async () => {
// Reálná odpověď: jídlo hotové, kurýr u podniku, ale veze ještě cizí objednávku
test('kurýr u podniku před vyzvednutím je jen assigned', async () => {
// Reálná odpověď z chvíle, kdy kurýr dorazil k podniku — pickup_eta teprve nastane
mockedAxios.get.mockResolvedValue(woltResponse({
status: 'ready',
pickup_eta: future(10),
delivery_eta: '2026-08-24T09:35:33.066000+00:00',
couriers: [{
id: '31ce2f6e139bec6c',
@@ -383,9 +388,22 @@ describe('checkOrderTracking (Wolt)', () => {
expect(group.trackingCourierState).toBe('assigned');
});
test('kurýr vezoucí naši objednávku se uloží jako delivering', async () => {
test('po vyzvednutí veze kurýr objednávku, i když nejdřív doručuje cizí', async () => {
// Wolt spojuje objednávky: náš oběd je v autě, kurýr se ale zatím vzdaluje k cizí adrese
mockedAxios.get.mockResolvedValue(woltResponse({
status: 'ready',
pickup_eta: past(35),
delivery_eta: '2026-08-24T09:35:33.066000+00:00',
couriers: [{ is_delivering: true, is_delivering_other_order: true }],
}));
await checkOrderTracking();
expect((await getGroup()).trackingCourierState).toBe('delivering_other');
});
test('kurýr mířící k nám se uloží jako delivering', async () => {
mockedAxios.get.mockResolvedValue(woltResponse({
status: 'ready',
pickup_eta: past(35),
delivery_eta: '2026-08-24T09:35:33.066000+00:00',
couriers: [{ is_delivering: true, is_delivering_other_order: false }],
}));
@@ -396,6 +414,7 @@ describe('checkOrderTracking (Wolt)', () => {
test('kurýr bez příznaků doručování je assigned', async () => {
mockedAxios.get.mockResolvedValue(woltResponse({
status: 'ready',
pickup_eta: past(35),
delivery_eta: '2026-08-24T09:35:33.066000+00:00',
couriers: [{ coordinates: { lat: 49.72, lon: 13.34 } }],
}));