| 2331 | } |
| 2332 | |
| 2333 | func TestSetErrorPreservesContent(t *testing.T) { |
| 2334 | for _, tt := range []struct { |
| 2335 | name string |
| 2336 | content []Content |
| 2337 | err error |
| 2338 | wantContent string |
| 2339 | }{ |
| 2340 | { |
| 2341 | name: "nil content", |
| 2342 | err: errors.New("internal failure"), |
| 2343 | wantContent: "internal failure", |
| 2344 | }, |
| 2345 | { |
| 2346 | name: "empty slice content", |
| 2347 | content: []Content{}, |
| 2348 | err: errors.New("internal failure"), |
| 2349 | wantContent: "internal failure", |
| 2350 | }, |
| 2351 | { |
| 2352 | name: "existing content preserved", |
| 2353 | content: []Content{&TextContent{Text: "user-friendly msg"}}, |
| 2354 | err: errors.New("db timeout"), |
| 2355 | wantContent: "user-friendly msg", |
| 2356 | }, |
| 2357 | } { |
| 2358 | t.Run(tt.name, func(t *testing.T) { |
| 2359 | res := CallToolResult{Content: tt.content} |
| 2360 | res.SetError(tt.err) |
| 2361 | if !res.IsError { |
| 2362 | t.Fatal("want IsError=true") |
| 2363 | } |
| 2364 | if got := res.Content[0].(*TextContent).Text; got != tt.wantContent { |
| 2365 | t.Errorf("Content text = %q, want %q", got, tt.wantContent) |
| 2366 | } |
| 2367 | if got := res.GetError(); got != tt.err { |
| 2368 | t.Errorf("GetError() = %v, want %v", got, tt.err) |
| 2369 | } |
| 2370 | }) |
| 2371 | } |
| 2372 | } |
| 2373 | |
| 2374 | var ctrCmpOpts = []cmp.Option{cmp.AllowUnexported(CallToolResult{})} |