import { describe, expect, it } from "bun:test"; import { captureInstanceFeedbackResponseSchema, listInstanceFeedbackMineResponseSchema, } from "../instance-feedback"; import { getFeedbackReadFromSettlementDetail, getFeedbackSubmissionFromSettlementDetail, } from "./host-event-contract"; describe("getFeedbackSubmissionFromSettlementDetail", () => { it("returns a canonical receipt for feedback capture", () => { expect( getFeedbackSubmissionFromSettlementDetail({ kind: "instanceFeedback.capture", ok: true, result: { capturedAt: "2026-07-15T01:00:00.000Z", evaluationId: "eval_123", status: "accepted", }, }), ).toEqual({ capturedAt: "2026-07-15T01:00:00.000Z", evaluationId: "eval_123", status: "accepted", }); }); it("rejects other commands and malformed receipts", () => { expect( getFeedbackSubmissionFromSettlementDetail({ kind: "instanceFeedback.listMine", ok: true, result: { capturedAt: "2026-07-15T01:00:00.000Z", evaluationId: "eval_123", status: "accepted", }, }), ).toBeNull(); expect( getFeedbackSubmissionFromSettlementDetail({ kind: "instanceFeedback.capture", ok: true, result: { evaluationId: "eval_123", status: "accepted", }, }), ).toBeNull(); expect( getFeedbackSubmissionFromSettlementDetail({ kind: "instanceFeedback.capture", ok: true, result: { capturedAt: "+010000-01-01T00:00:00.000Z", evaluationId: "eval_123", status: "accepted", }, }), ).toBeNull(); }); it("normalizes receipt strings like the canonical schema", () => { expect( getFeedbackSubmissionFromSettlementDetail({ kind: "instanceFeedback.capture", ok: true, result: { capturedAt: " 2026-07-15T01:00:00.000Z ", evaluationId: " eval_123 ", status: "accepted", }, }), ).toEqual({ capturedAt: "2026-07-15T01:00:00.000Z", evaluationId: "eval_123", status: "accepted", }); }); it("stays in parity with the canonical response schema", () => { const receipts: unknown[] = [ { capturedAt: "2026-07-15T01:00:00.000Z", evaluationId: "eval_123", status: "accepted", }, { capturedAt: " 2026-07-15T01:00:00.000Z ", evaluationId: " eval_123 ", status: "accepted", }, { capturedAt: "+010000-01-01T00:00:00.000Z", evaluationId: "eval_123", status: "accepted", }, { evaluationId: "eval_123", status: "accepted", }, null, ]; for (const receipt of receipts) { const canonical = captureInstanceFeedbackResponseSchema.safeParse(receipt); const projected = getFeedbackSubmissionFromSettlementDetail({ kind: "instanceFeedback.capture", ok: true, result: receipt, }); expect(projected).toEqual(canonical.success ? canonical.data : null); } }); }); describe("getFeedbackReadFromSettlementDetail", () => { const response = { items: [ { evaluation: { capturedAt: "2026-07-15T01:00:00.000Z", category: "helpfulness", comment: null, evaluationId: "eval_123", reasons: ["clear"], value: true, }, }, { evaluation: null }, ], }; it("returns evaluations and missing matches in selector order", () => { expect( getFeedbackReadFromSettlementDetail({ kind: "instanceFeedback.listMine", ok: true, result: response, }), ).toEqual(response); }); it("rejects other commands and malformed evaluations", () => { expect( getFeedbackReadFromSettlementDetail({ kind: "instanceFeedback.capture", ok: true, result: response, }), ).toBeNull(); expect( getFeedbackReadFromSettlementDetail({ kind: "instanceFeedback.listMine", ok: true, result: { items: [ { evaluation: { ...response.items[0]?.evaluation, value: {} } }, ], }, }), ).toBeNull(); }); it("stays in parity with the canonical response schema", () => { const responses: unknown[] = [ response, { items: [] }, { items: [{ evaluation: null }] }, { items: [ { evaluation: { ...response.items[0]?.evaluation, capturedAt: " 2026-07-15T01:00:00.000Z ", evaluationId: " eval_123 ", }, }, ], }, { items: [ { evaluation: { ...response.items[0]?.evaluation, reasons: [1] } }, ], }, { items: [ { evaluation: { ...response.items[0]?.evaluation, value: {} } }, ], }, { items: [ { evaluation: { ...response.items[0]?.evaluation, value: NaN } }, ], }, { items: [{}] }, null, ]; for (const candidate of responses) { const canonical = listInstanceFeedbackMineResponseSchema.safeParse(candidate); const projected = getFeedbackReadFromSettlementDetail({ kind: "instanceFeedback.listMine", ok: true, result: candidate, }); expect(projected).toEqual(canonical.success ? canonical.data : null); } }); });