Corrige os testes de RLS e auditoria contra PostgreSQL real
ci / lint, typecheck, testes e build (push) Has been cancelled
ci / Postgres e Redis reais (push) Has been cancelled
ci / imagem Docker Linux (push) Has been cancelled

A verificação de FORCE RLS lia pg_class sem filtrar relkind e pegava
índices como spreadsheet_adapter_settings_pkey, que nunca têm RLS. Agora
lê só tabelas (r/p) do schema public e compara com a lista exata das dez
tabelas protegidas pela 0003_rls.sql.

O teste de auditoria reutilizava $1 como uuid (workspace_id) e text
(resource_id), e o Postgres recusava antes de testar a permissão. Cada
coluna tem seu parâmetro e o teste exige o código 42501 em update e
delete, confirmando que o registro continua intacto.

Regressão do catálogo de RLS também roda na suíte padrão (PGlite).
Nenhuma migration, política ou permissão foi alterada.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
camilafagundesandClaude Opus 5.5 committed 2026-10-16 14:06:47 -03:00
1 parent b8586ba0aa
commit 84ad5c4757
3 files changed
+75 -12

No files matched your search

+13
View File
@@ -1,6 +1,7 @@
import { describe, expect, it } from "vitest";
import { createModel } from "@/server/spreadsheet-adapter/service";
import { ctxOf, createReadyDb, depsOf, IDS } from "../helpers/world";
import { readRlsCatalog, RLS_TABLES } from "../helpers/rls-catalog";
describe("RLS e permissões", () => {
it("impede leitura e escrita entre workspaces", async () => {
@@ -71,4 +72,16 @@ describe("RLS e permissões", () => {
expect(rows.every((row) => row.action !== "tamper")).toBe(true);
await db.close();
});
it("verifica RLS e FORCE RLS só em tabelas, nunca em índices", async () => {
const db = await createReadyDb();
const rows = await db.withService(readRlsCatalog);
expect(rows.map((row) => row.relname)).toEqual([...RLS_TABLES]);
expect(rows.some((row) => row.relname.endsWith("_pkey"))).toBe(false);
for (const row of rows) {
expect(row.relrowsecurity, `${row.relname} sem RLS`).toBe(true);
expect(row.relforcerowsecurity, `${row.relname} sem FORCE RLS`).toBe(true);
}
await db.close();
});
});