35 lines · 1.1 KB
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;
    },
  };
}