Files
portal/app/tests/Unit/Sms/SmscSmsProviderTest.php
T

94 lines
3.2 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
use App\Services\Sms\Providers\SmscSmsProvider;
use App\Services\Sms\SmsOutgoing;
use App\Services\Sms\SmsSendException;
use Illuminate\Support\Facades\Http;
function smsc_provider(): SmscSmsProvider
{
return new SmscSmsProvider('login', 'secret', ['*'], ['*' => 300]);
}
function smsc_message(): SmsOutgoing
{
return new SmsOutgoing(
phone: '79990000001',
body: 'Здравствуйте!',
senderName: 'liderra.ru',
operator: 'МегаФон',
segments: 1,
);
}
it('обслуживает всех как универсал', function () {
expect(smsc_provider()->servesOperators())->toBe(['*'])
->and(smsc_provider()->key())->toBe('smsc');
});
/**
* С 05.08.2026 имя отправителя выбирается ПО ОПЕРАТОРУ получателя, и пустая
* строка означает «своего имени у клиента для этой сети нет — подпишись своим».
* Универсал же передавал имя КАК ЕСТЬ и ушёл бы с пустым отправителем.
*/
it('пустое имя заменяет своим согласованным', function () {
Http::fake(['smsc.ru/*' => Http::response(['id' => 777, 'cnt' => 1], 200)]);
$provider = new SmscSmsProvider('login', 'secret', ['*'], ['*' => 300], 'liderra.ru');
$provider->send(new SmsOutgoing(
phone: '79990000001',
body: 'Здравствуйте!',
senderName: '',
operator: 'МегаФон',
segments: 1,
));
Http::assertSent(fn ($request) => $request['sender'] === 'liderra.ru');
});
it('заданное имя клиента своим не подменяет', function () {
Http::fake(['smsc.ru/*' => Http::response(['id' => 778, 'cnt' => 1], 200)]);
$provider = new SmscSmsProvider('login', 'secret', ['*'], ['*' => 300], 'liderra.ru');
$provider->send(new SmsOutgoing(
phone: '79990000001',
body: 'Здравствуйте!',
senderName: 'mybrand.ru',
operator: 'МегаФон',
segments: 1,
));
Http::assertSent(fn ($request) => $request['sender'] === 'mybrand.ru');
});
it('успешная отправка возвращает id сообщения и цену по сегментам', function () {
Http::fake(['smsc.ru/*' => Http::response(['id' => 555, 'cnt' => 1], 200)]);
$result = smsc_provider()->send(smsc_message());
expect($result->providerMessageId)->toBe('555')
->and($result->costKopecks)->toBe(300);
});
it('отказ smsc.ru бросает terminal-исключение', function () {
Http::fake(['smsc.ru/*' => Http::response(['error' => 'invalid number', 'error_code' => 7], 200)]);
expect(fn () => smsc_provider()->send(smsc_message()))
->toThrow(SmsSendException::class);
});
it('сетевой сбой — не terminal (можно повторить)', function () {
Http::fake(['smsc.ru/*' => Http::response('', 500)]);
try {
smsc_provider()->send(smsc_message());
$this->fail('ожидалось SmsSendException');
} catch (SmsSendException $e) {
expect($e->terminal)->toBeFalse();
}
});