74 lines
2.2 KiB
PHP
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();
|
|
});
|