reader = new TwoGisJsonReader; $this->listing = file_get_contents(base_path('tests/fixtures/autopodbor/2gis/listing.initialstate.json')); $this->card = file_get_contents(base_path('tests/fixtures/autopodbor/2gis/card.initialstate.json')); $this->phone = file_get_contents(base_path('tests/fixtures/autopodbor/2gis/phone.initialstate.json')); }); // --- ЛИСТИНГ --- it('listing: чистый список фирм в порядке ранга (фирма-в-фирму, без мусора)', function () { $rows = $this->reader->listing($this->listing); expect($rows)->toHaveCount(12) ->and($rows[0])->toEqual([ 'name' => 'Ломбардико', 'card_url' => 'https://2gis.ru/krasnoyarsk/firm/70000001052966157', 'site' => null, // в листинге контактов нет — сайт из карточки ]); // все имена — настоящие фирмы (ломбарды/микрозаймы), без «Бургер Кинг»/зданий $names = array_column($rows, 'name'); expect($names)->toContain('КрасЛомбард') ->and(implode('|', $names))->not->toContain('Бургер'); }); it('listing: форма контракта = {name, card_url, site} — как CategoryListingParser', function () { foreach ($this->reader->listing($this->listing) as $row) { expect(array_keys($row))->toBe(['name', 'card_url', 'site']); } }); // --- КАРТОЧКА --- it('card: телефон из value + сайт из url объекта-контакта, source 2ГИС', function () { $url = 'https://2gis.ru/krasnoyarsk/firm/70000001052966157'; $cards = $this->reader->card($this->card, $url); expect($cards)->not->toBeEmpty() ->and($cards[0])->toBeInstanceOf(DirectoryCard::class) ->and($cards[0]->source)->toBe('2ГИС') ->and($cards[0]->url)->toBe($url) ->and($cards[0]->siteUrl)->toContain('ломбардико-24.рф'); // телефон +79509744052 присутствует $numbers = array_map(fn (DirectoryCard $c): string => preg_replace('/\D/', '', $c->number), $cards); expect($numbers)->toContain('79509744052'); }); // --- ПОИСК ПО ТЕЛЕФОНУ --- it('branchList: пути карточек холдинга (как parseBranchList)', function () { $paths = $this->reader->branchList($this->phone); expect($paths)->toHaveCount(2) ->and($paths)->toContain('/krasnoyarsk/firm/70000001052966157') ->and($paths)->toContain('/krasnoyarsk/firm/70000001052966076'); }); // --- ДЕГРАДАЦИЯ --- it('пустой/битый JSON → пустой массив по всем трём (не падает)', function () { foreach (['', 'не json', '{}', '{"data":{}}'] as $bad) { expect($this->reader->listing($bad))->toBe([]) ->and($this->reader->branchList($bad))->toBe([]) ->and($this->reader->card($bad, 'https://2gis.ru/x/firm/1'))->toBe([]); } });