test(смс): усилить проверку нормализации оператора (роутер только-МТС ловит отсутствие защиты)

This commit is contained in:
Дмитрий
2026-07-23 12:34:02 +03:00
parent 7e0b7a608d
commit 1acf32a591
@@ -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');
});