import { describe, it, expect, afterEach } from 'vitest' import { DatabaseSync } from 'node:sqlite' import { migrate } from '../../src/main/db/migrate' import schemaV1 from '../../src/main/db/schema-v1.sql?raw' import schemaV2 from '../../src/main/db/schema-v2.sql?raw' import schemaV3 from '../../src/main/db/schema-v3.sql?raw' import schemaV4 from '../../src/main/db/schema-v4.sql?raw' import type { SqliteDb } from '../../src/main/db/types' describe('migrate v5', () => { let db: SqliteDb afterEach(() => db?.close()) it('UT-MIG-05: applies v5 on fresh database', () => { db = new DatabaseSync(':memory:') migrate(db) const version = db.prepare('SELECT MAX(version) AS v FROM schema_version').get() as { v: number } expect(version.v).toBe(8) const cols = db.prepare('PRAGMA table_info(interactive_flows)').all() as { name: string }[] expect(cols.some((c) => c.name === 'flow_mode')).toBe(true) expect(cols.some((c) => c.name === 'mode_config_json')).toBe(true) }) it('migrates v4 database to v5', () => { db = new DatabaseSync(':memory:') db.exec(`CREATE TABLE IF NOT EXISTS schema_version ( version INTEGER PRIMARY KEY, applied_at TEXT NOT NULL DEFAULT (datetime('now')), description TEXT )`) db.exec(schemaV1) db.exec(schemaV2) db.exec(schemaV3) db.prepare('INSERT INTO schema_version (version) VALUES (1),(2),(3)').run() try { db.exec("ALTER TABLE chapters ADD COLUMN origin TEXT NOT NULL DEFAULT 'manual'") } catch { /* duplicate ok */ } db.exec(schemaV4) db.prepare('INSERT INTO schema_version (version) VALUES (4)').run() migrate(db) const version = db.prepare('SELECT MAX(version) AS v FROM schema_version').get() as { v: number } expect(version.v).toBe(8) }) })