b2c89d12bd
A4 CompetitorResolver (§12.3): имя+город → 2ГИС-в-городе (прямая ссылка канала А) →
иначе Яндекс (поиск имя+город → первый org → проверка) → иначе local=false.
is_federal ПО ФАКТУ: нет местной карточки + есть сайт = федерал; есть карточка = местный.
Транспорт за PageFetcher — вся логика офлайн на фикстурах.
A5 ResolvingAgent (§7.2 resolveByName): имя+region_code → кандидат
{name,description,site_url,directory_urls,provenance} из настоящей карточки; нет филиала
→ честный кандидат-заглушка. Свободное сравнение город↔субъект (DirectoryFields::localeMatches).
Хелперы тестов (stubPages/autopodborFixture) вынесены в tests/Pest.php.
Провайдер НЕ флипнут (findCompetitors всё ещё заглушка до под-блока H).
Тесты: Resolve 17/17; модуль Автоподбора unit 75/75; Pint чисто.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
43 lines
1.9 KiB
PHP
43 lines
1.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Services\Autopodbor\Agent\Dto\ResolveByNameRequest;
|
|
use App\Services\Autopodbor\Agent\Resolve\CompetitorResolver;
|
|
use App\Services\Autopodbor\Agent\Resolve\ResolvingAgent;
|
|
|
|
// stubPages() и fx() объявлены в CompetitorResolverTest.php (глобальные хелперы Pest).
|
|
|
|
it('resolveByName: имя + регион → кандидат §7.2 из настоящей карточки', function () {
|
|
$pages = stubPages([
|
|
'maps/?text=' => '<a href="/maps/org/kraslombard/175852236692/">org</a>',
|
|
'/maps/org/' => autopodborFixture('yandex-org-kraslombard.html'),
|
|
]);
|
|
$agent = new ResolvingAgent(new CompetitorResolver($pages));
|
|
|
|
// 29 = Красноярский край (конституционный порядок RussianRegions)
|
|
$res = $agent->resolve(new ResolveByNameRequest('КрасЛомбард', 29));
|
|
|
|
expect($res->candidates)->toHaveCount(1);
|
|
$c = $res->candidates[0];
|
|
expect($c['name'])->toBe('КрасЛомбард');
|
|
expect($c['site_url'])->toBe('http://kraslombard24.ru');
|
|
expect($c['directory_urls'])->toContain('https://yandex.ru/maps/org/kraslombard/175852236692');
|
|
expect($c['description'])->toContain('Ломбард');
|
|
expect($c['is_federal'])->toBeFalse();
|
|
expect($c['provenance']['via'])->toBe('name-search');
|
|
});
|
|
|
|
it('resolveByName: имя не найдено → кандидат-заглушка «нет филиала» (без ссылок, не федерал)', function () {
|
|
$agent = new ResolvingAgent(new CompetitorResolver(stubPages([])));
|
|
|
|
$res = $agent->resolve(new ResolveByNameRequest('Неведомая Фирма', 29));
|
|
|
|
expect($res->candidates)->toHaveCount(1);
|
|
$c = $res->candidates[0];
|
|
expect($c['name'])->toBe('Неведомая Фирма');
|
|
expect($c['directory_urls'])->toBe([]);
|
|
expect($c['site_url'])->toBeNull();
|
|
expect($c['is_federal'])->toBeFalse();
|
|
});
|