evOo-local/packages/core/src/message-reactions.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

39 lines
1.5 KiB
TypeScript

import type { MessageBlock } from "@rakazo/contracts";
import { describe, expect, it } from "vitest";
import { messageReaction, projectMessageReactions } from "./message-reactions.js";
const message = (id: string, text: string, replyToMessageId?: string) => ({
id,
role: "user",
blocks: [{ kind: "text", text }] as MessageBlock[],
replyToMessageId,
});
describe("reaction conversation presentation", () => {
it("keeps distinct and repeated reactions without replacing earlier messages", () => {
const parent = message("parent", "Hello");
const messages = [
parent,
message("one", "❤️", parent.id),
message("two", "👍", parent.id),
message("three", "❤️", parent.id),
];
const result = projectMessageReactions(messages);
expect(result.visibleMessages).toEqual([parent]);
expect([...result.reactions.get(parent.id)!]).toEqual([
["❤️", 2],
["👍", 1],
]);
expect(messages).toHaveLength(4);
});
it("keeps replies visible when their parent is outside the loaded page", () => {
const reply = message("reply", "❤️", "old-parent");
expect(projectMessageReactions([reply]).visibleMessages).toEqual([reply]);
});
it("does not collapse ordinary replies, standalone emoji, or bot messages", () => {
expect(messageReaction(message("one", "❤️"))).toBeNull();
expect(messageReaction(message("two", "❤️ thank you", "parent"))).toBeNull();
expect(messageReaction({ ...message("three", "❤️", "parent"), role: "bot" })).toBeNull();
});
});