Files
portal/app/tests/Unit/Autopodbor/Study/CompositePhoneReverseTest.php
T
Дмитрий 9fce28fda8 feat(autopodbor): Яндекс-разворот по телефонам на шаге 2 (рядом с 2ГИС)
Для застройщиков, которые сидят только в Яндексе. По каждому номеру ищем в
Яндекс.Картах, но список рыхлый — поэтому КАЖДУЮ карточку открываем и оставляем
только те, где искомый номер реально есть. Это отсекает «Похожие места рядом»,
рекламу и рыхлые совпадения по бренду. Оба справочника объединяются
(CompositePhoneReverse), дубли по домену схлопываются.

Переиспользована готовая механика Яндекса: render-yandex-list.cjs (список) +
DirectoryParser::parseYandexCard (карточка). Браузерные адаптеры за интерфейсами
(YandexPhoneSearch/YandexCardReader) — логика TDD-ится на фейках; порог общей
линии считается по подтверждённым карточкам.

За отдельным тумблером AUTOPODBOR_PHONE_REVERSE_YANDEX (по умолчанию ВЫКЛ,
требует phone_reverse). Юнит 267/267, feature 150/150. План и находки —
docs/superpowers/{plans,findings}/2026-07-05-*.

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

41 lines
1.7 KiB
PHP

<?php
use App\Services\Autopodbor\Agent\Study\CompositePhoneReverse;
use App\Services\Autopodbor\Agent\Study\PhoneExpansionResult;
use App\Services\Autopodbor\Agent\Study\PhoneReverse;
function fakeReverse(PhoneExpansionResult $r): PhoneReverse
{
return new class($r) implements PhoneReverse
{
public function __construct(private PhoneExpansionResult $r) {}
public function expand(string $gisSlug, array $seedPhones, array $seedDomains, string $yandexSlug = ''): PhoneExpansionResult
{
return $this->r;
}
};
}
it('объединяет сайты обоих провайдеров и дедупит по домену', function () {
$a = new PhoneExpansionResult(
sites: [['domain' => 'zvezda.ru', 'site_url' => 'https://zvezda.ru', 'card_url' => 'g1']],
phones: [['digits' => '73912002288', 'url' => 'g1', 'source' => '2ГИС']],
);
$b = new PhoneExpansionResult(
sites: [
['domain' => 'zvezda.ru', 'site_url' => 'https://zvezda.ru', 'card_url' => 'y1'],
['domain' => 'sm-city.ru', 'site_url' => 'https://sm-city.ru', 'card_url' => 'y2'],
],
phones: [['digits' => '73912179941', 'url' => 'y2', 'source' => 'Яндекс']],
);
$comp = new CompositePhoneReverse([fakeReverse($a), fakeReverse($b)]);
$res = $comp->expand('krasnoyarsk', ['x'], [], '62/krasnoyarsk');
$domains = array_column($res->sites, 'domain');
expect($domains)->toContain('zvezda.ru')
->and($domains)->toContain('sm-city.ru')
->and(count(array_filter($domains, fn ($d) => $d === 'zvezda.ru')))->toBe(1);
expect(count($res->phones))->toBe(2);
});