test(смс): усилить проверку нормализации оператора (роутер только-МТС ловит отсутствие защиты)
This commit is contained in:
@@ -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');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user