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}