Files
HiveGrid-Wireframes/hivegrid-cloud/apps/web/app/shared-store.server.test.ts
T

53 lines
1.6 KiB
TypeScript

import { afterEach, describe, expect, test, vi } from "vitest";
import { __resetSharedStoreForTests, __setSharedStoreFactoryForTests, getSharedStore } from "./shared-store.server";
afterEach(() => {
__resetSharedStoreForTests();
});
describe("web shared-store singleton", () => {
test("memoizes the factory result", () => {
const factory = vi.fn(() => ({
namespace: "web",
ttlDefault: undefined,
adapter: {} as never,
key: (s: string) => s,
get: async () => null,
set: async () => true,
del: async () => 0,
incr: async () => 0,
expire: async () => true,
mget: async () => [],
scan: async function* () {},
publish: async () => 0,
subscribe: async () => async () => undefined,
zAdd: async () => 0,
zRemRangeByScore: async () => 0,
zCard: async () => 0,
eval: async () => null,
close: async () => undefined,
}));
__setSharedStoreFactoryForTests(factory);
const first = getSharedStore();
const second = getSharedStore();
expect(first).toBe(second);
expect(factory).toHaveBeenCalledTimes(1);
});
test("returns a memory-backed store when REDIS_URL is unset", async () => {
const originalRedisUrl = process.env.REDIS_URL;
delete process.env.REDIS_URL;
__resetSharedStoreForTests();
try {
const store = getSharedStore();
expect(store.namespace).toBe("web");
await store.set("ping", "pong");
expect(await store.get("ping")).toBe("pong");
} finally {
if (originalRedisUrl !== undefined) process.env.REDIS_URL = originalRedisUrl;
}
});
});