events_test.go

 1package server
 2
 3import (
 4	"testing"
 5
 6	"github.com/charmbracelet/crush/internal/message"
 7	"github.com/charmbracelet/crush/internal/proto"
 8	"github.com/stretchr/testify/require"
 9)
10
11// TestMessageToProtoToolResult ensures that ToolResult metadata,
12// data, and MIME type survive the conversion to proto. Without these
13// fields the TUI cannot render rich tool output (e.g. syntax-
14// highlighted code from view, diffs from edit, images, etc.) and
15// falls back to the raw LLM-facing string.
16func TestMessageToProtoToolResult(t *testing.T) {
17	t.Parallel()
18
19	src := message.Message{
20		ID:   "m1",
21		Role: message.Tool,
22		Parts: []message.ContentPart{
23			message.ToolResult{
24				ToolCallID: "call-1",
25				Name:       "view",
26				Content:    "<file>\n  1| hi\n</file>",
27				Data:       "base64data",
28				MIMEType:   "image/png",
29				Metadata:   `{"file_path":"/tmp/x","content":"hi"}`,
30				IsError:    false,
31			},
32		},
33	}
34
35	got := messageToProto(src)
36	require.Len(t, got.Parts, 1)
37	tr, ok := got.Parts[0].(proto.ToolResult)
38	require.True(t, ok, "expected proto.ToolResult, got %T", got.Parts[0])
39	require.Equal(t, "call-1", tr.ToolCallID)
40	require.Equal(t, "view", tr.Name)
41	require.Equal(t, "<file>\n  1| hi\n</file>", tr.Content)
42	require.Equal(t, "base64data", tr.Data)
43	require.Equal(t, "image/png", tr.MIMEType)
44	require.Equal(t, `{"file_path":"/tmp/x","content":"hi"}`, tr.Metadata)
45	require.False(t, tr.IsError)
46}