34 lines · 1.4 KB
import { describe, expect, test } from "bun:test";
import { Database } from "bun:sqlite";
import { forwardFlushed } from "./counters-forward";

describe("forwardFlushed", () => {
  test("forwards only what each row gained since its last flush", async () => {
    const db = new Database(":memory:");
    db.run("CREATE TABLE counters (key TEXT PRIMARY KEY, base_a INTEGER, base_b INTEGER, base_c INTEGER)");
    db.run("INSERT INTO counters VALUES ('2026-10-12', 10, 100, 0), ('2026-10-13', 5, 5, 5)");
    const sql = {
      exec: (query: string, ...params: Array<string | number | null>) => {
        const rows = db.query(query).all(...params);
        return { toArray: () => rows };
      },
    } as unknown as SqlStorage;
    const added: Array<[string, number[]]> = [];
    const namespace = {
      idFromName: (name: string) => name,
      get: () => ({
        add: async (_kind: string, _scope: string, key: string, delta: number[]) => void added.push([key, delta]),
      }),
    } as unknown as DurableObjectNamespace;
    await forwardFlushed(sql, namespace, { kind: "platform-sites", scope: "global" }, [
      { key: "2026-10-12", a: 12, b: 150, c: 0 },
      { key: "2026-10-13", a: 5, b: 5, c: 5 },
      { key: "2026-10-14", a: 1, b: 2, c: 3 },
    ]);
    expect(added).toEqual([
      ["2026-10-12", [2, 50, 0]],
      ["2026-10-14", [1, 2, 3]],
    ]);
  });
});