$pages */ function fakePages(array $pages): PageFetcher { return new class($pages) implements PageFetcher { /** @param array $pages */ public function __construct(private array $pages) {} public function html(string $url): string { return $this->pages[$url] ?? ''; } }; } it('обходит список 2ГИС и собирает карточки филиалов с адресом', function () { $fake = fakePages([ 'https://2gis.ru/krasnoyarsk/search/X' => 'ф1ф2', 'https://2gis.ru/krasnoyarsk/firm/111' => 'КрасЛомбард, улица Весны, 7, Красноярск — 2ГИСx', 'https://2gis.ru/krasnoyarsk/firm/222' => 'КрасЛомбард, проспект Мира, 10, Красноярск — 2ГИСx', ]); $cards = (new XfetchDirectoryFetcher($fake))->directory('https://2gis.ru/krasnoyarsk/search/X'); expect($cards)->toHaveCount(2); $byNum = collect($cards)->keyBy('number'); expect($byNum['+73912550000']->office)->toBe('улица Весны, 7'); expect($byNum['+73912550000']->source)->toBe('2ГИС'); expect($byNum['+73912920000']->office)->toBe('проспект Мира, 10'); }); it('site() тянет HTML конкурента через тот же загрузчик', function () { $fake = fakePages(['https://k.ru' => 'x']); $site = (new XfetchDirectoryFetcher($fake))->site('https://k.ru'); expect($site->url)->toBe('https://k.ru') ->and($site->rawHtml)->toContain('tel:+73912920000'); });