54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
import type { WorkNotice } from "@code/primitives/work";
|
|
import { describe, expect, test } from "vitest";
|
|
|
|
import type { ConversationMessage } from "@/lib/chat/types";
|
|
|
|
import {
|
|
buildWorkspaceTimeline,
|
|
findSourceMessageTarget,
|
|
} from "./presentation";
|
|
|
|
const textMessage = (
|
|
id: string,
|
|
role: "assistant" | "user",
|
|
text: string
|
|
): ConversationMessage => ({
|
|
id,
|
|
parts: [{ state: "done", text, type: "text" }],
|
|
role,
|
|
});
|
|
|
|
const notice: WorkNotice = {
|
|
createdAt: 10,
|
|
eventId: "event-1",
|
|
sourceMessageIds: ["source-1"],
|
|
sourceTexts: ["Build the phone flow."],
|
|
workId: "work-1",
|
|
};
|
|
|
|
describe("Workspace presentation", () => {
|
|
test("places proposed Work after the assistant response to its source", () => {
|
|
const timeline = buildWorkspaceTimeline(
|
|
[
|
|
textMessage("user-1", "user", "Build the phone flow."),
|
|
textMessage("assistant-1", "assistant", "Captured and proposed Work."),
|
|
],
|
|
[notice]
|
|
);
|
|
|
|
expect(
|
|
timeline.map((item) =>
|
|
item.kind === "message" ? item.message.id : item.notice.workId
|
|
)
|
|
).toEqual(["user-1", "assistant-1", "work-1"]);
|
|
});
|
|
|
|
test("finds the exact source message without trimming it", () => {
|
|
const messages = [textMessage("user-1", "user", " Exact source ")];
|
|
expect(findSourceMessageTarget(messages, " Exact source ")).toBe(
|
|
"user-1"
|
|
);
|
|
expect(findSourceMessageTarget(messages, "Exact source")).toBeUndefined();
|
|
});
|
|
});
|