Files
portal/app/tests/Feature/Advertising/AdWalletGrantsTest.php
T

63 lines
3.3 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\DB;
/**
* Сторож прав рабочей роли на СЧЁТЧИКИ рекламного кошелька.
*
* Зачем он появился (приёмка Этапа 5, 01.08.2026). В Этапе 4 нашли, что у рабочей
* роли нет права на счётчик номеров таблицы заморозок `ad_wallet_holds_id_seq`, и
* заморозка денег под боевой ролью не проходила ВОВСЕ — «нет доступа к
* последовательности» (журнал В-190). Тогда стенд починили руками и переписали
* памятку выката.
*
* Приёмка Этапа 5 проверила это на базе, собранной ТОЛЬКО миграциями — то есть на
* точной модели того, что получит боевой после выката, — и права там снова НЕТ.
* Починка жила лишь в памятке и в голове человека.
*
* Цена промаха денежная и широкая: заморозка делается при КАЖДОМ заказе рассылки,
* при заказе имени отправителя и при запуске рекламной кампании Яндекса. Забыли шаг
* памятки — сломалось всё это разом.
*
* Проверяется не текст миграции, а результат: реально ли роль может пользоваться
* счётчиком. Право на таблицу счётчик НЕ покрывает — это разные права.
*
* ⚠️ Честное ограничение: доказывает это только там, где роли заведены
* (`db/00_create_roles.sql`). Где ролей нет — тест пропускается и не доказывает ничего.
*/
uses(RefreshDatabase::class);
function adWalletRoleExists(string $role): bool
{
return DB::selectOne('SELECT 1 AS ok FROM pg_roles WHERE rolname = ?', [$role]) !== null;
}
it('у рабочей роли есть право пользоваться счётчиками рекламного кошелька', function () {
if (! adWalletRoleExists('crm_app_user')) {
$this->markTestSkipped('Рабочей роли на этой базе нет — проверять нечего.');
}
$sequences = DB::select(<<<'SQL'
SELECT sequencename FROM pg_sequences
WHERE schemaname = 'public' AND sequencename LIKE 'ad\_wallet%'
ORDER BY sequencename
SQL);
expect($sequences)->not->toBeEmpty();
foreach ($sequences as $row) {
$granted = DB::selectOne(
'SELECT has_sequence_privilege(?, ?, ?) AS ok',
['crm_app_user', $row->sequencename, 'USAGE'],
)->ok;
expect($granted)->toBeTrue(
"Рабочей роли не выдано право на счётчик {$row->sequencename}"
.'заморозка денег под боевой ролью не пройдёт'
);
}
});