107 lines
3.4 KiB
TypeScript
107 lines
3.4 KiB
TypeScript
/**
|
|
* 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');
|
|
});
|
|
});
|