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}