From d0bd54636cd90dd4776c8a7036ee3c33c4a4392e Mon Sep 17 00:00:00 2001 From: Andrew Valleteau Date: Tue, 4 Mar 2025 09:54:58 +0100 Subject: [PATCH] chore(pg-meta): migrate table-privileges tests (#33506) * chore(pg-meta): port functions tests * chore: add new test for CURRENT arg creation * chore: revert query style change * chore: restore PGFunction type inference * wip: remove type cast int8 on arg_types * Revert "wip: remove type cast int8 on arg_types" This reverts commit 6878a93bfbc8c4a87f5dd36d5a1ed13381760d85. * wip: make tests work with both clients * chore: use pg and type parser * chore: use only pg * chore: migrate table-privileges tests --- .../pg-meta/test/table-privileges.test.ts | 389 ++++++++++++++++++ 1 file changed, 389 insertions(+) create mode 100644 packages/pg-meta/test/table-privileges.test.ts diff --git a/packages/pg-meta/test/table-privileges.test.ts b/packages/pg-meta/test/table-privileges.test.ts new file mode 100644 index 00000000000..7bf065d28ad --- /dev/null +++ b/packages/pg-meta/test/table-privileges.test.ts @@ -0,0 +1,389 @@ +import { expect, test, beforeAll, afterAll } from 'vitest' +import pgMeta from '../src/index' +import { createTestDatabase, cleanupRoot } from './db/utils' + +beforeAll(async () => { + // Any global setup if needed +}) + +afterAll(async () => { + await cleanupRoot() +}) + +const withTestDatabase = ( + name: string, + fn: (db: Awaited>) => Promise +) => { + test(name, async () => { + const db = await createTestDatabase() + try { + await fn(db) + } finally { + await db.cleanup() + } + }) +} + +withTestDatabase('list table privileges', async ({ executeQuery }) => { + const { sql, zod } = await pgMeta.tablePrivileges.list() + const res = zod.parse(await executeQuery(sql)) + + expect( + res.find(({ schema, name }) => schema === 'public' && name === 'todos') + ).toMatchInlineSnapshot( + { relation_id: expect.any(Number) }, + ` + { + "kind": "table", + "name": "todos", + "privileges": [ + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "INSERT", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "SELECT", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "UPDATE", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "DELETE", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "TRUNCATE", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "REFERENCES", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "TRIGGER", + }, + ], + "relation_id": Any, + "schema": "public", + } + ` + ) +}) + +withTestDatabase('revoke & grant table privileges', async ({ executeQuery }) => { + // Get initial table privileges + const { sql: listSql, zod: listZod } = await pgMeta.tablePrivileges.list() + const listRes = listZod.parse(await executeQuery(listSql)) + const { relation_id } = listRes.find( + ({ schema, name }) => schema === 'public' && name === 'todos' + )! + + // Revoke all privileges + const { sql: revokeSql } = pgMeta.tablePrivileges.revoke([ + { + relationId: relation_id, + grantee: 'postgres', + privilegeType: 'ALL', + }, + ]) + await executeQuery(revokeSql) + + // Verify privileges were revoked + const { sql: retrieveSql, zod: retrieveZod } = await pgMeta.tablePrivileges.retrieve({ + id: relation_id, + }) + let privs = retrieveZod.parse((await executeQuery(retrieveSql))[0]) + expect(privs).toMatchInlineSnapshot( + { relation_id: expect.any(Number) }, + ` + { + "kind": "table", + "name": "todos", + "privileges": [], + "relation_id": Any, + "schema": "public", + } + ` + ) + + // Grant all privileges back + const { sql: grantSql } = pgMeta.tablePrivileges.grant([ + { + relationId: relation_id, + grantee: 'postgres', + privilegeType: 'ALL', + }, + ]) + await executeQuery(grantSql) + + // Verify privileges were granted + const { sql: verifyGrantSql } = await pgMeta.tablePrivileges.retrieve({ id: relation_id }) + privs = retrieveZod.parse((await executeQuery(verifyGrantSql))[0]) + expect(privs).toMatchInlineSnapshot( + { relation_id: expect.any(Number) }, + ` + { + "kind": "table", + "name": "todos", + "privileges": [ + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "TRIGGER", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "REFERENCES", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "TRUNCATE", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "DELETE", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "UPDATE", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "SELECT", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "INSERT", + }, + ], + "relation_id": Any, + "schema": "public", + } + ` + ) +}) + +withTestDatabase( + 'revoke & grant table privileges w/ quoted table name', + async ({ executeQuery }) => { + // Create test role and schema + await executeQuery(`create role r; create schema "s 1"; create table "s 1"."t 1"();`) + + // Get table privileges + const { sql: listSql, zod: listZod } = await pgMeta.tablePrivileges.list() + const listRes = listZod.parse(await executeQuery(listSql)) + const { relation_id } = listRes.find(({ schema, name }) => schema === 's 1' && name === 't 1')! + + // Grant all privileges + const { sql: grantSql } = pgMeta.tablePrivileges.grant([ + { + relationId: relation_id, + grantee: 'r', + privilegeType: 'ALL', + }, + ]) + await executeQuery(grantSql) + + // Verify privileges were granted + const { sql: retrieveSql, zod: retrieveZod } = await pgMeta.tablePrivileges.retrieve({ + id: relation_id, + }) + let privs = retrieveZod.parse((await executeQuery(retrieveSql))[0]) + expect(privs).toMatchInlineSnapshot( + { relation_id: expect.any(Number) }, + ` + { + "kind": "table", + "name": "t 1", + "privileges": [ + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "TRIGGER", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "REFERENCES", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "TRUNCATE", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "DELETE", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "UPDATE", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "SELECT", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "INSERT", + }, + { + "grantee": "r", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "TRIGGER", + }, + { + "grantee": "r", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "REFERENCES", + }, + { + "grantee": "r", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "TRUNCATE", + }, + { + "grantee": "r", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "DELETE", + }, + { + "grantee": "r", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "UPDATE", + }, + { + "grantee": "r", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "SELECT", + }, + { + "grantee": "r", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "INSERT", + }, + ], + "relation_id": Any, + "schema": "s 1", + } + ` + ) + + // Revoke all privileges + const { sql: revokeSql } = pgMeta.tablePrivileges.revoke([ + { + relationId: relation_id, + grantee: 'r', + privilegeType: 'ALL', + }, + ]) + await executeQuery(revokeSql) + + // Verify privileges were revoked + const { sql: verifyRevokeSql } = await pgMeta.tablePrivileges.retrieve({ id: relation_id }) + privs = retrieveZod.parse((await executeQuery(verifyRevokeSql))[0]) + expect(privs).toMatchInlineSnapshot( + { relation_id: expect.any(Number) }, + ` + { + "kind": "table", + "name": "t 1", + "privileges": [ + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "TRIGGER", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "REFERENCES", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "TRUNCATE", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "DELETE", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "UPDATE", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "SELECT", + }, + { + "grantee": "postgres", + "grantor": "postgres", + "is_grantable": false, + "privilege_type": "INSERT", + }, + ], + "relation_id": Any, + "schema": "s 1", + } + ` + ) + } +)