UNPKG

@fedify/fedify

Version:

An ActivityPub server framework

89 lines (88 loc) 3.33 kB
import { Temporal } from "@js-temporal/polyfill"; import "urlpattern-polyfill"; globalThis.addEventListener = () => {}; import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs"; import "../std__assert-CRDpx_HF.mjs"; import { t as MemoryKvStore } from "../kv-rV3vodCc.mjs"; import { test } from "@fedify/fixture"; //#region src/federation/kv.test.ts test("MemoryKvStore", async (t) => { const store = new MemoryKvStore(); await t.step("set() & get()", async () => { await store.set(["foo", "bar"], "foobar"); assertEquals(await store.get(["foo", "bar"]), "foobar"); assertEquals(await store.get(["foo"]), void 0); await store.set(["foo", "baz"], "baz", { ttl: Temporal.Duration.from({ seconds: 0 }) }); await new Promise((resolve) => setTimeout(resolve, 10)); assertEquals(await store.get(["foo", "baz"]), void 0); }); await t.step("delete()", async () => { await store.delete(["foo", "bar"]); assertEquals(await store.get(["foo", "bar"]), void 0); }); await t.step("cas()", async () => { await store.set(["foo", "bar"], "foobar"); assertEquals(await store.cas(["foo", "bar"], "bar", "baz"), false); assertEquals(await store.get(["foo", "bar"]), "foobar"); assertEquals(await store.cas(["foo", "bar"], "foobar", "baz"), true); assertEquals(await store.get(["foo", "bar"]), "baz"); await store.delete(["foo", "bar"]); assertEquals(await store.cas(["foo", "bar"], "foobar", "baz"), false); assertEquals(await store.get(["foo", "bar"]), void 0); assertEquals(await store.cas(["foo", "bar"], void 0, "baz"), true); assertEquals(await store.get(["foo", "bar"]), "baz"); }); await t.step("list()", async () => { await store.set(["prefix", "a"], "value-a"); await store.set(["prefix", "b"], "value-b"); await store.set([ "prefix", "nested", "c" ], "value-c"); await store.set(["other", "x"], "value-x"); await store.set(["prefix"], "exact-match"); const entries = await Array.fromAsync(store.list(["prefix"])); assertEquals(entries.length, 4); assertEquals(entries.find((e) => e.key.length === 2 && e.key[1] === "a")?.value, "value-a"); assertEquals((await Array.fromAsync(store.list(["nonexistent"]))).length, 0); await store.delete(["prefix", "a"]); await store.delete(["prefix", "b"]); await store.delete([ "prefix", "nested", "c" ]); await store.delete(["other", "x"]); await store.delete(["prefix"]); }); await t.step("list() filters expired entries", async () => { await store.set(["expired", "old"], "old-value", { ttl: Temporal.Duration.from({ milliseconds: 1 }) }); await store.set(["expired", "valid"], "valid-value"); await new Promise((r) => setTimeout(r, 10)); const entries = await Array.fromAsync(store.list(["expired"])); assertEquals(entries.length, 1); assertEquals(entries[0].value, "valid-value"); await store.delete(["expired", "valid"]); }); await t.step("list() with empty prefix", async () => { await store.delete(["foo", "bar"]); await store.set(["a"], "value-a"); await store.set(["b", "c"], "value-bc"); await store.set([ "d", "e", "f" ], "value-def"); assertEquals((await Array.fromAsync(store.list())).length, 3); await store.delete(["a"]); await store.delete(["b", "c"]); await store.delete([ "d", "e", "f" ]); }); }); //#endregion export {};