Files
cfw-autumn/server/tests/unit/misc/idempotency/resolveRequestIdempotencyStore.test.ts

61 lines
1.9 KiB
TypeScript

import { describe, expect, test } from "bun:test";
import { DurableObjectIdempotencyStore } from "@/internal/misc/idempotency/durableObjectIdempotencyStore.js";
import {
getRequestIdempotencyStoreResolution,
resolveRequestIdempotencyStore,
} from "@/internal/misc/idempotency/resolveRequestIdempotencyStore.js";
describe("resolveRequestIdempotencyStore", () => {
test("uses Durable Object only when the binding exists and the flag is enabled", () => {
const namespace = {} as DurableObjectNamespace<never>;
const env = {
IDEMPOTENCY_DO: namespace,
USE_DO_IDEMPOTENCY: "true",
} as unknown as Env;
expect(getRequestIdempotencyStoreResolution(env)).toEqual({
backend: "durable_object",
durableObjectEnabled: true,
durableObjectBound: true,
});
expect(resolveRequestIdempotencyStore(env)).toBeInstanceOf(
DurableObjectIdempotencyStore,
);
});
test("falls back to the default store when the Durable Object flag is missing", async () => {
const env = {
IDEMPOTENCY_DO: {} as DurableObjectNamespace<never>,
} as unknown as Env;
expect(getRequestIdempotencyStoreResolution(env)).toEqual({
backend: "default",
durableObjectEnabled: false,
durableObjectBound: true,
});
await expect(
resolveRequestIdempotencyStore(env).acquire({
key: "idempotency:test",
ttlMs: 1000,
}),
).resolves.toBe("unavailable");
});
test("falls back to the default store when the binding is missing", async () => {
const env = {
USE_DO_IDEMPOTENCY: "true",
} as unknown as Env;
const resolution = getRequestIdempotencyStoreResolution(env);
expect(resolution.backend).toBe("default");
expect(resolution.durableObjectEnabled).toBe(true);
expect(Boolean(resolution.durableObjectBound)).toBe(false);
await expect(
resolveRequestIdempotencyStore(env).acquire({
key: "idempotency:test",
ttlMs: 1000,
}),
).resolves.toBe("unavailable");
});
});