0d5e06e895
SearchResultsParser: страница категория-поиска → список фирм/организаций {ссылка, имя-подсказка}.
2ГИС — путь /<город>/firm/<id> + имя из вложенного span; Яндекс — /maps/org/<seo>/<id> + aria-label.
Дедуп по ссылке. Авторитетное имя/поля даёт резолвер (под-блок A), открывая каждую карточку.
Пагинация/мульти-запрос — живая часть (блок H/живой прогон).
Фикстуры — реальные сниппеты выдачи (Красломбард, Красноярск): 2ГИС через xfetch, Яндекс
локальным Playwright.
Тесты: search 3/3; модуль Автоподбора unit 87/87; Pint чисто.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
40 lines
1.7 KiB
PHP
40 lines
1.7 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Services\Autopodbor\Agent\Search\SearchResultsParser;
|
|
|
|
// autopodborFixture() — глобальный хелпер из tests/Pest.php.
|
|
|
|
it('вытаскивает фирмы из реальной выдачи 2ГИС (ссылка + имя-подсказка)', function () {
|
|
$items = (new SearchResultsParser)->twoGis(autopodborFixture('2gis-search-kraslombard.html'));
|
|
|
|
expect(count($items))->toBe(4);
|
|
foreach ($items as $it) {
|
|
expect($it['path'])->toMatch('#^/[a-z0-9_-]+/firm/\d+$#');
|
|
expect($it['name'])->toBe('КрасЛомбард');
|
|
}
|
|
// ссылки уникальны
|
|
$paths = array_column($items, 'path');
|
|
expect($paths)->toBe(array_values(array_unique($paths)));
|
|
});
|
|
|
|
it('вытаскивает организации из реальной выдачи Яндекса (ссылка + имя)', function () {
|
|
$items = (new SearchResultsParser)->yandex(autopodborFixture('yandex-search-kraslombard.html'));
|
|
|
|
expect(count($items))->toBe(5);
|
|
$names = array_column($items, 'name');
|
|
expect($names)->toContain('КрасЛомбард')->toContain('Сибломбард')->toContain('Енисейская скупка золота');
|
|
foreach ($items as $it) {
|
|
expect($it['url'])->toMatch('#^/maps/org/[a-z0-9_-]+/\d+$#');
|
|
}
|
|
$urls = array_column($items, 'url');
|
|
expect($urls)->toBe(array_values(array_unique($urls)));
|
|
});
|
|
|
|
it('пустая/неподходящая страница → пустой список', function () {
|
|
$p = new SearchResultsParser;
|
|
expect($p->twoGis('<html><body>ничего</body></html>'))->toBe([]);
|
|
expect($p->yandex('<html><body>ничего</body></html>'))->toBe([]);
|
|
});
|