46426d586e
Фазы 2-3 плана self-render. Только новые файлы — существующий код не тронут, xf4-путь цел. 281/281 юнит-тестов зелёные, Pint чисто. - TwoGisReader — интерфейс разбора 2ГИС (3 метода: listing/card/branchList), единый контракт поверх HTML (xf4) ИЛИ initialState-JSON (self-render). - HtmlTwoGisReader — xf4-путь: тонкий делегат к CategoryListingParser/ DirectoryParser, поведение 1:1 (4 теста контракт-идентичности на реальных фикстурах 2gis-*-kraslombard). - TwoGisJsonReader — self-render путь: разбор window.initialState по карте путей спайка (pagination-список → entity.profile), фильтр type=branch (фирма-в-фирму, без зданий/улиц). 5 тестов на реальных фикстурах: 12 фирм листинга, телефон+сайт карточки, 2 пути поиска-по-телефону, деградация. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
38 lines
1.8 KiB
PHP
38 lines
1.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Services\Autopodbor\Agent\ChannelA\CategoryListingParser;
|
|
use App\Services\Autopodbor\Agent\Extract\DirectoryParser;
|
|
use App\Services\Autopodbor\Agent\Extract\HtmlTwoGisReader;
|
|
use App\Services\Autopodbor\Agent\Extract\TwoGisReader;
|
|
|
|
// HtmlTwoGisReader — шов xf4-пути: тонкий делегат к нынешним HTML-парсерам. Контракт-идентичность:
|
|
// его выход по каждому из трёх типов ДОЛЖЕН совпадать с прямым вызовом парсера (поведение 1:1).
|
|
|
|
beforeEach(function () {
|
|
$this->reader = new HtmlTwoGisReader(new CategoryListingParser, new DirectoryParser);
|
|
$this->searchHtml = file_get_contents(base_path('tests/fixtures/autopodbor/2gis-search-kraslombard.html'));
|
|
$this->firmHtml = file_get_contents(base_path('tests/fixtures/autopodbor/2gis-firm-kraslombard.html'));
|
|
});
|
|
|
|
it('реализует интерфейс TwoGisReader', function () {
|
|
expect($this->reader)->toBeInstanceOf(TwoGisReader::class);
|
|
});
|
|
|
|
it('listing делегирует в CategoryListingParser::parse 1:1', function () {
|
|
expect($this->reader->listing($this->searchHtml))
|
|
->toEqual((new CategoryListingParser)->parse($this->searchHtml));
|
|
});
|
|
|
|
it('card делегирует в DirectoryParser::parse2gisCard 1:1', function () {
|
|
$url = 'https://2gis.ru/krasnoyarsk/firm/70000001052966157';
|
|
expect($this->reader->card($this->firmHtml, $url))
|
|
->toEqual((new DirectoryParser)->parse2gisCard($this->firmHtml, $url));
|
|
});
|
|
|
|
it('branchList делегирует в DirectoryParser::parseBranchList 1:1', function () {
|
|
expect($this->reader->branchList($this->searchHtml))
|
|
->toEqual((new DirectoryParser)->parseBranchList($this->searchHtml));
|
|
});
|