diff --git a/app/tests/Feature/ClientTg/TgRobotDoneModesTest.php b/app/tests/Feature/ClientTg/TgRobotDoneModesTest.php index 1a9e1d10..37f1f461 100644 --- a/app/tests/Feature/ClientTg/TgRobotDoneModesTest.php +++ b/app/tests/Feature/ClientTg/TgRobotDoneModesTest.php @@ -94,3 +94,42 @@ it('отказ пересдачи при наличии номера кабин expect(Campaign::find($campaign->id)->status)->toBe(Campaign::STATUS_NEEDS_REVIEW); }); + +// 🔴 Развилка не охранялась ничем: удали/перепутай ветку MODE_STOP в match — и отчёт об +// остановке уехал бы в default (применитель ЗАПУСКА), который двигает статус и деньги. +// Отказ по заданию stop обязан снять отметку «останавливается» — этого не делает никто, +// кроме TelegramOstanovkaApplier, так что отметка — самый наглядный различитель. +it('отчёт об отказе остановки снимает отметку, а не двигает кампанию как после запуска', function () { + $campaign = tgModesCampaign($this->tenant->id, Campaign::STATUS_LAUNCHED); + $campaign->update(['stop_requested_at' => now()]); + $job = $this->queue->enqueue($this->tenant->id, $campaign->id, RobotJob::MODE_STOP, ['campaignId' => '777']); + $this->queue->takeNext(); + + $this->withHeader('X-Tg-Robot-Token', 'tg-secret-1') + ->postJson("/api/tg-robot/jobs/{$job->id}/done", [ + 'ok' => false, 'step' => 'stop', 'reason' => 'Вход в кабинет слетел', + ]) + ->assertOk(); + + $fresh = Campaign::find($campaign->id); + expect($fresh->stop_requested_at)->toBeNull(); + expect($fresh->status)->toBe(Campaign::STATUS_LAUNCHED); +}); + +it('успешное нажатие «Завершить» оставляет отметку остановки и записывает цифры', function () { + $campaign = tgModesCampaign($this->tenant->id, Campaign::STATUS_LAUNCHED); + $campaign->update(['stop_requested_at' => now()]); + $job = $this->queue->enqueue($this->tenant->id, $campaign->id, RobotJob::MODE_STOP, ['campaignId' => '777']); + $this->queue->takeNext(); + + $this->withHeader('X-Tg-Robot-Token', 'tg-secret-1') + ->postJson("/api/tg-robot/jobs/{$job->id}/done", [ + 'ok' => true, 'stopped' => true, 'status' => 'stopping', 'impressions' => 22, 'spendRub' => '10.56', + ]) + ->assertOk(); + + $fresh = Campaign::find($campaign->id); + expect($fresh->stop_requested_at)->not->toBeNull(); + expect($fresh->status)->toBe(Campaign::STATUS_LAUNCHED); + expect((string) $fresh->stats_spend_rub)->toBe('10.56'); +});