From 23f81bdaf39f424e985ba84bf0e488a6b7800a34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 18 Jun 2026 09:05:06 +0300 Subject: [PATCH] =?UTF-8?q?test:=20=D0=BF=D0=BE=D1=87=D0=B8=D0=BD=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=85=D0=B0=D1=80=D0=BD=D0=B5=D1=81=D0=B0=20AdminBill?= =?UTF-8?q?ing=20=D0=B8=20AdminIncidents?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AdminBillingIndexTest: teardown глушит session-триггеры на время очистки. DELETE tenants каскадил в append-only tenant_operations_log, триггер audit_block_mutation давал RAISE EXCEPTION. Плюс ensureRange гарантирует месячные партиции balance_transactions за прошлые 2 месяца под SharesSupplierPdo. AdminIncidentsIndexTest: добавлен трейт SharesSupplierPdo. Контроллер читает через pgsql_supplier, тест писал через дефолтный pgsql под DatabaseTransactions, cross-connection невидимость давала total=0. Verify: оба класса 20 из 20 green. Co-Authored-By: Claude Opus 4.8 --- app/tests/Feature/AdminBillingIndexTest.php | 26 +++++++++++++++++++ app/tests/Feature/AdminIncidentsIndexTest.php | 5 ++++ 2 files changed, 31 insertions(+) diff --git a/app/tests/Feature/AdminBillingIndexTest.php b/app/tests/Feature/AdminBillingIndexTest.php index 45d6a2f6..df59dc79 100644 --- a/app/tests/Feature/AdminBillingIndexTest.php +++ b/app/tests/Feature/AdminBillingIndexTest.php @@ -3,14 +3,40 @@ declare(strict_types=1); use App\Models\Tenant; +use App\Services\MonthlyPartitionManager; use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Support\Facades\DB; +use Tests\Concerns\SharesSupplierPdo; uses(DatabaseTransactions::class); +// ensureRange() ниже создаёт партиции через pgsql_supplier (DDL_CONNECTION); +// SharesSupplierPdo держит этот коннект в той же test-транзакции, иначе DDL +// уйдёт мимо отката (см. MonthlyPartitionManager doc + trait doc). +uses(SharesSupplierPdo::class); beforeEach(function () { + // tenants → tenant_operations_log / balance_transactions идут ON DELETE CASCADE, + // но это append-only таблицы (триггер audit_block_mutation на BEFORE DELETE): + // каскад от DELETE tenants → DELETE в append-only лог → RAISE EXCEPTION. + // Глушим session-триггеры на время teardown'а (весь блок внутри отката + // DatabaseTransactions). Test-роль — superuser (dev/CI postgres), см. + // config/database.php pgsql_supplier note. + DB::statement("SET session_replication_role = 'replica'"); DB::table('balance_transactions')->delete(); + DB::table('tenant_operations_log')->delete(); DB::table('tenants')->delete(); + DB::statement("SET session_replication_role = 'origin'"); + + // Тесты вставляют balance_transactions за прошлые месяцы (subMonths(2), + // subDays(45)) — гарантируем месячные партиции на этот диапазон, иначе + // INSERT падает «не найдена секция» (23514). Идемпотентно; партиции + // откатываются с тестовой транзакцией. + app(MonthlyPartitionManager::class)->ensureRange( + 'balance_transactions', + now()->subMonths(2)->startOfMonth(), + now()->startOfMonth(), + ); + // tariff_plans оставляем (seeded). }); diff --git a/app/tests/Feature/AdminIncidentsIndexTest.php b/app/tests/Feature/AdminIncidentsIndexTest.php index 5b3a813f..35febd43 100644 --- a/app/tests/Feature/AdminIncidentsIndexTest.php +++ b/app/tests/Feature/AdminIncidentsIndexTest.php @@ -4,8 +4,13 @@ declare(strict_types=1); use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Support\Facades\DB; +use Tests\Concerns\SharesSupplierPdo; uses(DatabaseTransactions::class); +// AdminIncidentsController читает через DB::connection('pgsql_supplier'); под +// DatabaseTransactions записи дефолтного pgsql невидимы отдельному PDO supplier'а +// → total=0. Трейт шарит один PDO между коннектами (откат сохраняется). +uses(SharesSupplierPdo::class); beforeEach(function () { DB::table('incidents_log')->delete();