set('services.jivo_bot.webhook_secret', JIVO_SECRET); }); function jivoPayload(string $text = 'что такое проект?'): array { return [ 'event' => 'CLIENT_MESSAGE', 'id' => 'evt-1', 'chat_id' => 'chat-1', 'client_id' => 'client-1', 'message' => ['type' => 'TEXT', 'text' => $text, 'timestamp' => 1780000000], ]; } it('валидный секрет + CLIENT_MESSAGE → 200 и джоба в очереди bot', function () { Queue::fake(); $this->postJson('/api/webhook/jivo/'.JIVO_SECRET, jivoPayload())->assertOk(); Queue::assertPushedOn('bot', ProcessJivoMessageJob::class, function (ProcessJivoMessageJob $job) { return $job->chatId === 'chat-1' && $job->text === 'что такое проект?'; }); }); it('неверный секрет → 404 без джобы', function () { Queue::fake(); $this->postJson('/api/webhook/jivo/wrong-secret', jivoPayload())->assertNotFound(); Queue::assertNothingPushed(); }); it('секрет не настроен (пустой конфиг) → 404 даже с пустым секретом в URL', function () { config()->set('services.jivo_bot.webhook_secret', ''); Queue::fake(); $this->postJson('/api/webhook/jivo/anything', jivoPayload())->assertNotFound(); Queue::assertNothingPushed(); }); it('не-CLIENT_MESSAGE (служебное событие) → 200 без джобы', function () { Queue::fake(); $this->postJson('/api/webhook/jivo/'.JIVO_SECRET, ['event' => 'AGENT_JOINED', 'chat_id' => 'c']) ->assertOk(); Queue::assertNothingPushed(); }); it('CLIENT_MESSAGE без текста → 200 без джобы', function () { Queue::fake(); $payload = jivoPayload(); $payload['message']['text'] = ''; $this->postJson('/api/webhook/jivo/'.JIVO_SECRET, $payload)->assertOk(); Queue::assertNothingPushed(); });