Files
portal/app/tests/Unit/Autopodbor/ChannelA/AitunnelQueryAnalyzerTest.php
T

66 lines
3.0 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
use App\Services\Autopodbor\Agent\ChannelA\AitunnelQueryAnalyzer;
use Illuminate\Http\Client\Factory as HttpFactory;
use Illuminate\Support\Facades\Config;
// Шаг АНАЛИЗ канала А (ZAFIKSIROVANO §0-БИС / §12.7): мелкая ИИ-модель из описания клиента даёт
// несколько КОРОТКИХ запросов-рубрик для скрейпа категории 2ГИС/Яндекса (в тесте Омеги было ~6).
// Сеть мокаем. Промт восстановлен (оригинал жил в самоочистившемся collectA.js) — точим на прогоне.
it('без ключа отдаёт fallback — один запрос из описания (А не мёртв)', function () {
Config::set('services.aitunnel.key', '');
$a = new AitunnelQueryAnalyzer(app(HttpFactory::class));
expect($a->analyze('займы под залог авто и спецтехники', 'Красноярский край'))
->toBe(['займы под залог авто и спецтехники']);
});
it('разбирает JSON-массив запросов из ответа модели', function () {
Config::set('services.aitunnel', [
'key' => 'k', 'base_url' => 'https://api.aitunnel.ru/v1', 'chat_model' => 'gpt-4o-mini', 'timeout_sec' => 30,
]);
$http = app(HttpFactory::class);
$http->fake([
'*/chat/completions' => $http->response([
'choices' => [['message' => ['content' => '["автоломбард","займ под залог авто","МФО","ломбард"]']]],
], 200),
]);
$a = new AitunnelQueryAnalyzer($http);
$out = $a->analyze('займы под залог авто', 'Красноярский край');
expect($out)->toBe(['автоломбард', 'займ под залог авто', 'МФО', 'ломбард']);
});
it('режет markdown-обёртку и пустые/дубли, ограничивает число', function () {
Config::set('services.aitunnel.key', 'k');
$http = app(HttpFactory::class);
$http->fake([
'*/chat/completions' => $http->response([
'choices' => [['message' => ['content' => "```json\n[\"автоломбард\",\"\",\"автоломбард\",\"займ под залог\"]\n```"]]],
], 200),
]);
$a = new AitunnelQueryAnalyzer($http);
$out = $a->analyze('займы', 'Красноярский край');
expect($out)->toBe(['автоломбард', 'займ под залог']);
});
it('при ошибке сети — fallback из описания', function () {
Config::set('services.aitunnel.key', 'k');
$http = app(HttpFactory::class);
$http->fake(['*/chat/completions' => $http->response('boom', 500)]);
$a = new AitunnelQueryAnalyzer($http);
expect($a->analyze('ломбард', 'Красноярский край'))->toBe(['ломбард']);
});