Files
portal/app/tests/Feature/Sales/SmsOperatorRoutingTest.php
T

64 lines
2.8 KiB
PHP

<?php
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;
use App\Services\Sms\SmsRecipientSelector;
use App\Services\Sms\SmsRouter;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Tests\Concerns\SharesSupplierPdo;
uses(DatabaseTransactions::class, SharesSupplierPdo::class);
/** Роутер ТОЛЬКО с каналом МТС — без универсала. Так нормализация становится
* нагруженной: сырое «ПАО "МТС"» пройдёт только если его привели к ключу '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]),
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');
});