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
+33 -14
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('mysql integration', () => {
let container: StartedMySqlContainer
let dir: string
let container: StartedMySqlContainer | undefined
let dir: string | undefined
let registry: Registry
let manager: Manager
let manager: Manager | undefined
beforeAll(async () => {
container = await new MySqlContainer('mysql:8.4').start()
@@ -42,13 +45,29 @@ describe('mysql 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 my = (): StartedMySqlContainer => {
if (!container) {
throw new Error('setup failed: container not initialized')
}
return container
}
it('runs DDL, DML with lastInsertId and SELECT with params', async () => {
const { driver } = await manager.get('my')
const { driver } = await db().get('my')
await driver.query({
sql: 'CREATE TABLE users (id int AUTO_INCREMENT PRIMARY KEY, name varchar(64) NOT NULL)',
rowLimit: 10
@@ -69,7 +88,7 @@ describe('mysql integration', () => {
})
it('preserves BIGINT precision beyond 2^53', async () => {
const { driver } = await manager.get('my')
const { driver } = await db().get('my')
await driver.query({
sql: 'CREATE TABLE big (v bigint)',
rowLimit: 10
@@ -83,7 +102,7 @@ describe('mysql integration', () => {
})
it('rejects multi-statement and session-level sql', async () => {
const { driver } = await manager.get('my')
const { driver } = await db().get('my')
await expect(driver.query({ sql: 'SELECT 1; SELECT 2', rowLimit: 10 })).rejects.toThrow(
/one SQL statement/
)
@@ -93,9 +112,9 @@ describe('mysql integration', () => {
})
it('lists databases and tables, describes a table', async () => {
const { driver } = await manager.get('my')
const { driver } = await db().get('my')
const databases = await driver.listDatabases()
expect(databases.map((d) => d.name)).toContain(container.getDatabase())
expect(databases.map((d) => d.name)).toContain(my().getDatabase())
await driver.query({
sql: `CREATE TABLE orders (
@@ -127,12 +146,12 @@ describe('mysql integration', () => {
})
it('describe_table of a missing table fails clearly', async () => {
const { driver } = await manager.get('my')
const { driver } = await db().get('my')
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('my-ro')
const { driver } = await db().get('my-ro')
const select = await driver.query({ sql: 'SELECT count(*) FROM users', rowLimit: 10 })
expect(Number(select.rows[0][0])).toBe(2)
await expect(
@@ -144,7 +163,7 @@ describe('mysql integration', () => {
})
it('reports server version', async () => {
const { driver } = await manager.get('my')
const { driver } = await db().get('my')
expect(await driver.serverVersion()).toMatch(/^8\./)
})
})