assistant_test.go

 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}