fix: final polish — teardown, image pin, license
This commit is contained in:
@@ -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\./)
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user