026bc48d41
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>
56 lines
2.2 KiB
PHP
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]);
|
|
});
|