2026-07-27 17:17:20 +03:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
|
|
|
|
use App\Models\SmsGlobalOptout;
|
2026-07-28 11:42:37 +03:00
|
|
|
use App\Models\Tenant;
|
|
|
|
|
use App\Models\User;
|
2026-07-27 17:17:20 +03:00
|
|
|
use Illuminate\Database\QueryException;
|
|
|
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Общий стоп-лист портала (строка листа 1.4): номер, закрытый владельцем,
|
|
|
|
|
* перестаёт получать СМС у ВСЕХ клиентов сразу. Это защита договора с МТС,
|
|
|
|
|
* а не удобство одного клиента, — поэтому таблица общая, без изоляции по тенанту.
|
|
|
|
|
*/
|
|
|
|
|
uses(RefreshDatabase::class);
|
|
|
|
|
|
|
|
|
|
it('хранит номер в общем стоп-листе и находит его', function () {
|
|
|
|
|
SmsGlobalOptout::create([
|
|
|
|
|
'phone' => '79001112233',
|
|
|
|
|
'reason' => 'жалоба оператору',
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
expect(SmsGlobalOptout::where('phone', '79001112233')->exists())->toBeTrue();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('не допускает дубля номера', function () {
|
|
|
|
|
SmsGlobalOptout::create(['phone' => '79001112233']);
|
|
|
|
|
|
|
|
|
|
expect(fn () => SmsGlobalOptout::create(['phone' => '79001112233']))
|
|
|
|
|
->toThrow(QueryException::class);
|
|
|
|
|
});
|
|
|
|
|
|
2026-07-28 11:42:37 +03:00
|
|
|
it('хранит причину словами и дату', function () {
|
2026-07-27 17:17:20 +03:00
|
|
|
SmsGlobalOptout::create([
|
|
|
|
|
'phone' => '79001112244',
|
|
|
|
|
'reason' => 'жалоба абонента',
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$row = SmsGlobalOptout::find('79001112244');
|
|
|
|
|
|
|
|
|
|
expect($row->reason)->toBe('жалоба абонента')
|
2026-07-28 11:42:37 +03:00
|
|
|
->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('жалоба через МТС')
|
2026-07-27 17:17:20 +03:00
|
|
|
->and($row->created_at)->not->toBeNull();
|
|
|
|
|
});
|