1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
2//
3// SPDX-License-Identifier: LicenseRef-MutuaL-1.2
4
5package mcp
6
7import (
8 "context"
9 "strings"
10 "testing"
11)
12
13// tools.READ_TOOL.1 tools.SCHEMA.4 tools.RESPONSES.6
14func TestCallToolACIDToolsReadTool1RejectsUnsupportedTargetBeforeCallingCooked(t *testing.T) {
15 backend := &fakeBackend{}
16 server := NewServer(backend, "test")
17
18 _, err := server.CallReadTool(context.Background(), ReadArguments{Target: "meal_plan"})
19 if err == nil {
20 t.Fatal("CallReadTool() error = nil, want unsupported target error")
21 }
22 if err.Error() != `unsupported read target "meal_plan" (supported: shopping_list, recipes, recipe)` {
23 t.Fatalf("CallReadTool() error = %q", err.Error())
24 }
25 if backend.readShoppingListCalls != 0 || backend.metadataCalls != 0 || backend.contentCalls != 0 {
26 t.Fatalf(
27 "backend calls = shopping list %d metadata %d content %d, want none",
28 backend.readShoppingListCalls,
29 backend.metadataCalls,
30 backend.contentCalls,
31 )
32 }
33}
34
35// recipes.SAVE.10 tools.SCHEMA.4 tools.RESPONSES.6
36func TestCallToolACIDRecipesSave10RejectsUnsupportedSourceBeforeCallingCooked(t *testing.T) {
37 backend := &fakeBackend{}
38 server := NewServer(backend, "test")
39
40 _, _, err := server.callSaveRecipeTool(context.Background(), nil, SaveRecipeArguments{Source: "unsupported"})
41 if err == nil {
42 t.Fatal("callSaveRecipeTool() error = nil, want unsupported source error")
43 }
44 if err.Error() != `unsupported save_recipe source "unsupported" (supported: raw_text, prepared, url, draft, existing)` {
45 t.Fatalf("callSaveRecipeTool() error = %q", err.Error())
46 }
47 if backend.saveCalls != 0 || backend.draftSaveCalls != 0 {
48 t.Fatalf("save calls = prepared %d draft %d, want none", backend.saveCalls, backend.draftSaveCalls)
49 }
50}
51
52// tools.SCHEMA.3 tools.SCHEMA.5 tools.SAVE_RECIPE_TOOL.1 tools.CHANGE_SHOPPING_LIST_TOOL.1
53func TestToolDescriptionsACIDToolsSchema3And5DescribeCurrentLimits(t *testing.T) {
54 save := saveRecipeTool()
55 for _, want := range []string{
56 "raw text",
57 "prepared markdown",
58 "URL import",
59 "reviewed URL-import draft",
60 "existing recipe update",
61 "draft_id",
62 } {
63 if !strings.Contains(save.Description, want) {
64 t.Fatalf("save_recipe description missing %q: %q", want, save.Description)
65 }
66 }
67
68 shopping := changeShoppingListTool()
69 for _, want := range []string{
70 "add",
71 "update_item",
72 "replace_selection",
73 "add_selection",
74 "remove_selection",
75 "remove",
76 "clear",
77 "Remove and clear are destructive",
78 "put quantities before names",
79 "milk — 1",
80 } {
81 if !strings.Contains(shopping.Description, want) {
82 t.Fatalf("change_shopping_list description missing %q: %q", want, shopping.Description)
83 }
84 }
85}