Files
portal/app/tests/Feature/AdminIncidentRknNotifyTest.php
T
Дмитрий 2ec70b338f
Accessibility (Pa11y live) / a11y (push) Has been cancelled
test: оздоровление тест-стенда — изоляция протекателей плюс фикстуры, партиции, видимость supplier-коннекта
Закрыто 36 из 55 пре-существующих падений backend-набора (55 to 19), всё тест-сторона,
код продукта не тронут. Группы:
- incident-показ/РКН: добавлен SharesSupplierPdo + синхрон уровня транзакции в трейте
  (вложенный transaction на общем PDO теперь делает SAVEPOINT, не повторный BEGIN).
- auto-pause и lead-delivery: тесты создают project_routing_snapshots, от которого
  зависит выбор кандидатов в LeadRouter (slepok-инвариант).
- изоляция 16 протекающих тестов: добавлен DatabaseTransactions (где нужно плюс
  SharesSupplierPdo) — перестали оставлять committed-строки, отравлявшие глобально
  сканирующие тесты (snapshot, verify-audit, size-N).
- partition time-bombs: ensureRange месячных партиций для тестов на дату 2026-05.
- устаревшие ассерты: SchemaDelta метрики v8.35 to v8.52, ProjectsStore телефон 8 to 7
  нормализуется, incidents-watch фильтр активного admin, register captcha_token,
  impersonation активный юзер тенанта, activity_log.deal_id, ProjectUpdateDedup пауза.

Остаток 19 (отдельно): verify-audit-chains и size-N (протекатели audit-строк),
webhook B-префикс (решение владельца), пара env/каскадных.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 07:39:51 +03:00

67 lines
2.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
declare(strict_types=1);
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\DB;
use Tests\Concerns\SharesSupplierPdo;
uses(DatabaseTransactions::class);
// AdminIncidentsController читает incidents_log через DB::connection('pgsql_supplier');
// под DatabaseTransactions записи дефолтного pgsql невидимы отдельному PDO supplier'а
// → notifyRkn() abort(404). Трейт шарит один PDO между коннектами (откат сохраняется).
uses(SharesSupplierPdo::class);
beforeEach(function () {
DB::table('incidents_log')->delete();
$this->adminId = (int) DB::table('saas_admin_users')->insertGetId([
'email' => 'rkn-'.bin2hex(random_bytes(3)).'@test',
'full_name' => 'RKN Admin',
'password_hash' => bcrypt('test1234'),
'is_active' => true,
'role' => 'support',
'created_at' => now(),
]);
});
function makeRknIncident(int $adminId, array $overrides = []): int
{
$started = $overrides['started_at'] ?? now()->subHours(2);
return (int) DB::table('incidents_log')->insertGetId(array_merge([
'type' => 'data_breach',
'severity' => 'critical',
'started_at' => $started,
'detected_at' => $started,
'summary' => 'PDN leak test',
'created_by_admin_id' => $adminId,
'created_at' => now(),
], $overrides));
}
test('POST rkn-notify проставляет rkn_notified_at + audit-log', function () {
$id = makeRknIncident($this->adminId);
$r = $this->postJson("/api/admin/incidents/{$id}/rkn-notify");
$r->assertOk();
expect($r->json('incident.rkn_notified'))->toBeTrue();
expect($r->json('incident.rkn_notified_at'))->toBeString();
expect(DB::table('incidents_log')->where('id', $id)->value('rkn_notified_at'))->not->toBeNull();
expect(DB::table('saas_admin_audit_log')->where('action', 'incident.rkn_notify')->where('target_id', $id)->exists())
->toBeTrue();
});
test('POST rkn-notify несуществующий инцидент → 404', function () {
$this->postJson('/api/admin/incidents/99999999/rkn-notify')->assertStatus(404);
});
test('POST rkn-notify не data_breach → 422', function () {
$id = makeRknIncident($this->adminId, ['type' => 'service_outage']);
$this->postJson("/api/admin/incidents/{$id}/rkn-notify")->assertStatus(422);
expect(DB::table('incidents_log')->where('id', $id)->value('rkn_notified_at'))->toBeNull();
});
test('POST rkn-notify повторно → 409', function () {
$id = makeRknIncident($this->adminId, ['rkn_notified_at' => now()->subHour()]);
$this->postJson("/api/admin/incidents/{$id}/rkn-notify")->assertStatus(409);
});