mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-30 10:27:49 +00:00
Сегмент выбирался вслепую — в списке не было числа пользователей, а после отправки экран показывал только количество созданных офферов: сколько человек реально получило предложение и сколько заблокировало бота, узнать было негде. В селекте сегментов теперь стоит охват каждого (GET /promo-offers/segments), под ним — сколько уйдёт по выбранному. После отправки экран результата показывает прогресс доставки с карточками Всего/Отправлено/Заблокировали/ Ошибки и опрашивает запись рассылки раз в 3 секунды, пока она не завершится. Прогресс-блок и бейдж статуса вынесены из AdminBroadcastDetail в BroadcastDeliveryStats и переиспользуются обеими страницами, а условие «доставка ещё идёт» — в утилиту broadcastStatus с тестами.
28 lines
1.0 KiB
TypeScript
28 lines
1.0 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { broadcastPollInterval, isBroadcastInFlight } from './broadcastStatus';
|
|
|
|
describe('broadcastStatus', () => {
|
|
it('treats queued, in-progress and cancelling deliveries as running', () => {
|
|
expect(isBroadcastInFlight('queued')).toBe(true);
|
|
expect(isBroadcastInFlight('in_progress')).toBe(true);
|
|
expect(isBroadcastInFlight('cancelling')).toBe(true);
|
|
});
|
|
|
|
it('treats finished deliveries as done', () => {
|
|
expect(isBroadcastInFlight('completed')).toBe(false);
|
|
expect(isBroadcastInFlight('partial')).toBe(false);
|
|
expect(isBroadcastInFlight('failed')).toBe(false);
|
|
expect(isBroadcastInFlight('cancelled')).toBe(false);
|
|
});
|
|
|
|
it('handles a missing status without polling', () => {
|
|
expect(isBroadcastInFlight(undefined)).toBe(false);
|
|
expect(broadcastPollInterval(undefined)).toBe(false);
|
|
});
|
|
|
|
it('polls only while the delivery is running', () => {
|
|
expect(broadcastPollInterval('in_progress')).toBe(3000);
|
|
expect(broadcastPollInterval('completed')).toBe(false);
|
|
});
|
|
});
|