63 lines
2.9 KiB
TypeScript
63 lines
2.9 KiB
TypeScript
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
import { newFixture, type Fixture } from '../helpers/fixture.js';
|
|
|
|
let fixture: Fixture;
|
|
beforeEach(async () => {
|
|
vi.resetModules();
|
|
fixture = await newFixture([]);
|
|
});
|
|
afterEach(async () => { await fixture.cleanup(); });
|
|
|
|
describe('prepared statement caching', () => {
|
|
it('tunes the controller connection and stops periodic optimization when closed', async () => {
|
|
const { db, closeDb } = await import('../../src/lib/server/db/index.js');
|
|
vi.useFakeTimers({ toFake: ['setInterval', 'clearInterval'] });
|
|
try {
|
|
const handle = db();
|
|
expect(handle.pragma('cache_size', { simple: true })).toBe(-131072);
|
|
expect(handle.pragma('temp_store', { simple: true })).toBe(1);
|
|
expect(handle.pragma('journal_size_limit', { simple: true })).toBe(67108864);
|
|
const pragma = vi.spyOn(handle, 'pragma');
|
|
vi.advanceTimersByTime(60 * 60_000);
|
|
expect(pragma).toHaveBeenCalledWith('optimize');
|
|
pragma.mockClear();
|
|
closeDb();
|
|
vi.advanceTimersByTime(60 * 60_000);
|
|
expect(pragma).not.toHaveBeenCalled();
|
|
} finally { vi.useRealTimers(); }
|
|
});
|
|
it('reuses statements with fresh parameters and remains usable after rollback', async () => {
|
|
const { db } = await import('../../src/lib/server/db/index.js');
|
|
const insertSql = 'INSERT INTO settings (key, value) VALUES (?, ?)';
|
|
const selectSql = 'SELECT value FROM settings WHERE key = ?';
|
|
const insert = db().prepare(insertSql);
|
|
const select = db().prepare(selectSql);
|
|
insert.run('cache-first', 'one');
|
|
expect(() => db().transaction(() => {
|
|
db().prepare(insertSql).run('cache-rollback', 'discarded');
|
|
throw new Error('rollback');
|
|
})()).toThrow('rollback');
|
|
db().prepare(insertSql).run('cache-second', 'two');
|
|
|
|
expect(db().prepare(insertSql)).toBe(insert);
|
|
expect(db().prepare(selectSql)).toBe(select);
|
|
expect(select.get('cache-first')).toEqual({ value: 'one' });
|
|
expect(select.get('cache-second')).toEqual({ value: 'two' });
|
|
expect(select.get('cache-rollback')).toBeUndefined();
|
|
});
|
|
|
|
it('prepares fresh statements when the connection is reopened', async () => {
|
|
const { db, closeDb } = await import('../../src/lib/server/db/index.js');
|
|
const sql = 'SELECT value FROM settings WHERE key = ?';
|
|
const oldStatement = db().prepare(sql);
|
|
db().prepare('INSERT INTO settings (key, value) VALUES (?, ?)').run('cache-persisted', 'saved');
|
|
closeDb();
|
|
|
|
const statement = db().prepare(sql);
|
|
expect(statement).not.toBe(oldStatement);
|
|
expect(statement.database).not.toBe(oldStatement.database);
|
|
expect(statement.get('cache-persisted')).toEqual({ value: 'saved' });
|
|
expect(db().prepare(sql)).toBe(statement);
|
|
});
|
|
});
|