45 lines
2.0 KiB
PHP
45 lines
2.0 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
declare(strict_types=1);
|
||
|
|
|
||
|
|
use App\Models\KnowledgeChunk;
|
||
|
|
use App\Services\Bot\KnowledgeSearch;
|
||
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||
|
|
|
||
|
|
uses(RefreshDatabase::class);
|
||
|
|
|
||
|
|
beforeEach(function () {
|
||
|
|
KnowledgeChunk::create([
|
||
|
|
'source_path' => 'help/p.md', 'title' => 'Что такое проект', 'tour' => 'create-project',
|
||
|
|
'topics' => 'создать проект, заявка на лиды', 'chunk_index' => 0,
|
||
|
|
'content' => 'Проект — это заявка на поток клиентов с выбранного источника.',
|
||
|
|
]);
|
||
|
|
KnowledgeChunk::create([
|
||
|
|
'source_path' => 'help/b.md', 'title' => 'Как пополнить баланс', 'tour' => 'top-up-balance',
|
||
|
|
'topics' => 'пополнить, закинуть деньги, оплата', 'chunk_index' => 0,
|
||
|
|
'content' => 'Пополнить баланс: раздел Биллинг, кнопка Пополнить.',
|
||
|
|
]);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('находит релевантный чанк и ранжирует его первым', function () {
|
||
|
|
$hits = app(KnowledgeSearch::class)->search('а что такое проект?', 3);
|
||
|
|
|
||
|
|
expect($hits)->not->toBeEmpty()
|
||
|
|
->and($hits[0]->title)->toBe('Что такое проект');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('находит по синонимам из topics («закинуть деньги»)', function () {
|
||
|
|
$hits = app(KnowledgeSearch::class)->search('как закинуть деньги', 3);
|
||
|
|
|
||
|
|
expect($hits)->not->toBeEmpty()
|
||
|
|
->and($hits[0]->title)->toBe('Как пополнить баланс');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('на вопрос не по теме возвращает пусто', function () {
|
||
|
|
expect(app(KnowledgeSearch::class)->search('какая погода в москве', 3))->toBeEmpty();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('не падает на спецсимволах в вопросе', function () {
|
||
|
|
expect(app(KnowledgeSearch::class)->search('проект & | ! ( )', 3))->toBeArray();
|
||
|
|
});
|