From 1acf32a591e08e7dd93234b5a1bf42443f36058d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 23 Jul 2026 12:34:02 +0300 Subject: [PATCH] =?UTF-8?q?test(=D1=81=D0=BC=D1=81):=20=D1=83=D1=81=D0=B8?= =?UTF-8?q?=D0=BB=D0=B8=D1=82=D1=8C=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D1=83=20=D0=BD=D0=BE=D1=80=D0=BC=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B0=20(=D1=80=D0=BE=D1=83=D1=82=D0=B5=D1=80=20?= =?UTF-8?q?=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE-=D0=9C=D0=A2=D0=A1=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2=D0=B8=D1=82=20=D0=BE=D1=82=D1=81=D1=83=D1=82?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=B8=D0=B5=20=D0=B7=D0=B0=D1=89=D0=B8=D1=82?= =?UTF-8?q?=D1=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Feature/Sales/SmsOperatorRoutingTest.php | 41 ++++++++++++++----- 1 file changed, 31 insertions(+), 10 deletions(-) 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'); });