@@ -0,0 +1,54 @@
1+package chat
2+
3+import (
4+ "testing"
5+
6+ "github.com/charmbracelet/crush/internal/message"
7+ "github.com/charmbracelet/crush/internal/ui/styles"
8+ "github.com/charmbracelet/x/ansi"
9+ "github.com/stretchr/testify/require"
10+)
11+
12+// TestAssistantMessageItemExpandable guards the Expandable contract on
13+// AssistantMessageItem. The earlier implementation returned no value, which
14+// meant the type silently did not satisfy chat.Expandable and the
15+// keyboard-driven expand path in model/chat.go skipped thinking blocks.
16+func TestAssistantMessageItemExpandable(t *testing.T) {
17+ t.Parallel()
18+
19+ sty := styles.CharmtonePantera()
20+ msg := &message.Message{ID: "m1", Role: message.Assistant}
21+ item := NewAssistantMessageItem(&sty, msg)
22+
23+ exp, ok := item.(Expandable)
24+ require.True(t, ok, "AssistantMessageItem must satisfy Expandable")
25+
26+ require.True(t, exp.ToggleExpanded(), "first toggle should report expanded")
27+ require.False(t, exp.ToggleExpanded(), "second toggle should report collapsed")
28+}
29+
30+// TestAssistantMessageItemHandleMouseClick ensures HandleMouseClick does not
31+// toggle expansion on its own. The generic Expandable path in
32+// model/chat.go does the toggle; doing it here too would double-toggle and
33+// net to no change.
34+func TestAssistantMessageItemHandleMouseClick(t *testing.T) {
35+ t.Parallel()
36+
37+ sty := styles.CharmtonePantera()
38+ msg := &message.Message{ID: "m2", Role: message.Assistant}
39+ item := NewAssistantMessageItem(&sty, msg).(*AssistantMessageItem)
40+ item.thinkingBoxHeight = 5
41+
42+ // Click inside the thinking box signals handled but must not mutate
43+ // the expanded state.
44+ require.True(t, item.HandleMouseClick(ansi.MouseLeft, 0, 2))
45+ require.False(t, item.thinkingExpanded, "HandleMouseClick must not toggle expansion on its own")
46+
47+ // Click outside the thinking box is ignored entirely.
48+ require.False(t, item.HandleMouseClick(ansi.MouseLeft, 0, 10))
49+ require.False(t, item.thinkingExpanded)
50+
51+ // Non-left button is ignored.
52+ require.False(t, item.HandleMouseClick(ansi.MouseRight, 0, 2))
53+ require.False(t, item.thinkingExpanded)
54+}