import { describe, expect, it } from "vitest"; import { TRANSFER_DELIVERY_KEYS, deliveredKeys, findLeaderSide, isLeaderDeliveryDue, transferDecisionRow, } from "@/bot/lib/transferMessaging"; import type { AssignmentTransfer } from "@/payload-types"; const transfer = (overrides: Partial = {}): AssignmentTransfer => ({ id: 42, requester: 10, fromAssignment: 20, toAssignment: 30, status: "pending", fromLeaderDecision: "pending", toLeaderDecision: "pending", updatedAt: "2026-08-31T00:00:00.000Z", createdAt: "2026-08-31T00:00:00.000Z", ...overrides, }); describe("assignment-transfer Discord helpers", () => { it("requires a fresh leader DM when leadership changes", () => { // Given const request = transfer({ discordDeliveredKeys: [TRANSFER_DELIVERY_KEYS.requestFrom], sourceNotifiedToUserId: 100, }); // When const due = isLeaderDeliveryDue(request, "from", 101); // Then expect(due).toBe(true); }); it("skips a leader DM only when its key and recipient both match", () => { // Given const request = transfer({ discordDeliveredKeys: [TRANSFER_DELIVERY_KEYS.requestTo], destinationNotifiedToUserId: 200, }); // When const due = isLeaderDeliveryDue(request, "to", 200); // Then expect(due).toBe(false); }); it("chooses the actor's still-pending current-leader side", () => { // Given const request = transfer({ fromLeaderDecision: "approved" }); // When const check = findLeaderSide(request, 100, 200, 200); // Then expect(check).toEqual({ outcome: "authorized", side: "to" }); }); it("marks stale leaders as unauthorized", () => { // Given const request = transfer(); // When const check = findLeaderSide(request, 101, 200, 100); // Then expect(check).toEqual({ outcome: "not_leader" }); }); it("renders the transfer custom-id contract", () => { // Given const row = transferDecisionRow(42); // When const customIds = row.toJSON().components.map((component) => "custom_id" in component ? component.custom_id : null, ); // Then expect(customIds).toEqual(["ptf-xfer:42:approve", "ptf-xfer:42:reject"]); }); it("narrows malformed delivery-ledger JSON to an empty list", () => { // Given const request = transfer({ discordDeliveredKeys: { invalid: true } }); // When const keys = deliveredKeys(request); // Then expect(keys).toEqual([]); }); });