400])]); } function two_channel_router(): SmsRouter { return new SmsRouter([ new SmscSmsProvider('l', 'p', ['*'], ['*' => 300]), new MtsSmsProvider('t', ['mts'], ['*' => 400]), ]); } it('сырое имя МТС от ДаДаты сматчивается на канал МТС ТОЛЬКО через нормализацию', function () { SalesAdAudiencePhone::create([ 'phone' => '79990000010', 'expires_at' => now()->addDays(30), 'state' => 'active', 'operator' => 'ПАО "МТС"', 'phone_type' => 'mobile', ]); // Роутер только-МТС: без нормализации 'ПАО "МТС"' не сматчится и номер уедет в skipped_no_route. $selector = new SmsRecipientSelector(mts_only_router(), new OperatorNormalizer); $plan = $selector->build(['79990000010']); expect($plan->sendable)->toHaveCount(1) ->and($plan->skipped)->toBeEmpty(); }); 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'); });