115 lines
4.6 KiB
TypeScript
115 lines
4.6 KiB
TypeScript
/**
|
|
* v0.1.13 连接池测试
|
|
* 覆盖 MetonaSqlark.connect / disconnect / disconnectAll / getActiveConnections
|
|
*/
|
|
|
|
import { MetonaSqlark } from '../src/core';
|
|
import '../src/connection-manager';
|
|
|
|
// ===================================================================
|
|
// 连接池基础
|
|
// ===================================================================
|
|
|
|
describe('v0.1.13 连接池', () => {
|
|
afterEach(async () => {
|
|
// 清理所有连接
|
|
await (MetonaSqlark as any).disconnectAll?.();
|
|
});
|
|
|
|
it('connect: 创建新实例', async () => {
|
|
const db = await (MetonaSqlark as any).connect({ name: 'pool-test-1', mode: 'memory' });
|
|
expect(db).toBeDefined();
|
|
expect(db.isReady()).toBe(true);
|
|
expect((MetonaSqlark as any).getActiveConnections()).toContain('pool-test-1');
|
|
await (MetonaSqlark as any).disconnect('pool-test-1');
|
|
});
|
|
|
|
it('connect: 同名数据库复用实例', async () => {
|
|
const db1 = await (MetonaSqlark as any).connect({ name: 'pool-test-2', mode: 'memory' });
|
|
const db2 = await (MetonaSqlark as any).connect({ name: 'pool-test-2' });
|
|
// 同一个实例
|
|
expect(db1).toBe(db2);
|
|
await (MetonaSqlark as any).disconnect('pool-test-2');
|
|
await (MetonaSqlark as any).disconnect('pool-test-2');
|
|
});
|
|
|
|
it('connect: 不同名数据库不同实例', async () => {
|
|
const db1 = await (MetonaSqlark as any).connect({ name: 'pool-a', mode: 'memory' });
|
|
const db2 = await (MetonaSqlark as any).connect({ name: 'pool-b', mode: 'memory' });
|
|
expect(db1).not.toBe(db2);
|
|
const active = (MetonaSqlark as any).getActiveConnections();
|
|
expect(active).toContain('pool-a');
|
|
expect(active).toContain('pool-b');
|
|
await (MetonaSqlark as any).disconnectAll();
|
|
});
|
|
|
|
it('disconnect: 引用计数归零自动 close', async () => {
|
|
const db = await (MetonaSqlark as any).connect({ name: 'pool-close', mode: 'memory' });
|
|
expect(db.isReady()).toBe(true);
|
|
|
|
// 第二次 connect → refCount = 2
|
|
await (MetonaSqlark as any).connect({ name: 'pool-close' });
|
|
|
|
// 第一次 disconnect → refCount = 1
|
|
await (MetonaSqlark as any).disconnect('pool-close');
|
|
expect(db.isReady()).toBe(true); // 仍然 alive
|
|
|
|
// 第二次 disconnect → refCount = 0 → close
|
|
await (MetonaSqlark as any).disconnect('pool-close');
|
|
expect(db.isReady()).toBe(false); // 已关闭
|
|
});
|
|
|
|
it('disconnect: 引用计数 > 1 时不 close', async () => {
|
|
const db = await (MetonaSqlark as any).connect({ name: 'pool-ref', mode: 'memory' });
|
|
// 3 次 connect
|
|
await (MetonaSqlark as any).connect({ name: 'pool-ref' });
|
|
await (MetonaSqlark as any).connect({ name: 'pool-ref' });
|
|
// 2 次 disconnect
|
|
await (MetonaSqlark as any).disconnect('pool-ref');
|
|
await (MetonaSqlark as any).disconnect('pool-ref');
|
|
expect(db.isReady()).toBe(true); // 还有 1 个引用
|
|
// 最后一次
|
|
await (MetonaSqlark as any).disconnect('pool-ref');
|
|
expect(db.isReady()).toBe(false);
|
|
});
|
|
|
|
it('disconnectAll: 强制关闭所有', async () => {
|
|
const db1 = await (MetonaSqlark as any).connect({ name: 'pool-all-1', mode: 'memory' });
|
|
const db2 = await (MetonaSqlark as any).connect({ name: 'pool-all-2', mode: 'memory' });
|
|
|
|
await (MetonaSqlark as any).disconnectAll();
|
|
expect(db1.isReady()).toBe(false);
|
|
expect(db2.isReady()).toBe(false);
|
|
expect((MetonaSqlark as any).getActiveConnections()).toHaveLength(0);
|
|
});
|
|
|
|
it('getActiveConnections: 返回活跃连接列表', async () => {
|
|
expect((MetonaSqlark as any).getActiveConnections()).toEqual([]);
|
|
await (MetonaSqlark as any).connect({ name: 'pool-list-1', mode: 'memory' });
|
|
await (MetonaSqlark as any).connect({ name: 'pool-list-2', mode: 'memory' });
|
|
const active = (MetonaSqlark as any).getActiveConnections();
|
|
expect(active).toContain('pool-list-1');
|
|
expect(active).toContain('pool-list-2');
|
|
expect(active.length).toBe(2);
|
|
await (MetonaSqlark as any).disconnectAll();
|
|
});
|
|
|
|
it('connect 复用时数据库操作正常', async () => {
|
|
const db1 = await (MetonaSqlark as any).connect({ name: 'pool-data', mode: 'memory' });
|
|
await db1.defineTable('test', {
|
|
id: { type: 'string', primaryKey: true },
|
|
val: { type: 'number' },
|
|
});
|
|
await db1.table('test').insert({ id: 'a', val: 42 });
|
|
|
|
// 复用
|
|
const db2 = await (MetonaSqlark as any).connect({ name: 'pool-data' });
|
|
const rows = await db2.table('test').select().execute();
|
|
expect(rows).toHaveLength(1);
|
|
expect(rows[0].val).toBe(42);
|
|
|
|
await (MetonaSqlark as any).disconnect('pool-data');
|
|
await (MetonaSqlark as any).disconnect('pool-data');
|
|
});
|
|
});
|