server_wording_test.go

 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}