Files
portal/app/tests/Unit/Autopodbor/Phone/CompetitorPhoneEnricherTest.php
T
Дмитрий 026bc48d41 feat(автоподбор): шаг1 D — обогащение телефонов через DaData (переиспользует живой клиент)
CompetitorPhoneEnricher: телефоны карточки → тип (city/mobile/tollfree) + регион + годность (qc=0)
через существующий DaDataPhoneClient (тот же, что резолв региона лида — §12.4, не дубль).
DaData недоступна → деградация: тип по префиксу (PhoneType), регион пуст, негоден — подбор не падает.
Номера не синтезируются, только классифицируются (берём опубликованные фирмой).

Ключ DaData — в config services.dadata (env, прод). Тест офлайн через Http::fake (реальная форма ответа).

Тесты: phone 4/4; модуль Автоподбора unit 91/91; Pint чисто.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 17:57:22 +03:00

56 lines
2.2 KiB
PHP

<?php
declare(strict_types=1);
use App\Services\Autopodbor\Agent\Phone\CompetitorPhoneEnricher;
use Illuminate\Http\Client\ConnectionException;
use Illuminate\Support\Facades\Http;
it('обогащает мобильный номер типом/регионом/годностью через DaData', function () {
Http::fake(['cleaner.dadata.ru/*' => Http::response([[
'qc' => 0, 'type' => 'Мобильный', 'phone' => '+7 921 555-12-34',
'provider' => 'МегаФон', 'region' => 'Санкт-Петербург и область',
]], 200)]);
$out = app(CompetitorPhoneEnricher::class)->enrich(['79215551234']);
expect($out)->toHaveCount(1);
expect($out[0])->toMatchArray([
'phone' => '79215551234',
'type' => 'mobile',
'region' => 'Санкт-Петербург и область',
'valid' => true,
]);
});
it('qc!=0 (неоднозначный номер) → негоден', function () {
Http::fake(['cleaner.dadata.ru/*' => Http::response([[
'qc' => 3, 'type' => 'Мобильный', 'region' => 'Москва',
]], 200)]);
$out = app(CompetitorPhoneEnricher::class)->enrich(['79991234567']);
expect($out[0]['valid'])->toBeFalse();
});
it('тип 8-800 из DaData → tollfree', function () {
Http::fake(['cleaner.dadata.ru/*' => Http::response([[
'qc' => 0, 'type' => 'Бесплатный', 'region' => 'Россия',
]], 200)]);
$out = app(CompetitorPhoneEnricher::class)->enrich(['78001234567']);
expect($out[0]['type'])->toBe('tollfree');
expect($out[0]['valid'])->toBeTrue();
});
it('DaData недоступна → не роняем подбор: тип по префиксу, регион пуст, негоден', function () {
Http::fake(fn () => throw new ConnectionException('timeout'));
$out = app(CompetitorPhoneEnricher::class)->enrich(['78001234567', '79991112233']);
expect($out)->toHaveCount(2);
expect($out[0])->toMatchArray(['phone' => '78001234567', 'type' => 'tollfree', 'region' => null, 'valid' => false]);
expect($out[1])->toMatchArray(['phone' => '79991112233', 'type' => 'mobile', 'region' => null, 'valid' => false]);
});