Files
portal/app/tests/Unit/Autopodbor/ChannelA/PlaywrightYandexDirectoryTest.php
T
Дмитрий 7512ec2bad feat(autopodbor): полное прокси-покрытие Яндекса через виртуалку (фаза 7b)
Закрыт хвост §5.3: node-скриптовые точки Яндекса уведены на рендер-сервис, чтобы
под self_render ВЕСЬ Яндекс шёл через виртуалку+прокси (не крутил браузер на портале).

- YandexListSource (интерфейс) + LocalYandexListSource (xf4, локальный Playwright) +
  RenderServiceYandexListSource (self-render, POST type=yandex-list на виртуалку).
- PlaywrightYandexDirectory (листинг шаг 1) и PlaywrightYandexPhoneSearch (разворот)
  расшиты на YandexListSource — заодно стали тестируемы офлайн (6 новых тестов).
- PlaywrightYandexCardReader под self_render получает SelfRenderClient (был PageFetcher).
- Рендер-сервис: режим type=yandex-list (скролл ленты + сбор организаций → {orgs}),
  проброс scrolls.
- Провайдер: yandexListSource() по флагу; разворот-Яндекс на виртуалку+прокси.

Итог: при self_render ВКЛ на xf4 и на локальном браузере портала не остаётся НИ ОДНОЙ
точки — 2ГИС и весь Яндекс через виртуалку+прокси. 459/459 тестов, Pint+Larastan чисто.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 19:18:00 +03:00

63 lines
2.7 KiB
PHP

<?php
declare(strict_types=1);
use App\Services\Autopodbor\Agent\ChannelA\PlaywrightYandexDirectory;
use App\Services\Autopodbor\Agent\Fetch\YandexListSource;
// После расшивки на YandexListSource оркестрация тестируема офлайн (раньше — только через сеть).
// Проверяем: URL по рубрике+городу, потолок maxQueries, слияние рубрик, дедуп по slug (парсер).
function fakeSource(array $orgsPerCall): YandexListSource
{
return new class($orgsPerCall) implements YandexListSource
{
/** @var list<array{url:string,scrolls:int}> */
public array $calls = [];
public function __construct(private array $orgsPerCall) {}
public function fetch(string $url, int $scrolls): array
{
$this->calls[] = ['url' => $url, 'scrolls' => $scrolls];
return array_shift($this->orgsPerCall) ?? [];
}
};
}
it('строит URL по рубрике+городу и сливает организации разных рубрик', function () {
$source = fakeSource([
[['name' => 'КрасЛомбард', 'id' => '1', 'href' => '/maps/org/kraslombard/1']],
[['name' => 'Корунд', 'id' => '2', 'href' => '/maps/org/korund/2']],
]);
$rows = (new PlaywrightYandexDirectory($source, scrolls: 3))->collect('Красноярск', ['ломбард', 'автозайм']);
// Две рубрики → два вызова с правильными URL и scrolls.
expect($source->calls)->toHaveCount(2)
->and($source->calls[0]['url'])->toContain('yandex.ru/maps/?text=')
->and($source->calls[0]['scrolls'])->toBe(3);
$names = array_column($rows, 'name');
expect($names)->toContain('КрасЛомбард')->toContain('Корунд');
});
it('дедуп по slug: филиалы одной сети схлопываются', function () {
$source = fakeSource([[
['name' => 'КрасЛомбард', 'id' => '1', 'href' => '/maps/org/kraslombard/1'],
['name' => 'КрасЛомбард', 'id' => '2', 'href' => '/maps/org/kraslombard/2'],
]]);
$rows = (new PlaywrightYandexDirectory($source))->collect('Красноярск', ['ломбард']);
expect($rows)->toHaveCount(1)
->and($rows[0]['slug'])->toBe('kraslombard');
});
it('потолок maxQueries режет число рубрик', function () {
$source = fakeSource([[], [], []]);
(new PlaywrightYandexDirectory($source, maxQueries: 2))->collect('Красноярск', ['a', 'b', 'c']);
expect($source->calls)->toHaveCount(2); // 3-я рубрика не запрашивается
});