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('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); }); });