/** * v0.1.14 生产硬化测试 * 覆盖:Memory 引擎幂等 init / IndexedDB flushToIDB 原子性 / onversionchange 监听 */ import { MemoryEngine } from '../src/engine/memory'; import { MetonaSqlark } from '../src/core'; let idbCounter = 0; function uniqueDB(): string { return `harden-${++idbCounter}`; } // =================================================================== // Memory 引擎幂等 init // =================================================================== describe('v0.1.14 幂等 init — MemoryEngine', () => { it('重复 open 不报错且状态不变', async () => { const engine = new MemoryEngine(); await engine.open('test', 1); expect(engine.isOpen()).toBe(true); await engine.open('test', 1); expect(engine.isOpen()).toBe(true); await engine.close(); }); it('重复 open 后已有数据不丢失', async () => { const engine = new MemoryEngine(); await engine.open('test', 1); await engine.createTable({ name: 't', columns: { id: { type: 'string', primaryKey: true } } }); await engine.insert('t', [{ id: '1' }]); await engine.open('test', 1); const rows = await engine.find('t', { table: 't' }); expect(rows).toHaveLength(1); await engine.close(); }); it('close 后重新 open 是全新会话', async () => { const engine = new MemoryEngine(); await engine.open('test', 1); await engine.close(); expect(engine.isOpen()).toBe(false); await engine.open('test', 1); expect(engine.isOpen()).toBe(true); const names = await engine.getTableNames(); expect(names).toHaveLength(0); await engine.close(); }); }); // =================================================================== // =================================================================== // Hybrid 引擎事务持久化 // =================================================================== describe('v0.1.14 Hybrid 引擎事务持久化', () => { let db: MetonaSqlark; let dbName: string; beforeEach(async () => { dbName = uniqueDB(); db = new MetonaSqlark({ name: dbName, mode: 'hybrid', diskEngine: 'opfs' }); await db.init(); await db.defineTable('users', { id: { type: 'string', primaryKey: true }, name: { type: 'string', required: true }, }); }); afterEach(async () => { await db.close(); }); it('Hybrid 事务 commit 后内存和磁盘一致', async () => { await db.transaction(async (trx) => { await trx.table('users').insert({ id: '1', name: 'Alice' }); await trx.table('users').insert({ id: '2', name: 'Bob' }); }); // 事务后立即查询 const rows = await db.table('users').select().execute(); expect(rows).toHaveLength(2); // 重新打开同一库:Hybrid 从磁盘(KVStore)恢复已提交事务数据 await db.close(); const db2 = new MetonaSqlark({ name: dbName, mode: 'hybrid', diskEngine: 'opfs' }); await db2.init(); expect(await db2.table('users').count()).toBe(2); await db2.close(); }); it('Hybrid 事务 rollback 后数据不变', async () => { await db.table('users').insert({ id: '1', name: 'Alice' }); try { await db.transaction(async (trx) => { await trx.table('users').insert({ id: '2', name: 'Bob' }); throw new Error('fail'); }); } catch { /* expected */ } const rows = await db.table('users').select().execute(); expect(rows).toHaveLength(1); expect(rows[0].id).toBe('1'); }); });