diff --git a/src/__tests__/db/settings.test.ts b/src/__tests__/db/settings.test.ts new file mode 100644 index 0000000..581801a --- /dev/null +++ b/src/__tests__/db/settings.test.ts @@ -0,0 +1,33 @@ +import { getDb, resetDb } from '../../db'; +import { getSetting, setSetting, getAllSettings } from '../../db/settings'; + +beforeEach(() => { + resetDb(); +}); + +describe('settings', () => { + it('returns null for a missing key', () => { + const db = getDb(); + expect(getSetting(db, 'missing')).toBeNull(); + }); + + it('sets and gets a value', () => { + const db = getDb(); + setSetting(db, 'model', 'gpt-4o-mini'); + expect(getSetting(db, 'model')).toBe('gpt-4o-mini'); + }); + + it('overwrites an existing value', () => { + const db = getDb(); + setSetting(db, 'model', 'gpt-4o-mini'); + setSetting(db, 'model', 'gemini-flash'); + expect(getSetting(db, 'model')).toBe('gemini-flash'); + }); + + it('returns all settings as an object', () => { + const db = getDb(); + setSetting(db, 'a', '1'); + setSetting(db, 'b', '2'); + expect(getAllSettings(db)).toEqual({ a: '1', b: '2' }); + }); +}); diff --git a/src/db/settings.ts b/src/db/settings.ts new file mode 100644 index 0000000..c13a83b --- /dev/null +++ b/src/db/settings.ts @@ -0,0 +1,15 @@ +import type { Database } from 'better-sqlite3'; + +export function getSetting(db: Database, key: string): string | null { + const row = db.prepare('SELECT value FROM settings WHERE key = ?').get(key) as { value: string } | undefined; + return row?.value ?? null; +} + +export function setSetting(db: Database, key: string, value: string): void { + db.prepare('INSERT OR REPLACE INTO settings (key, value) VALUES (?, ?)').run(key, value); +} + +export function getAllSettings(db: Database): Record { + const rows = db.prepare('SELECT key, value FROM settings').all() as Array<{ key: string; value: string }>; + return Object.fromEntries(rows.map(r => [r.key, r.value])); +}