'79001112233', 'reason' => 'жалоба оператору', ]); expect(SmsGlobalOptout::where('phone', '79001112233')->exists())->toBeTrue(); }); it('не допускает дубля номера', function () { SmsGlobalOptout::create(['phone' => '79001112233']); expect(fn () => SmsGlobalOptout::create(['phone' => '79001112233'])) ->toThrow(QueryException::class); }); it('хранит причину словами и дату', function () { SmsGlobalOptout::create([ 'phone' => '79001112244', 'reason' => 'жалоба абонента', ]); $row = SmsGlobalOptout::find('79001112244'); expect($row->reason)->toBe('жалоба абонента') ->and($row->created_at)->not->toBeNull(); }); /** * Графы «кто внёс» в общем стоп-листе нет намеренно (журнал В-72). Раньше она была, * и в неё попадал ЧУЖОЙ след: админ-зона не под замком Laravel, поэтому при открытом * в том же браузере обычном кабинете туда записывался id КЛИЕНТСКОГО пользователя — * значение, неотличимое от id администратора. Настоящего входа для админа нет (ждёт Б-1), * заполнять графу нечем, и пустая графа хуже отсутствующей. */ it('не записывает «кто внёс»: чужого следа в общем стоп-листе не остаётся', function () { $tenant = Tenant::factory()->create(); $user = User::factory()->create(['tenant_id' => $tenant->id]); $this->actingAs($user); $this->postJson('/api/admin/sms/global-optouts', [ 'phone' => '79995550777', 'reason' => 'жалоба через МТС', ])->assertStatus(201); $row = SmsGlobalOptout::find('79995550777'); expect($row->getAttributes())->not->toHaveKey('created_by') ->and($row->reason)->toBe('жалоба через МТС') ->and($row->created_at)->not->toBeNull(); });