400]); } function mts_message(): SmsOutgoing { return new SmsOutgoing( phone: '79990000001', body: 'Здравствуйте!', senderName: 'liderra.ru', operator: 'МТС', segments: 1, ); } it('обслуживает только МТС', function () { expect(mts_provider()->servesOperators())->toBe(['mts']) ->and(mts_provider()->key())->toBe('mts'); }); it('успешная отправка возвращает id и цену', function () { Http::fake(['api.exolve.ru/*' => Http::response(['message_id' => 'abc-1'], 200)]); $result = mts_provider()->send(mts_message()); expect($result->providerMessageId)->toBe('abc-1') ->and($result->costKopecks)->toBe(400); }); it('отказ 4xx — terminal', function () { Http::fake(['api.exolve.ru/*' => Http::response(['error' => 'bad request'], 400)]); try { mts_provider()->send(mts_message()); $this->fail('ожидалось SmsSendException'); } catch (SmsSendException $e) { expect($e->terminal)->toBeTrue(); } }); it('сбой 5xx — не terminal', function () { Http::fake(['api.exolve.ru/*' => Http::response('', 503)]); try { mts_provider()->send(mts_message()); $this->fail('ожидалось SmsSendException'); } catch (SmsSendException $e) { expect($e->terminal)->toBeFalse(); } });