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('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\./)
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user