Files
portal/app/tests/Feature/Bot/JivoBotWebhookTest.php
T

74 lines
2.2 KiB
PHP

<?php
declare(strict_types=1);
use App\Jobs\Bot\ProcessJivoMessageJob;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Queue;
uses(RefreshDatabase::class);
const JIVO_SECRET = 'test-secret-0123456789abcdef0123456789abcdef';
beforeEach(function () {
config()->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();
});