sites, $this->phones); } }; } beforeEach(fn () => config()->set('concurrency.default', 'sync')); it('сливает находки обоих разворотов: дедуп сайтов и телефонов, 2ГИС выигрывает', function () { $gis = parFakeReverse( sites: [['domain' => 'a.ru', 'site_url' => 'https://a.ru', 'card_url' => 'gis/a']], phones: [['digits' => '73912000001', 'url' => 'gis/1', 'source' => '2ГИС'], ['digits' => '73912000009', 'url' => 'gis/9', 'source' => '2ГИС']], ); $yandex = parFakeReverse( sites: [['domain' => 'b.ru', 'site_url' => 'https://b.ru', 'card_url' => 'ya/b'], ['domain' => 'a.ru', 'site_url' => 'https://a.ru', 'card_url' => 'ya/a']], // дубль домена a.ru phones: [['digits' => '73912000002', 'url' => 'ya/2', 'source' => 'Яндекс'], ['digits' => '73912000009', 'url' => 'ya/9', 'source' => 'Яндекс']], // дубль номера ...009 ); $res = (new ParallelPhoneReverse($gis, $yandex))->expand('krasnoyarsk', ['73912000000'], [], '62/krasnoyarsk'); // сайты: a.ru (от 2ГИС) + b.ru — дубль a.ru от Яндекса отброшен expect($res->sites)->toHaveCount(2) ->and(array_column($res->sites, 'domain'))->toEqualCanonicalizing(['a.ru', 'b.ru']) ->and(collect($res->sites)->firstWhere('domain', 'a.ru')['card_url'])->toBe('gis/a'); // 2ГИС выиграл // телефоны: 001, 009 (2ГИС), 002 — дубль 009 от Яндекса отброшен expect(array_column($res->phones, 'digits'))->toEqualCanonicalizing(['73912000001', '73912000009', '73912000002']) ->and(collect($res->phones)->firstWhere('digits', '73912000009')['source'])->toBe('2ГИС'); }); it('пустые находки — пустой результат', function () { $res = (new ParallelPhoneReverse(parFakeReverse([], []), parFakeReverse([], [])))->expand('krasnoyarsk', [], [], ''); expect($res->sites)->toBe([])->and($res->phones)->toBe([]); });