fc907c2564
Разбор реальной org-карточки Яндекс.Карт (/maps/org/<seo>/<id>) в ResolvedCompetitor: имя/город из <title>, чистый сайт из business-urls (itemprop=url, без utm), телефоны type=phone (→7XXXXXXXXXX), описание из categories[].name. Отбраковка чужой фирмы того же имени: имя и город обязаны совпасть с ожидаемыми, иначе null. Рефактор: общие извлекатели имя+город и телефоны вынесены в DirectoryFields (используют и 2ГИС, и Яндекс) — без дублирования. Фикстура — реальная карточка КрасЛомбарда, снята локальным Playwright (render-page.cjs). Тесты: модуль Автоподбора unit 68/68; Pint чисто. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
56 lines
2.9 KiB
PHP
56 lines
2.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Services\Autopodbor\Agent\Resolve\YandexResolver;
|
|
|
|
function yandexFixture(): string
|
|
{
|
|
return file_get_contents(base_path('tests/fixtures/autopodbor/yandex-org-kraslombard.html'));
|
|
}
|
|
|
|
it('разбирает реальную org-карточку Яндекс.Карт в карточку конкурента', function () {
|
|
// хвост ?ll=… Яндекс дописывает к /maps/org/<seo>/<id> — резолвер его терпит и срезает
|
|
$url = 'https://yandex.ru/maps/org/kraslombard/175852236692/?ll=92.8%2C56.0&z=16';
|
|
$c = (new YandexResolver)->parse(yandexFixture(), $url, expectName: 'КрасЛомбард', city: 'Красноярск');
|
|
|
|
expect($c)->not->toBeNull();
|
|
expect($c->name)->toBe('КрасЛомбард'); // первый сегмент title
|
|
expect($c->siteUrl)->toBe('http://kraslombard24.ru'); // чистый сайт (itemprop=url), без utm
|
|
expect($c->siteUrl)->not->toContain('utm_');
|
|
expect($c->phones)->not->toBeEmpty();
|
|
expect($c->phones)->toContain('73912828585'); // нормализован к 7XXXXXXXXXX
|
|
expect($c->region)->toBe('Красноярск'); // город — последний сегмент title
|
|
expect($c->description)->toContain('Ломбард'); // categories[].name
|
|
expect($c->source)->toBe('Яндекс.Карты');
|
|
expect($c->directoryUrl)->toBe('https://yandex.ru/maps/org/kraslombard/175852236692'); // ?ll срезан, слеш убран
|
|
expect($c->isLocal())->toBeTrue();
|
|
expect($c->isFederal)->toBeFalse();
|
|
});
|
|
|
|
it('отбраковывает карточку из другого города (чужая фирма того же имени)', function () {
|
|
$url = 'https://yandex.ru/maps/org/kraslombard/175852236692/';
|
|
// имя совпало, но искали в Москве, а карточка — в Красноярске → не наша
|
|
$c = (new YandexResolver)->parse(yandexFixture(), $url, expectName: 'КрасЛомбард', city: 'Москва');
|
|
|
|
expect($c)->toBeNull();
|
|
});
|
|
|
|
it('отбраковывает карточку с чужим именем', function () {
|
|
$url = 'https://yandex.ru/maps/org/kraslombard/175852236692/';
|
|
$c = (new YandexResolver)->parse(yandexFixture(), $url, expectName: 'Совсем Другая Фирма', city: 'Красноярск');
|
|
|
|
expect($c)->toBeNull();
|
|
});
|
|
|
|
it('возвращает null на пустой оболочке без данных карточки', function () {
|
|
$c = (new YandexResolver)->parse(
|
|
'<html><head><title>Яндекс Карты</title></head><body></body></html>',
|
|
'https://yandex.ru/maps/org/x/1',
|
|
expectName: 'X',
|
|
city: 'Красноярск',
|
|
);
|
|
|
|
expect($c)->toBeNull();
|
|
});
|