Files
portal/app/tests/Unit/Autopodbor/AgentDtoTest.php
T
Дмитрий 5a65165114 feat(автоподбор): движок шага 1 пересобран под финал v4 (каналы А+В, EXA)
Замена вырожденного «одна фраза → одна страница» на §12/§11.3 финал:
- Шаг АНАЛИЗ (ChannelA\AitunnelQueryAnalyzer): описание → запросы-рубрики (мелкая модель).
- Канал А (ChannelA\CategoryScraper): скрейп категории 2ГИС с пагинацией → резолв карточек.
- Канал В (ChannelB\*): ОДНА модель sonar-reasoning-pro × 2 прохода → ТОЛЬКО имена
  федералов; стоп-лист = имена из А + примеры; сайт федерала через EXA (ExaSiteFinder),
  т.к. у федерала нет карточки в 2ГИС/Яндексе на регион.
- Оркестратор LiveFindCompetitors переписан: АНАЛИЗ→А→В→слияние→отсев→дедуп→похожесть→DTO.
- Провайдер перепрошит; config services.php +research_model/exa.
Похожесть — эмбеддер-модель (математически), резолвер/дедуп — без изменений.
Всё за тонкими границами, офлайн-тесты на фикстурах: модуль 130 unit + 74 feature зелёные.
Провайдер за флагом autopodbor.real_find; на проде не меняется.

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

29 lines
1.6 KiB
PHP

<?php
use App\Services\Autopodbor\Agent\Dto\FindCompetitorsRequest;
use App\Services\Autopodbor\Agent\Dto\FindCompetitorsResult;
use App\Services\Autopodbor\Agent\Dto\ResolveByNameRequest;
use App\Services\Autopodbor\Agent\Dto\ResolveByNameResult;
use App\Services\Autopodbor\Agent\Dto\StudyCompetitorRequest;
use App\Services\Autopodbor\Agent\Dto\StudyCompetitorResult;
it('конструирует все DTO', function () {
$fReq = new FindCompetitorsRequest(regionCode: 16, examples: ['okna.ru'], aboutSelf: ['description' => 'окна'], includeFederal: true, maxCompetitors: 15);
expect($fReq->regionCode)->toBe(16)->and($fReq->examples)->toContain('okna.ru')->and($fReq->includeFederal)->toBeTrue();
$fRes = new FindCompetitorsResult(competitors: [['name' => 'Окна Комфорт', 'relevance_pct' => 100]]);
expect($fRes->competitors[0]['name'])->toBe('Окна Комфорт');
$sReq = new StudyCompetitorRequest(competitor: ['name' => 'Окна Комфорт', 'site_url' => 'okna.ru'], regionCode: 16);
expect($sReq->competitor['site_url'])->toBe('okna.ru')->and($sReq->regionCode)->toBe(16);
$sRes = new StudyCompetitorResult(sources: [['signal_type' => 'site', 'identifier' => 'okna.ru']]);
expect($sRes->sources[0]['signal_type'])->toBe('site');
$rReq = new ResolveByNameRequest(name: 'Окна Комфорт', regionCode: 16);
expect($rReq->name)->toBe('Окна Комфорт');
$rRes = new ResolveByNameResult(candidates: [['name' => 'Окна Комфорт']]);
expect($rRes->candidates)->toHaveCount(1);
});