test: починка харнеса AdminBilling и AdminIncidents
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 <noreply@anthropic.com>
This commit is contained in:
@@ -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).
|
||||
});
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user