Files
bknd/app/src/core/drivers/cache/cache-driver-test-suite.ts
T
2025-06-17 13:34:31 +02:00

73 lines
2.1 KiB
TypeScript

import type { TestRunner } from "core/test";
import type { ICacheDriver } from "./index";
export function cacheDriverTestSuite(
testRunner: TestRunner,
{
makeCache,
setTime,
options,
}: {
makeCache: () => ICacheDriver;
setTime: (ms: number) => void;
options?: {
minTTL?: number;
skipTTL?: boolean;
};
},
) {
const { test, expect } = testRunner;
const minTTL = options?.minTTL ?? 1;
test("get within ttl", async () => {
const cache = makeCache();
await cache.set("ttl", "bar", minTTL + 2); // 2 second TTL
setTime(minTTL * 1000 + 1000); // advance by 1 second
expect(await cache.get("ttl")).toBe("bar");
});
test("set and get returns value", async () => {
const cache = makeCache();
await cache.set("value", "bar");
expect(await cache.get("value")).toBe("bar");
});
test("get returns undefined for missing key", async () => {
const cache = makeCache();
expect(await cache.get("missing" + Math.random())).toBeUndefined();
});
test("delete removes value", async () => {
const cache = makeCache();
await cache.set("delete", "bar");
await cache.del("delete");
expect(await cache.get("delete")).toBeUndefined();
});
test("set overwrites value", async () => {
const cache = makeCache();
await cache.set("overwrite", "bar");
await cache.set("overwrite", "baz");
expect(await cache.get("overwrite")).toBe("baz");
});
test("set with ttl expires", async () => {
const cache = makeCache();
await cache.set("expire", "bar", minTTL + 1); // 1 second TTL
expect(await cache.get("expire")).toBe("bar");
// advance time
setTime(minTTL * 1000 * 2000);
if (options?.skipTTL) {
await cache.del("expire");
}
expect(await cache.get("expire")).toBeUndefined();
});
test("set without ttl does not expire", async () => {
const cache = makeCache();
await cache.set("ttl0", "bar");
expect(await cache.get("ttl0")).toBe("bar");
setTime(1000);
expect(await cache.get("ttl0")).toBe("bar");
});
}