1package chat
2
3import (
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.
16func 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.
34func 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}