diff --git a/app/tests/Feature/Sales/SmsOperatorRoutingTest.php b/app/tests/Feature/Sales/SmsOperatorRoutingTest.php index 1045a687..897081d7 100644 --- a/app/tests/Feature/Sales/SmsOperatorRoutingTest.php +++ b/app/tests/Feature/Sales/SmsOperatorRoutingTest.php @@ -3,6 +3,7 @@ declare(strict_types=1); use App\Models\SalesAdAudiencePhone; +use App\Models\SalesSmsMessage; use App\Services\Sms\OperatorNormalizer; use App\Services\Sms\Providers\MtsSmsProvider; use App\Services\Sms\Providers\SmscSmsProvider; @@ -13,7 +14,14 @@ use Tests\Concerns\SharesSupplierPdo; uses(DatabaseTransactions::class, SharesSupplierPdo::class); -function routing_router(): SmsRouter +/** Роутер ТОЛЬКО с каналом МТС — без универсала. Так нормализация становится + * нагруженной: сырое «ПАО "МТС"» пройдёт только если его привели к ключу 'mts'. */ +function mts_only_router(): SmsRouter +{ + return new SmsRouter([new MtsSmsProvider('t', ['mts'], ['*' => 400])]); +} + +function two_channel_router(): SmsRouter { return new SmsRouter([ new SmscSmsProvider('l', 'p', ['*'], ['*' => 300]), @@ -21,22 +29,35 @@ function routing_router(): SmsRouter ]); } -it('МТС-номер (как его пишет ДаДата) маршрутизируется на канал МТС', function () { +it('сырое имя МТС от ДаДаты сматчивается на канал МТС ТОЛЬКО через нормализацию', function () { SalesAdAudiencePhone::create([ 'phone' => '79990000010', 'expires_at' => now()->addDays(30), 'state' => 'active', 'operator' => 'ПАО "МТС"', 'phone_type' => 'mobile', ]); - $selector = new SmsRecipientSelector(routing_router(), new OperatorNormalizer); + // Роутер только-МТС: без нормализации 'ПАО "МТС"' не сматчится и номер уедет в skipped_no_route. + $selector = new SmsRecipientSelector(mts_only_router(), new OperatorNormalizer); $plan = $selector->build(['79990000010']); - expect($plan->sendable)->toHaveCount(1); - - $canonical = (new OperatorNormalizer)->canonical('ПАО "МТС"'); - expect(routing_router()->pick($canonical)?->key())->toBe('mts'); + expect($plan->sendable)->toHaveCount(1) + ->and($plan->skipped)->toBeEmpty(); }); -it('чужой оператор уходит на универсал (СМС-центр)', function () { - $canonical = (new OperatorNormalizer)->canonical('МегаФон'); - expect(routing_router()->pick($canonical)?->key())->toBe('smsc'); +it('не-МТС номер при роутере только-МТС остаётся без маршрута (не навязываем чужой канал МТС-у)', function () { + SalesAdAudiencePhone::create([ + 'phone' => '79990000011', 'expires_at' => now()->addDays(30), + 'state' => 'active', 'operator' => 'МегаФон', 'phone_type' => 'mobile', + ]); + + $selector = new SmsRecipientSelector(mts_only_router(), new OperatorNormalizer); + $plan = $selector->build(['79990000011']); + + expect($plan->sendable)->toBeEmpty() + ->and($plan->skipped)->toBe(['79990000011' => SalesSmsMessage::SKIP_NO_ROUTE]); +}); + +it('при двух каналах чужой оператор уходит на универсал, МТС — на МТС', function () { + $n = new OperatorNormalizer; + expect(two_channel_router()->pick($n->canonical('ПАО "МТС"'))?->key())->toBe('mts') + ->and(two_channel_router()->pick($n->canonical('МегаФон'))?->key())->toBe('smsc'); });