evOo-local/apps/web/src/lib/peer-messages.test.ts
cynarAI 6c7eed7580 Initial clean evOo-local from f00577b
Fresh history cut from cynarAI/evoo antigravity-handoff/project-timeline
(Voice First + project timeline). Brand docs/titles as evOo; keep @rakazo/*
packages as tech debt. Excludes node_modules, caches, secrets, voice blobs.
2026-09-20 17:15:16 +02:00

49 lines
2.0 KiB
TypeScript

import type { ThreadMessage } from "@rakazo/contracts";
import { describe, expect, it } from "vitest";
import { peerConversations, peerMessagesFrom } from "./peer-messages.js";
function message(id: string, createdAt: string, blocks: ThreadMessage["blocks"]): ThreadMessage {
return { id, threadId: "t_1", seq: 1, role: "bot", blocks, createdAt };
}
const sentToAnalyst = message("m_1", "2026-08-25T10:00:00.000Z", [
{ kind: "bot_message_sent", toBotId: "b_2", toBotName: "Analyst", text: "chart q3" },
]);
const replyFromAnalyst = message("m_2", "2026-08-25T10:01:00.000Z", [
{ kind: "bot_message_received", fromBotId: "b_2", fromBotName: "Analyst", text: "done" },
]);
const plainText = message("m_3", "2026-08-25T10:02:00.000Z", [{ kind: "text", text: "hello" }]);
describe("peer conversations", () => {
const messages = [sentToAnalyst, replyFromAnalyst, plainText];
it("reads both directions out of the thread", () => {
expect(peerMessagesFrom(messages)).toEqual([
expect.objectContaining({ direction: "sent", peerBotName: "Analyst", text: "chart q3" }),
expect.objectContaining({ direction: "received", peerBotName: "Analyst", text: "done" }),
]);
});
it("groups an exchange with one peer into a single conversation", () => {
const conversations = peerConversations(messages);
expect(conversations).toHaveLength(1);
expect(conversations[0]?.peerBotName).toBe("Analyst");
expect(conversations[0]?.messages).toHaveLength(2);
expect(conversations[0]?.lastText).toBe("done");
});
it("orders conversations by most recent activity", () => {
const older = message("m_0", "2026-08-24T09:00:00.000Z", [
{ kind: "bot_message_sent", toBotId: "b_3", toBotName: "Scout", text: "look into it" },
]);
expect(peerConversations([older, ...messages]).map((c) => c.peerBotName)).toEqual([
"Analyst",
"Scout",
]);
});
it("finds nothing in a thread with no peer traffic", () => {
expect(peerConversations([plainText])).toEqual([]);
});
});