- Add SqliteDatabase.exec() using better-sqlite3 exec() so the migrator can run multi-statement SQL files (prepare() rejected 001_initial.sql) - Migrator now uses exec() for migration file content - Fix tests/helpers/db.ts: replace CJS require() with ESM import - Add unit tests for SqliteDatabase (query/get/execute/transaction/exec, WAL & foreign_keys pragmas) and Migrator (ordering, idempotency, rollback, real 001_initial.sql applies) - Restore .gitignore steering exclusion; remove stale steering files
46 lines
1.2 KiB
TypeScript
46 lines
1.2 KiB
TypeScript
import os from 'node:os';
|
|
import fs from 'node:fs';
|
|
import path from 'node:path';
|
|
import { SqliteDatabase } from '@/lib/db/sqlite';
|
|
import { Migrator } from '@/lib/db/migrator';
|
|
|
|
let counter = 0;
|
|
|
|
/**
|
|
* テスト用の一時SQLite DBを作成する。
|
|
* 実DB(一時ファイル)を使用し、テスト終了時に自動削除される。
|
|
*/
|
|
export function createTestDb(): SqliteDatabase {
|
|
const tmpDir = os.tmpdir();
|
|
const dbPath = path.join(
|
|
tmpDir,
|
|
`test-${process.pid}-${Date.now()}-${counter++}.db`
|
|
);
|
|
const db = new SqliteDatabase(dbPath);
|
|
|
|
const originalClose = db.close.bind(db);
|
|
db.close = () => {
|
|
originalClose();
|
|
if (fs.existsSync(dbPath)) {
|
|
fs.unlinkSync(dbPath);
|
|
}
|
|
const walPath = `${dbPath}-wal`;
|
|
const shmPath = `${dbPath}-shm`;
|
|
if (fs.existsSync(walPath)) fs.unlinkSync(walPath);
|
|
if (fs.existsSync(shmPath)) fs.unlinkSync(shmPath);
|
|
};
|
|
|
|
return db;
|
|
}
|
|
|
|
/**
|
|
* マイグレーション済みのテスト用DBを作成する
|
|
*/
|
|
export function createMigratedTestDb(): SqliteDatabase {
|
|
const db = createTestDb();
|
|
const migrationsDir = path.join(process.cwd(), 'lib', 'db', 'migrations');
|
|
const migrator = new Migrator(db, migrationsDir);
|
|
migrator.migrate();
|
|
return db;
|
|
}
|