redis-mock-utils.ts 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { vi } from "vitest";
  2. export function createRedisStore() {
  3. const store = new Map<string, { value: string; expiresAt: number }>();
  4. function readValue(key: string): string | null {
  5. const entry = store.get(key);
  6. if (!entry) return null;
  7. if (entry.expiresAt <= Date.now()) {
  8. store.delete(key);
  9. return null;
  10. }
  11. return entry.value;
  12. }
  13. const setex = vi.fn(async (key: string, ttlSeconds: number, value: string) => {
  14. store.set(key, { value, expiresAt: Date.now() + ttlSeconds * 1000 });
  15. return "OK";
  16. });
  17. const get = vi.fn(async (key: string) => readValue(key));
  18. const del = vi.fn(async (key: string) => {
  19. const existed = store.delete(key);
  20. return existed ? 1 : 0;
  21. });
  22. const evalScript = vi.fn(async (_script: string, _numKeys: number, key: string) => {
  23. const value = readValue(key);
  24. if (value === null) return null;
  25. store.delete(key);
  26. return value;
  27. });
  28. return { store, mocks: { setex, get, del, eval: evalScript } };
  29. }
  30. export function buildRedisMock(mocks: ReturnType<typeof createRedisStore>["mocks"]) {
  31. return {
  32. getRedisClient: () => ({
  33. status: "ready",
  34. setex: mocks.setex,
  35. get: mocks.get,
  36. del: mocks.del,
  37. eval: mocks.eval,
  38. }),
  39. };
  40. }