fix: final polish — teardown, image pin, license

This commit is contained in:
smartass
2026-06-12 00:49:58 +05:00
parent 7f0b66b18d
commit 5e841e4956
9 changed files with 180 additions and 48 deletions
+34 -15
View File
@@ -8,11 +8,14 @@ import { createRegistry } from '../../src/config/registry.js'
import type { Manager } from '../../src/db/manager.js'
import { createManager } from '../../src/db/manager.js'
// Ordering contract: vitest runs in-file `it` blocks sequentially in
// declaration order, and these tests share tables across blocks by design
// (e.g. `users` created early is read by later cases). Do not reorder.
describe('postgres integration', () => {
let container: StartedPostgreSqlContainer
let dir: string
let container: StartedPostgreSqlContainer | undefined
let dir: string | undefined
let registry: Registry
let manager: Manager
let manager: Manager | undefined
beforeAll(async () => {
container = await new PostgreSqlContainer('postgres:17-alpine').start()
@@ -42,13 +45,29 @@ describe('postgres integration', () => {
})
afterAll(async () => {
await manager.disposeAll()
await container.stop()
rmSync(dir, { recursive: true, force: true })
await manager?.disposeAll().catch(() => {})
await container?.stop().catch(() => {})
if (dir) {
rmSync(dir, { recursive: true, force: true })
}
})
const db = (): Manager => {
if (!manager) {
throw new Error('setup failed: manager not initialized')
}
return manager
}
const pg = (): StartedPostgreSqlContainer => {
if (!container) {
throw new Error('setup failed: container not initialized')
}
return container
}
it('runs DDL, DML and SELECT with params', async () => {
const { driver } = await manager.get('pg')
const { driver } = await db().get('pg')
await driver.query({
sql: 'CREATE TABLE users (id serial PRIMARY KEY, name text NOT NULL)',
rowLimit: 10
@@ -68,7 +87,7 @@ describe('postgres integration', () => {
})
it('truncates SELECT results at rowLimit', async () => {
const { driver } = await manager.get('pg')
const { driver } = await db().get('pg')
const result = await driver.query({
sql: 'SELECT generate_series(1, 10)',
rowLimit: 3
@@ -78,7 +97,7 @@ describe('postgres integration', () => {
})
it('rejects multi-statement and session-level sql', async () => {
const { driver } = await manager.get('pg')
const { driver } = await db().get('pg')
await expect(driver.query({ sql: 'SELECT 1; SELECT 2', rowLimit: 10 })).rejects.toThrow(
/one SQL statement/
)
@@ -86,9 +105,9 @@ describe('postgres integration', () => {
})
it('lists databases, tables and describes a table', async () => {
const { driver } = await manager.get('pg')
const { driver } = await db().get('pg')
const databases = await driver.listDatabases()
expect(databases.map((d) => d.name)).toContain(container.getDatabase())
expect(databases.map((d) => d.name)).toContain(pg().getDatabase())
const tables = await driver.listTables({})
expect(tables).toContainEqual(expect.objectContaining({ schema: 'public', name: 'users' }))
@@ -123,7 +142,7 @@ describe('postgres integration', () => {
})
it('describes composite foreign keys with paired columns', async () => {
const { driver } = await manager.get('pg')
const { driver } = await db().get('pg')
await driver.query({
sql: `CREATE TABLE parents (
a integer NOT NULL,
@@ -149,12 +168,12 @@ describe('postgres integration', () => {
})
it('describe_table of a missing table fails clearly', async () => {
const { driver } = await manager.get('pg')
const { driver } = await db().get('pg')
await expect(driver.describeTable({ table: 'ghost' })).rejects.toThrow(/not found/)
})
it('enforces readonly: INSERT and DDL fail, SELECT works', async () => {
const { driver } = await manager.get('pg-ro')
const { driver } = await db().get('pg-ro')
const select = await driver.query({ sql: 'SELECT count(*) FROM users', rowLimit: 10 })
expect(select.rows[0][0]).toBe('2')
await expect(
@@ -166,7 +185,7 @@ describe('postgres integration', () => {
})
it('reports server version', async () => {
const { driver } = await manager.get('pg')
const { driver } = await db().get('pg')
expect(await driver.serverVersion()).toMatch(/^17\./)
})
})