Store/store.test.ts
2024-10-18 18:34:11 -06:00

90 lines
2.3 KiB
TypeScript

// 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,
]);
});
});