import { describe, expect, it } from "@effect/vitest"; import * as DateTime from "effect/DateTime"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as Option from "effect/Option"; import * as RelayDb from "../db.ts"; import { relayDpopProofs } from "../persistence/schema.ts"; import * as DpopProofs from "./DpopProofs.ts"; describe("DpopProofReplay", () => { it.effect("consumes proof ids without pruning expired rows on the request path", () => { const calls: Array = []; const insertedValues: Array<{ readonly thumbprint: string; readonly jti: string; readonly iat: number; readonly expiresAt: string; readonly createdAt: string; }> = []; const fakeDb = { insert: (table: unknown) => { expect(table).toBe(relayDpopProofs); calls.push("insert"); return { values: (values: (typeof insertedValues)[number]) => { insertedValues.push(values); calls.push("insert.values"); return { onConflictDoNothing: () => { calls.push("insert.onConflictDoNothing"); return { returning: (selection: unknown) => { expect(selection).toBeDefined(); calls.push("insert.returning"); return Effect.succeed([{ jti: values.jti }]); }, }; }, }; }, }; }, } as unknown as RelayDb.RelayDb["Service"]; return Effect.gen(function* () { const replay = yield* DpopProofs.DpopProofReplay; const consumed = yield* replay.consume({ thumbprint: "thumbprint", jti: "jti", iat: 1_771_000_000, expiresAt: Option.getOrThrow(DateTime.make("2026-05-25T12:00:00.000Z")), }); expect(consumed).toBe(true); expect(calls).toEqual([ "insert", "insert.values", "insert.onConflictDoNothing", "insert.returning", ]); expect(insertedValues).toMatchObject([ { thumbprint: "thumbprint", jti: "jti", iat: 1_771_000_000, expiresAt: "2026-05-25T12:00:00.000Z", }, ]); }).pipe( Effect.provide(DpopProofs.layer.pipe(Layer.provide(Layer.succeed(RelayDb.RelayDb, fakeDb)))), ); }); it.effect("prunes expired proof rows from the maintenance path", () => { const calls: Array = []; const fakeDb = { delete: (table: unknown) => { expect(table).toBe(relayDpopProofs); calls.push("delete"); return { where: (condition: unknown) => { expect(condition).toBeDefined(); calls.push("delete.where"); return Effect.void; }, }; }, } as unknown as RelayDb.RelayDb["Service"]; return Effect.gen(function* () { const replay = yield* DpopProofs.DpopProofReplay; yield* replay.pruneExpired; expect(calls).toEqual(["delete", "delete.where"]); }).pipe( Effect.provide(DpopProofs.layer.pipe(Layer.provide(Layer.succeed(RelayDb.RelayDb, fakeDb)))), ); }); it.effect("retains the prune cutoff and database failure", () => { const cause = new Error("database unavailable"); const fakeDb = { delete: (table: unknown) => { expect(table).toBe(relayDpopProofs); return { where: () => Effect.fail(cause), }; }, } as unknown as RelayDb.RelayDb["Service"]; return Effect.gen(function* () { const replay = yield* DpopProofs.DpopProofReplay; const error = yield* Effect.flip(replay.pruneExpired); expect(error).toMatchObject({ _tag: "DpopProofReplayPersistenceError", operation: "prune-expired", }); expect(Date.parse(error.expiresBefore ?? "")).not.toBeNaN(); expect(error.cause).toBe(cause); }).pipe( Effect.provide(DpopProofs.layer.pipe(Layer.provide(Layer.succeed(RelayDb.RelayDb, fakeDb)))), ); }); });