set('services.jivo_bot.outbound_url', 'https://bot.jivosite.com/webhooks/p/t'); config()->set('services.support.email', 'support@liderra.ru'); config()->set('services.yandexgpt', [ 'api_key' => 'k', 'folder_id' => 'f', 'model' => 'yandexgpt-lite/latest', 'endpoint' => 'https://llm.api.cloud.yandex.net/foundationModels/v1/completion', 'timeout_seconds' => 8, ]); KnowledgeChunk::create([ 'source_path' => 'help/p.md', 'title' => 'Что такое проект', 'tour' => null, 'topics' => 'создать проект', 'chunk_index' => 0, 'content' => 'Проект — это заявка на поток клиентов.', ]); Http::fake(['bot.jivosite.com/*' => Http::response(['ok' => true])]); }); it('эскалация просит телефон, а не зовёт оператора в чат', function () { Mail::fake(); (new ProcessJivoMessageJob('chat-c1', 'client-1', 'какой у меня баланс?'))->handle(); $out = BotDialog::where('direction', 'out')->firstOrFail(); expect($out->escalated)->toBeTrue() ->and($out->message)->toContain('номер телефона'); Http::assertNotSent(fn ($r) => ($r['event'] ?? '') === 'INVITE_AGENT'); Mail::assertNothingSent(); }); it('клиент прислал телефон после просьбы → письмо с контактом и вопросом уходит в поддержку', function () { Mail::fake(); (new ProcessJivoMessageJob('chat-c2', 'client-2', 'какой у меня баланс?'))->handle(); (new ProcessJivoMessageJob('chat-c2', 'client-2', 'мой номер +7 916 123-45-67'))->handle(); Mail::assertSent(BotContactRequestMail::class, function (BotContactRequestMail $mail) { return $mail->hasTo('support@liderra.ru') && $mail->phone === '79161234567' && str_contains($mail->question, 'баланс'); }); $last = BotDialog::where('direction', 'out')->latest('id')->firstOrFail(); expect($last->message)->toContain('Спасибо'); }); it('телефон без предшествующей просьбы бота письмо не шлёт', function () { Mail::fake(); (new ProcessJivoMessageJob('chat-c3', 'client-3', 'звоните мне на +79161234567 если что'))->handle(); Mail::assertNothingSent(); }); it('номер распознаётся в разных форматах', function () { Mail::fake(); $variants = ['8 (916) 123-45-67', '+7-916-123-45-67', '79161234567']; foreach ($variants as $i => $phone) { $chat = 'chat-fmt-'.$i; (new ProcessJivoMessageJob($chat, 'c', 'какой у меня баланс?'))->handle(); (new ProcessJivoMessageJob($chat, 'c', $phone))->handle(); } Mail::assertSent(BotContactRequestMail::class, 3); Mail::assertSent(BotContactRequestMail::class, fn ($m) => $m->phone === '79161234567'); });