Files
portal/app/tests/Unit/Autopodbor/FakeCompetitorAgentTest.php
T
Дмитрий 5851ac48d3 feat(автоподбор): включён настоящий движок шага 2 + ретрай флаки 2ГИС
Провайдер биндит RealCompetitorAgent вместо заглушки: сайт конкурента —
обычный curl плюс локальный Playwright, справочники 2ГИС/Яндекс — через
антибот xfetch. Поиск/резолв шага 1 ещё не реальны — делегируются заглушке
через fallback, поведение поиска не изменилось.

- AutopodborServiceProvider биндит RealCompetitorAgent с CompositeFetcher
- XfetchClient повторяет запрос при пустом флаки-рендере 2ГИС, до 3 раз
- тесты привязки контейнера плюс ретрая; study-тест пинит заглушку явно
- тесты заглушки строят FakeCompetitorAgent напрямую
- бэкенд автоподбора 126/126

НЕ на проде, воркстри avtopodbor.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 15:51:31 +03:00

42 lines
2.1 KiB
PHP

<?php
use App\Services\Autopodbor\Agent\Dto\FindCompetitorsRequest;
use App\Services\Autopodbor\Agent\Dto\ResolveByNameRequest;
use App\Services\Autopodbor\Agent\Dto\StudyCompetitorRequest;
use App\Services\Autopodbor\Agent\FakeCompetitorAgent;
// Контейнер с этого этапа отдаёт настоящий движок (RealCompetitorAgent) — см.
// AutopodborAgentBindingTest. Здесь проверяем поведение САМОЙ заглушки: строим её напрямую.
it('заглушка отдаёт демо-данные для поиска/изучения/резолва', function () {
$agent = new FakeCompetitorAgent;
$found = $agent->findCompetitors(new FindCompetitorsRequest(16, ['okna.ru'], [], true, 15));
expect(count($found->competitors))->toBeGreaterThan(0)
->and($found->competitors[0])->toHaveKeys(['name', 'relevance_pct', 'site_url']);
$study = $agent->studyCompetitor(new StudyCompetitorRequest(['name' => 'Окна Комфорт', 'site_url' => 'okna-komfort-kzn.ru'], 16));
expect($study->sources)->not->toBeEmpty()
->and($study->sources[0])->toHaveKeys(['signal_type', 'identifier', 'provenance_url']);
$resolve = $agent->resolveByName(new ResolveByNameRequest('Окна Комфорт', 16));
expect($resolve->candidates)->not->toBeEmpty();
});
it('заглушка отдаёт полный набор типов телефонов вкл. 8-800 (tollfree)', function () {
$agent = new FakeCompetitorAgent;
$study = $agent->studyCompetitor(new StudyCompetitorRequest(['name' => 'Окна Комфорт', 'site_url' => 'okna-komfort-kzn.ru'], 16));
$phoneTypes = collect($study->sources)
->where('signal_type', 'call')
->pluck('phone_type')
->unique()
->values()
->all();
// Тупой клиент должен увидеть все три типа номера: городской, мобильный, 8-800.
expect($phoneTypes)->toContain('city')
->and($phoneTypes)->toContain('mobile')
->and($phoneTypes)->toContain('tollfree');
});