*/ public array $requested = []; public function __construct(private array $map) {} public function html(string $url): string { $this->requested[] = $url; foreach ($this->map as $needle => $html) { if (str_contains($url, $needle)) { return $html; } } return ''; } }; } $YA_CARD = <<<'HTML' Автодом24, микрофинансовая организация, Красноярск — Яндекс Карты
+7 (913) 539-65-46
HTML; $GIS_CARD = 'AutoMoney, Красноярск — 2ГИС' .'' .'{"url":"http://automoney-krsk.ru","text":"automoney-krsk.ru","code":"1","type":"website","value":"http://link.2gis.ru/x"}' .'{"contact_text":"+7 913 539-65-46","type":"phone","value":"+79135396546"}'; it('вскрывает яндекс-карточку кандидата без сайта → появляется сайт и телефон', function () use ($YA_CARD) { $pages = enricherPages(['yandex.ru/maps/org/avtodom24' => $YA_CARD]); $enricher = new CompetitorCardEnricher($pages, new DirectoryParser); $out = $enricher->enrich([ ['name' => 'Автодом24', 'site_url' => null, 'description' => null, 'phones' => [], 'directory_urls' => ['https://yandex.ru/maps/org/avtodom24/1'], 'is_federal' => false], ]); expect($out[0]['site_url'])->toContain('automoney-krsk.ru'); $digits = implode('', array_map(fn ($p) => preg_replace('/\D/', '', (string) $p), $out[0]['phones'])); expect($digits)->toContain('9135396546'); }); it('вскрывает 2ГИС-карточку → сайт из поля контакта, телефон, описание', function () use ($GIS_CARD) { $pages = enricherPages(['2gis.ru/krasnoyarsk/firm/111' => $GIS_CARD]); $enricher = new CompetitorCardEnricher($pages, new DirectoryParser); $out = $enricher->enrich([ ['name' => 'AutoMoney', 'site_url' => null, 'description' => null, 'phones' => [], 'directory_urls' => ['https://2gis.ru/krasnoyarsk/firm/111'], 'is_federal' => false], ]); expect($out[0]['site_url'])->toContain('automoney-krsk.ru'); expect($out[0]['site_url'])->not->toContain('link.2gis.ru'); expect($out[0]['description'])->toContain('Займы под залог'); $digits = implode('', array_map(fn ($p) => preg_replace('/\D/', '', (string) $p), $out[0]['phones'])); expect($digits)->toContain('79135396546'); }); it('вскрывает карточку ДАЖЕ если сайт уже есть — свой сайт сохраняем, телефоны/описание дописываем', function () use ($GIS_CARD) { // Максимум качества: карточку открываем ВСЕГДА (гейта «сайт есть → пропустить» больше нет). // Сайт из листинга — надёжный, его НЕ затираем; из карточки берём только телефоны и описание. $pages = enricherPages(['2gis.ru/krasnoyarsk/firm/111' => $GIS_CARD]); $enricher = new CompetitorCardEnricher($pages, new DirectoryParser); $out = $enricher->enrich([ ['name' => 'AutoMoney', 'site_url' => 'known-good.ru', 'description' => null, 'phones' => [], 'directory_urls' => ['https://2gis.ru/krasnoyarsk/firm/111'], 'is_federal' => false], ]); expect($pages->requested)->not->toBe([]); // карточку ОТКРЫЛИ, хотя сайт был expect($out[0]['site_url'])->toBe('known-good.ru'); // свой сайт из листинга НЕ затёрли expect($out[0]['description'])->toContain('Займы под залог'); // описание дописали $digits = implode('', array_map(fn ($p) => preg_replace('/\D/', '', (string) $p), $out[0]['phones'])); expect($digits)->toContain('79135396546'); // телефон дописали }); it('без лимита и без гейта: открывает карточки у ВСЕХ кандидатов (и с сайтом, и без)', function () use ($YA_CARD) { $pages = enricherPages(['yandex.ru' => $YA_CARD]); $enricher = new CompetitorCardEnricher($pages, new DirectoryParser); $enricher->enrich([ ['name' => 'A', 'site_url' => null, 'description' => null, 'phones' => [], 'directory_urls' => ['https://yandex.ru/maps/org/a/1'], 'is_federal' => false], ['name' => 'B', 'site_url' => 'b.ru', 'description' => null, 'phones' => [], 'directory_urls' => ['https://yandex.ru/maps/org/b/2'], 'is_federal' => false], ['name' => 'C', 'site_url' => null, 'description' => null, 'phones' => [], 'directory_urls' => ['https://yandex.ru/maps/org/c/3'], 'is_federal' => false], ]); expect(count($pages->requested))->toBe(3); // все три, включая B с сайтом — гейта нет });