Зачем: аудит показал, что 156 зелёных тестов на fakeDatabase не заметили, что создание сотрудника, подтверждение смены и расчёт зарплаты всегда падают на реальной PostgreSQL. Чтобы тесты и CI проверяли реальный SQL, нужен воспроизводимый стенд с ролями как в pilot, но с минимальными привилегиями: - scripts/test/provision-pg.mjs: bootstrap-админ (только как DBA/entrypoint) создаёт krona_migrator (NOSUPERUSER NOCREATEDB NOCREATEROLE, владелец БД и схемы public) и krona_staff_app (NOSUPERUSER NOBYPASSRLS NOINHERIT); пароли crypto.randomBytes, пишутся только в env-файл 0600, в вывод не попадают. scripts/create-app-role.mjs здесь не используется, т.к. без SUPERUSER он падает (находка N6, продуктовый код не трогаем). - scripts/test/migrate-roundtrip.mjs: up -> откат всех миграций -> up -> повторный up должен быть no-op; ролью мигратора, как требует AGENTS.md. Проверено на PostgreSQL 17.11: 11 миграций применены, откачены, применены повторно, третий up пустой.
30 lines
1.2 KiB
Text
30 lines
1.2 KiB
Text
== DATABASE_TEST_URL=<krona_staff_app@127.0.0.1:55433/krona_staff_e2e> npx vitest run tests/integration/tenant-isolation.test.ts (база 778ba2d, до исправления)
|
||
|
||
RUN v5.0.1 /workspace/krona-staff
|
||
|
||
❯ tests/integration/tenant-isolation.test.ts (1 test) 114ms
|
||
|
||
⎯⎯⎯⎯⎯⎯ Failed Suites 1 ⎯⎯⎯⎯⎯⎯⎯
|
||
|
||
FAIL tests/integration/tenant-isolation.test.ts > PostgreSQL tenant isolation
|
||
error: permission denied for table staff_employees
|
||
❯ node_modules/pg/lib/client.js:694:17
|
||
❯ tests/integration/tenant-isolation.test.ts:40:7
|
||
38| await client.query('DELETE FROM staff_outbox WHERE id = $1', [ev…
|
||
39| await client.query('DELETE FROM staff_professions WHERE id = $1'…
|
||
40| await client.query('DELETE FROM staff_employees WHERE id = $1', …
|
||
| ^
|
||
41| });
|
||
42| await database.close();
|
||
❯ Database.tenantTransaction src/infrastructure/database.ts:30:22
|
||
❯ tests/integration/tenant-isolation.test.ts:31:5
|
||
|
||
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯
|
||
|
||
|
||
Test Files 1 failed (1)
|
||
Tests 1 passed (1)
|
||
Start at 14:20:47
|
||
Duration 265ms (tests 62%, transform 23%, import 14%, worker 1%)
|
||
|
||
exit=1
|