mirror of
https://github.com/alkimake/paperclip.git
synced 2026-06-15 02:20:38 +09:00
105 lines
2.8 KiB
TypeScript
105 lines
2.8 KiB
TypeScript
|
|
import { describe, expect, it } from "vitest";
|
||
|
|
import {
|
||
|
|
collapseDuplicatePendingHumanJoinRequests,
|
||
|
|
findReusableHumanJoinRequest,
|
||
|
|
} from "../lib/join-request-dedupe.js";
|
||
|
|
|
||
|
|
describe("findReusableHumanJoinRequest", () => {
|
||
|
|
it("reuses the newest pending request for the same user", () => {
|
||
|
|
const rows = [
|
||
|
|
{
|
||
|
|
id: "pending-new",
|
||
|
|
requestType: "human",
|
||
|
|
status: "pending_approval",
|
||
|
|
requestingUserId: "user-1",
|
||
|
|
requestEmailSnapshot: "person@example.com",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: "pending-old",
|
||
|
|
requestType: "human",
|
||
|
|
status: "pending_approval",
|
||
|
|
requestingUserId: "user-1",
|
||
|
|
requestEmailSnapshot: "person@example.com",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: "other-user",
|
||
|
|
requestType: "human",
|
||
|
|
status: "pending_approval",
|
||
|
|
requestingUserId: "user-2",
|
||
|
|
requestEmailSnapshot: "other@example.com",
|
||
|
|
},
|
||
|
|
] as const;
|
||
|
|
|
||
|
|
expect(
|
||
|
|
findReusableHumanJoinRequest(rows, {
|
||
|
|
requestingUserId: "user-1",
|
||
|
|
requestEmailSnapshot: "person@example.com",
|
||
|
|
})?.id
|
||
|
|
).toBe("pending-new");
|
||
|
|
});
|
||
|
|
|
||
|
|
it("falls back to email matching when the user id is unavailable", () => {
|
||
|
|
const rows = [
|
||
|
|
{
|
||
|
|
id: "approved-existing",
|
||
|
|
requestType: "human",
|
||
|
|
status: "approved",
|
||
|
|
requestingUserId: null,
|
||
|
|
requestEmailSnapshot: "Person@Example.com",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: "agent-request",
|
||
|
|
requestType: "agent",
|
||
|
|
status: "pending_approval",
|
||
|
|
requestingUserId: null,
|
||
|
|
requestEmailSnapshot: null,
|
||
|
|
},
|
||
|
|
] as const;
|
||
|
|
|
||
|
|
expect(
|
||
|
|
findReusableHumanJoinRequest(rows, {
|
||
|
|
requestingUserId: null,
|
||
|
|
requestEmailSnapshot: "person@example.com",
|
||
|
|
})?.id
|
||
|
|
).toBe("approved-existing");
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe("collapseDuplicatePendingHumanJoinRequests", () => {
|
||
|
|
it("keeps only the newest pending human row per requester", () => {
|
||
|
|
const rows = [
|
||
|
|
{
|
||
|
|
id: "human-new",
|
||
|
|
requestType: "human",
|
||
|
|
status: "pending_approval",
|
||
|
|
requestingUserId: "user-1",
|
||
|
|
requestEmailSnapshot: "person@example.com",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: "human-old",
|
||
|
|
requestType: "human",
|
||
|
|
status: "pending_approval",
|
||
|
|
requestingUserId: "user-1",
|
||
|
|
requestEmailSnapshot: "person@example.com",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: "approved-history",
|
||
|
|
requestType: "human",
|
||
|
|
status: "approved",
|
||
|
|
requestingUserId: "user-1",
|
||
|
|
requestEmailSnapshot: "person@example.com",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: "agent-pending",
|
||
|
|
requestType: "agent",
|
||
|
|
status: "pending_approval",
|
||
|
|
requestingUserId: null,
|
||
|
|
requestEmailSnapshot: null,
|
||
|
|
},
|
||
|
|
] as const;
|
||
|
|
|
||
|
|
expect(collapseDuplicatePendingHumanJoinRequests(rows).map((row) => row.id))
|
||
|
|
.toEqual(["human-new", "approved-history", "agent-pending"]);
|
||
|
|
});
|
||
|
|
});
|