-
Notifications
You must be signed in to change notification settings - Fork 61
Expand file tree
/
Copy pathThreadPanel.test.tsx
More file actions
108 lines (97 loc) · 3.14 KB
/
Copy pathThreadPanel.test.tsx
File metadata and controls
108 lines (97 loc) · 3.14 KB
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
101
102
103
104
105
106
107
108
import type { ConversationItem } from "@posthog/ui/features/sessions/components/buildConversationItems";
import { render, screen } from "@testing-library/react";
import { describe, expect, it } from "vitest";
import {
AgentStatusLine,
ThreadMessageRow,
UserPromptRow,
} from "./ThreadPanel";
import { agentTurns } from "./threadAgentTurns";
describe("agentTurns", () => {
it("accumulates every text chunk in one agent turn", () => {
const items = [
{
type: "session_update",
id: "first",
timestamp: 10,
update: {
sessionUpdate: "agent_message_chunk",
content: { type: "text", text: "Hello" },
},
},
{
type: "session_update",
id: "second",
timestamp: 20,
update: {
sessionUpdate: "agent_message_chunk",
content: { type: "text", text: " there" },
},
},
] as ConversationItem[];
expect(agentTurns(items)).toEqual([
{ id: "first", text: "Hello there", timestamp: 10 },
]);
});
});
describe("AgentStatusLine", () => {
it("renders working status outside the conversation timeline", () => {
render(<AgentStatusLine status={{ phase: "active", label: "Working…" }} />);
const status = screen.getByText("Working…");
expect(status.closest("article")).toBeNull();
expect(status.closest('[data-slot="thread-item-body"]')).toBeNull();
expect(status.closest("output")).not.toBeNull();
});
});
describe("ThreadMessageRow", () => {
it("renders backend-authored agent announcements as Agent", () => {
render(
<ThreadMessageRow
message={{
id: "announcement",
task: "task",
author_kind: "agent",
event: "canvas_created",
payload: {},
content: "Canvas created",
created_at: "2026-07-17T00:00:00Z",
author: null,
}}
isTaskAuthor={false}
isOwnMessage={false}
canForward={false}
onSendToAgent={() => {}}
onDelete={() => {}}
/>,
);
expect(screen.getByText("Agent")).toBeInTheDocument();
expect(screen.queryByText("Unknown")).not.toBeInTheDocument();
});
});
describe("UserPromptRow", () => {
it("prefixes direct task prompts with @agent", () => {
render(
<UserPromptRow
message={{ id: "prompt", text: "Investigate this", timestamp: 1 }}
author={{ id: 1, uuid: "user", email: "user@example.com" }}
/>,
);
expect(screen.getByText("@agent")).toBeInTheDocument();
expect(screen.getByText("Investigate this")).toBeInTheDocument();
});
it("hides forwarded thread attribution and duplicate agent mentions", () => {
render(
<UserPromptRow
message={{
id: "prompt",
text: "[Thread comment from Peter Kirkham] @agent which model are you?",
timestamp: 1,
}}
author={{ id: 1, uuid: "user", email: "user@example.com" }}
/>,
);
expect(screen.getAllByText("@agent")).toHaveLength(1);
expect(screen.getByText("which model are you?")).toBeInTheDocument();
expect(screen.queryByText(/Thread comment from/)).not.toBeInTheDocument();
});
});