import { Database } from "bun:sqlite";
/** Minimal in-memory stand-in for a SQLite-backed Durable Object's `ctx.storage`, for unit tests only. */
export function fakeStorage() {
const db = new Database(":memory:");
const kv = new Map<string, unknown>();
let alarm: number | null = null;
const sql = {
exec<T>(query: string, ...params: unknown[]) {
const rows = db.query(query).all(...(params as never[])) as T[];
return {
toArray: () => rows,
one: () => {
if (rows.length !== 1) throw new Error(`expected one row, got ${rows.length}`);
return rows[0];
},
};
},
};
return {
sql,
get: async <T>(key: string) => kv.get(key) as T | undefined,
put: async (key: string, value: unknown) => void kv.set(key, value),
delete: async (key: string) => kv.delete(key),
deleteAll: async () => kv.clear(),
getAlarm: async () => alarm,
setAlarm: async (at: number) => void (alarm = at),
deleteAlarm: async () => void (alarm = null),
transactionSync: <T>(fn: () => T) => fn(),
get alarmAt() {
return alarm;
},
};
}