// deno-lint-ignore-file no-explicit-any import { BearMetalStore } from "./store.ts"; import { assertEquals } from "@std/assert"; import { assertSpyCall, assertSpyCallArgs, spy, type SpyLike, } from "@std/testing/mock"; import { beforeAll } from "@std/testing/bdd"; beforeAll(() => { let store = "{}"; Deno.readTextFileSync = spy(() => store); Deno.writeTextFileSync = spy((_, string) => store = string); globalThis.addEventListener = spy(globalThis.addEventListener); globalThis.removeEventListener = spy(globalThis.removeEventListener); }); Deno.test("BearMetalStore Traditional", async (t) => { const store = new BearMetalStore(); const listener = spy(); globalThis.addEventListener(store.EVENT_NAME, listener); await t.step("set and get", () => { store.set("key", "value"); assertEquals(store.get("key"), "value"); }); await t.step("write file called", () => { assertSpyCall(Deno.writeTextFileSync as SpyLike, 0); }); await t.step("event listener called", () => { assertSpyCall(listener, 0); }); await t.step("delete and get", () => { store.delete("key"); assertEquals(store.get("key"), undefined); }); await t.step("event listeners removed", () => { store[Symbol.dispose](); assertSpyCallArgs(globalThis.removeEventListener as SpyLike, 0, [ store.EVENT_NAME, (store as any).readIn, ]); }); }); Deno.test("BearMetalStore `using` syntax", async (t) => { let eventName = ""; let readIn = () => {}; { using store = new BearMetalStore(); eventName = store.EVENT_NAME; readIn = (store as any).readIn; const listener = spy(); globalThis.addEventListener(store.EVENT_NAME, listener); await t.step("set and get", () => { store.set("key", "value"); assertEquals(store.get("key"), "value"); }); await t.step("write file called", () => { assertSpyCall(Deno.writeTextFileSync as SpyLike, 0); }); await t.step("event listener called", () => { assertSpyCall(listener, 0); }); await t.step("delete and get", () => { store.delete("key"); assertEquals(store.get("key"), undefined); }); } await t.step("event listeners removed", () => { assertSpyCallArgs(globalThis.removeEventListener as SpyLike, 0, [ eventName, readIn, ]); }); });