convert_test.go

 1package agent
 2
 3import (
 4	"encoding/base64"
 5	"testing"
 6
 7	"charm.land/fantasy"
 8	"github.com/stretchr/testify/require"
 9)
10
11func TestConvertToToolResult_InvalidBase64(t *testing.T) {
12	t.Parallel()
13
14	a := &sessionAgent{}
15	result := fantasy.ToolResultContent{
16		ToolCallID: "call_123",
17		ToolName:   "test_tool",
18		Result: fantasy.ToolResultOutputContentMedia{
19			Data:      "abc\x80def",
20			MediaType: "image/png",
21		},
22	}
23
24	tr := a.convertToToolResult(result)
25	require.True(t, tr.IsError)
26	require.Empty(t, tr.Data)
27	require.Contains(t, tr.Content, "invalid encoding")
28	require.Equal(t, "call_123", tr.ToolCallID)
29	require.Equal(t, "test_tool", tr.Name)
30}
31
32func TestConvertToToolResult_ValidMedia(t *testing.T) {
33	t.Parallel()
34
35	a := &sessionAgent{}
36	validData := base64.StdEncoding.EncodeToString([]byte("test image data"))
37
38	result := fantasy.ToolResultContent{
39		ToolCallID: "call_456",
40		ToolName:   "screenshot",
41		Result: fantasy.ToolResultOutputContentMedia{
42			Data:      validData,
43			MediaType: "image/png",
44			Text:      "Screenshot captured",
45		},
46	}
47
48	tr := a.convertToToolResult(result)
49	require.False(t, tr.IsError)
50	require.Equal(t, validData, tr.Data)
51	require.Equal(t, "image/png", tr.MIMEType)
52	require.Equal(t, "Screenshot captured", tr.Content)
53}
54
55func TestConvertToToolResult_ValidMediaNoText(t *testing.T) {
56	t.Parallel()
57
58	a := &sessionAgent{}
59	validData := base64.StdEncoding.EncodeToString([]byte("test image data"))
60
61	result := fantasy.ToolResultContent{
62		ToolCallID: "call_789",
63		ToolName:   "view",
64		Result: fantasy.ToolResultOutputContentMedia{
65			Data:      validData,
66			MediaType: "image/jpeg",
67		},
68	}
69
70	tr := a.convertToToolResult(result)
71	require.False(t, tr.IsError)
72	require.Equal(t, validData, tr.Data)
73	require.Equal(t, "image/jpeg", tr.MIMEType)
74	require.Equal(t, "Loaded image/jpeg content", tr.Content)
75}
76
77func TestConvertToToolResult_ASCIIButInvalidBase64(t *testing.T) {
78	t.Parallel()
79
80	a := &sessionAgent{}
81	result := fantasy.ToolResultContent{
82		ToolCallID: "call_abc",
83		ToolName:   "mcp_tool",
84		Result: fantasy.ToolResultOutputContentMedia{
85			Data:      "not-valid-base64!!!",
86			MediaType: "image/png",
87		},
88	}
89
90	tr := a.convertToToolResult(result)
91	require.True(t, tr.IsError)
92	require.Empty(t, tr.Data)
93	require.Contains(t, tr.Content, "invalid encoding")
94}