postJson('/api/admin/sms/global-optouts', [ 'phone' => '+7 900 111-22-33', 'reason' => 'жалоба через МТС', ])->assertStatus(201); $row = SmsGlobalOptout::find('79001112233'); expect($row)->not->toBeNull() ->and($row->reason)->toBe('жалоба через МТС'); }); test('номер принимается в любом виде — 8, +7, со скобками', function () { foreach (['8 (900) 111-22-44', '+79001112255', '9001112266'] as $raw) { $this->postJson('/api/admin/sms/global-optouts', ['phone' => $raw])->assertStatus(201); } expect(SmsGlobalOptout::whereIn('phone', ['79001112244', '79001112255', '79001112266'])->count()) ->toBe(3); }); test('непонятый номер отклоняется внятно, а не молча', function () { $this->postJson('/api/admin/sms/global-optouts', ['phone' => 'абырвалг']) ->assertStatus(422) ->assertJsonPath('message', 'Не понял номер телефона'); expect(SmsGlobalOptout::count())->toBe(0); }); test('повторное внесение того же номера не ломается и не плодит записей', function () { $this->postJson('/api/admin/sms/global-optouts', ['phone' => '79001112233', 'reason' => 'первая']) ->assertStatus(201); $this->postJson('/api/admin/sms/global-optouts', ['phone' => '79001112233', 'reason' => 'вторая']) ->assertStatus(201); expect(SmsGlobalOptout::where('phone', '79001112233')->count())->toBe(1) ->and(SmsGlobalOptout::find('79001112233')->reason)->toBe('первая'); }); test('владелец видит список внесённых номеров', function () { SmsGlobalOptout::create(['phone' => '79001112233', 'reason' => 'жалоба оператору']); SmsGlobalOptout::create(['phone' => '79001112244']); $r = $this->getJson('/api/admin/sms/global-optouts')->assertStatus(200); expect($r->json('total'))->toBe(2) ->and($r->json('items'))->toHaveCount(2); }); test('владелец убирает номер из общего стоп-листа', function () { SmsGlobalOptout::create(['phone' => '79001112233']); $this->deleteJson('/api/admin/sms/global-optouts/79001112233')->assertStatus(200); expect(SmsGlobalOptout::find('79001112233'))->toBeNull(); });