88ace4e3d9
Accessibility (Pa11y live) / a11y (push) Has been cancelled
Снижение остатка 19 to 5. Всё тест-сторона: - PdErasureServiceTest + AdminPdSubjectRequestsControllerTest: SharesSupplierPdo — перестали коммитить pd_processing_log через pgsql_supplier, что ломало глобальный audit:verify-chains (6 падений) и амплифицировало PhoneRegionSmoke. - ReportFileDeletePdLogTest: SharesSupplierPdo — cron reports:cleanup-expired теперь видит незакоммиченные job'ы теста. - AdminSuppliersControllerTest: устойчивый ассерт (с фазы 3 в suppliers есть direct). - AuthLogCoverageTest/AuthFlowIntegrationTest: новый флоу самозаписи G1/SP1 — register_success пишется после confirm-email; добавлен шаг подтверждения. - ImpersonationTest end: verify (G7-B) ставит маркер impersonation → admin-зона закрыта by design; помечаем токен used напрямую вместо session-takeover. - CleanupInactiveSupplierProjectsJobTest: phase A читает pivot project_supplier_links — добавлена привязка linkProjectToSupplier (раньше был только legacy FK). - Pint-нормализация uses() FQN to import в ранее тронутых файлах. Остаток 5 (НЕ слепой патч): webhook B-префикс ×2 (решение владельца), advisory-lock audit-цепочки (возможный дрейф схемы, флажок), SupplierConnection WARN#2 (cap-3, поведенческое), SupplierPortalClientTest (пре-существующий, не от этих правок). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
54 lines
2.7 KiB
PHP
54 lines
2.7 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace Tests\Concerns;
|
||
|
||
use Illuminate\Database\Connection;
|
||
use Illuminate\Support\Facades\DB;
|
||
|
||
/**
|
||
* Share PDO between pgsql и pgsql_supplier connections в тестах.
|
||
*
|
||
* Зачем: Laravel DatabaseTransactions trait оборачивает каждый connection в
|
||
* свою транзакцию. Записи через default Project::factory() ($pgsql) не видны
|
||
* с pgsql_supplier connection до commit'а. Sharing PDO означает — обе
|
||
* connection'ы используют ту же PDO session → одну транзакцию.
|
||
*
|
||
* На production обе connection'ы реальные separate PDO, и видимость
|
||
* обеспечивается READ COMMITTED после commit'а webhook-handler'а перед
|
||
* dispatch'ом supplier-flow job'а. Этот trait — только для test-окружения.
|
||
*
|
||
* Использование: `uses(SharesSupplierPdo::class)` в Pest test-файле, где
|
||
* нужна cross-connection visibility (например, tests/Feature/Supplier/*).
|
||
*/
|
||
trait SharesSupplierPdo
|
||
{
|
||
protected function setUpSharesSupplierPdo(): void
|
||
{
|
||
if (! config()->has('database.connections.pgsql_supplier')) {
|
||
return;
|
||
}
|
||
|
||
$defaultConnection = DB::connection('pgsql');
|
||
$supplierConnection = DB::connection('pgsql_supplier');
|
||
$supplierConnection->setPdo($defaultConnection->getPdo());
|
||
$supplierConnection->setReadPdo($defaultConnection->getReadPdo());
|
||
|
||
// Шарим не только PDO, но и уровень вложенности транзакции. DatabaseTransactions
|
||
// уже открыл транзакцию на pgsql (этот же PDO) к моменту setUp этого трейта.
|
||
// Без синхронизации supplier-connection считает transactions=0 и при
|
||
// DB::connection('pgsql_supplier')->transaction() зовёт PDO->beginTransaction()
|
||
// на уже активной транзакции → PDOException "There is already an active transaction"
|
||
// (например AdminIncidentsController::notifyRkn). С синхронизацией вложенный
|
||
// transaction() делает SAVEPOINT внутри внешней транзакции (Postgres поддерживает),
|
||
// запись видна последующим чтениям и откатывается общим rollback'ом в teardown.
|
||
$level = $defaultConnection->transactionLevel();
|
||
if ($level > 0) {
|
||
$prop = new \ReflectionProperty(Connection::class, 'transactions');
|
||
$prop->setAccessible(true);
|
||
$prop->setValue($supplierConnection, $level);
|
||
}
|
||
}
|
||
}
|