set('services.bot.tours_enabled', true); config()->set('app.url', 'https://lk.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, ]); Http::fake([ 'llm.api.cloud.yandex.net/*' => Http::response([ 'result' => ['alternatives' => [['message' => ['role' => 'assistant', 'text' => 'Проект создаётся в разделе «Проекты».']]]], ]), ]); KnowledgeChunk::create([ 'source_path' => 'sozdat-proekt.md', 'title' => 'Как создать проект', 'tour' => 'create-project', 'topics' => 'создать проект, новый проект', 'chunk_index' => 0, 'content' => 'Проект создаётся в разделе «Проекты», кнопка «Создать».', ]); }); it('клиенту из кабинета экскурсия по теме предлагается', function () { $answer = app(BotAnswerService::class)->answer('как создать проект?', [], fromPortal: true); expect($answer->text)->toContain('https://lk.liderra.ru/?tour=create-project'); }); it('гостю с лендинга экскурсию не предлагаем — ему нечего показывать в кабинете', function () { $answer = app(BotAnswerService::class)->answer('как создать проект?', [], fromPortal: false); expect($answer->text)->not->toContain('?tour='); }); it('гостю даёт ссылку на разбор по слагу статьи', function () { config()->set('guides.slugs', ['sozdat-proekt']); config()->set('services.bot.landing_url', 'https://liderra.ru'); $answer = app(BotAnswerService::class)->answer('как создать проект?', [], fromPortal: false); expect($answer->text)->toContain('https://liderra.ru/kak-eto-rabotaet#sozdat-proekt'); expect($answer->text)->not->toContain('Показать на портале'); }); it('молчит, если разбора для статьи нет', function () { config()->set('guides.slugs', ['sozdat-proekt']); KnowledgeChunk::create([ 'source_path' => 'podderzhka.md', 'title' => 'Как связаться с поддержкой', 'tour' => 'support', 'topics' => 'поддержка, связаться, написать в поддержку', 'chunk_index' => 0, 'content' => 'Поддержка отвечает в чате и на support@liderra.ru.', ]); Http::fake([ 'llm.api.cloud.yandex.net/*' => Http::response([ 'result' => ['alternatives' => [['message' => ['role' => 'assistant', 'text' => 'Напишите в чат или на support@liderra.ru.']]]], ]), ]); $answer = app(BotAnswerService::class)->answer('как связаться с поддержкой?', [], fromPortal: false); expect($answer->text)->not->toContain('kak-eto-rabotaet'); expect($answer->text)->not->toContain('?tour='); }); it('вошедшему по-прежнему даёт экскурсию в кабинет, а не ссылку на лендинг', function () { config()->set('guides.slugs', ['sozdat-proekt']); config()->set('services.bot.landing_url', 'https://liderra.ru'); $answer = app(BotAnswerService::class)->answer('как создать проект?', [], fromPortal: true); expect($answer->text)->toContain('Показать на портале'); expect($answer->text)->not->toContain('kak-eto-rabotaet'); }); it('на приветствие («привет») ссылок нет никому', function () { config()->set('guides.slugs', ['sozdat-proekt']); config()->set('services.bot.landing_url', 'https://liderra.ru'); $guest = app(BotAnswerService::class)->answer('привет', [], fromPortal: false); $client = app(BotAnswerService::class)->answer('привет', [], fromPortal: true); expect($guest->text)->not->toContain('kak-eto-rabotaet'); expect($client->text)->not->toContain('Показать на портале'); });