File size: 3,300 Bytes
3144483 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | // Draft preview finalizer tests cover final draft rendering and cleanup after streamed replies.
import { describe, expect, it, vi } from "vitest";
import { deliverFinalizableDraftPreview } from "./draft-preview-finalizer.js";
function createDraft(id: string | undefined = "preview-1") {
return {
flush: vi.fn(async () => {}),
id: vi.fn(() => id),
seal: vi.fn(async () => {}),
discardPending: vi.fn(async () => {}),
clear: vi.fn(async () => {}),
};
}
describe("deliverFinalizableDraftPreview", () => {
it("does not flush non-finalizable finals before normal delivery", async () => {
const draft = createDraft("preview-1");
const deliverNormally = vi.fn(async () => {});
await deliverFinalizableDraftPreview({
kind: "final",
payload: { text: "image", mediaUrl: "https://example.com/a.png" },
draft,
buildFinalEdit: () => undefined,
editFinal: vi.fn(async () => {}),
deliverNormally,
});
expect(draft.flush).not.toHaveBeenCalled();
expect(draft.discardPending).toHaveBeenCalledTimes(1);
expect(deliverNormally).toHaveBeenCalledTimes(1);
expect(draft.clear).toHaveBeenCalledTimes(1);
});
it("flushes only eligible finals and edits the preview in place", async () => {
const draft = createDraft("preview-1");
const editFinal = vi.fn(async () => {});
const deliverNormally = vi.fn(async () => {});
const result = await deliverFinalizableDraftPreview({
kind: "final",
payload: { text: "final" },
draft,
buildFinalEdit: (payload) => payload.text,
editFinal,
deliverNormally,
});
expect(result).toBe("preview-finalized");
expect(draft.flush).toHaveBeenCalledTimes(1);
expect(draft.seal).toHaveBeenCalledTimes(1);
expect(editFinal).toHaveBeenCalledWith("preview-1", "final");
expect(deliverNormally).not.toHaveBeenCalled();
expect(draft.clear).not.toHaveBeenCalled();
});
it("falls back to normal delivery and clears only after success when edit fails", async () => {
const draft = createDraft("preview-1");
const editFinal = vi.fn(async () => {
throw new Error("gone");
});
const deliverNormally = vi.fn(async () => {});
await deliverFinalizableDraftPreview({
kind: "final",
payload: { text: "final" },
draft,
buildFinalEdit: (payload) => payload.text,
editFinal,
deliverNormally,
logPreviewEditFailure: vi.fn(),
});
expect(draft.flush).toHaveBeenCalledTimes(1);
expect(draft.discardPending).toHaveBeenCalledTimes(1);
expect(deliverNormally).toHaveBeenCalledTimes(1);
expect(draft.clear).toHaveBeenCalledTimes(1);
});
it("keeps an existing preview if normal fallback delivery throws", async () => {
const draft = createDraft("preview-1");
await expect(
deliverFinalizableDraftPreview({
kind: "final",
payload: { text: "image" },
draft,
buildFinalEdit: () => undefined,
editFinal: vi.fn(async () => {}),
deliverNormally: vi.fn(async () => {
throw new Error("send failed");
}),
}),
).rejects.toThrow("send failed");
expect(draft.discardPending).toHaveBeenCalledTimes(1);
expect(draft.clear).not.toHaveBeenCalled();
});
});
|