summaryrefslogtreecommitdiff
path: root/mcp_server/tests.py
blob: cd13383fe152f088de55fa5931e854bae576ea8a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
"""Tests for the FoodClient HTTP layer, using httpx.MockTransport (no network,
no Django, no fastmcp). Run with: python -m unittest mcp_server.tests
"""
import json
import unittest

import httpx

from mcp_server.client import FoodClient, FoodApiError


def make_client(handler):
    transport = httpx.MockTransport(handler)
    http = httpx.Client(
        transport=transport,
        base_url="http://api.test/api",
        headers={"Authorization": "Token x"},
    )
    return FoodClient(http=http)


class FoodClientTests(unittest.TestCase):
    def test_set_state_posts_expected_body(self):
        captured = {}

        def handler(request):
            captured["path"] = request.url.path
            captured["body"] = json.loads(request.content)
            return httpx.Response(200, json={"state": "out"})

        out = make_client(handler).set_state("noodles", "out", location="cupboard")
        self.assertEqual(captured["path"], "/api/pantry/set-state/")
        self.assertEqual(
            captured["body"],
            {"ingredient": "noodles", "state": "out", "location": "cupboard"},
        )
        self.assertEqual(out["state"], "out")

    def test_set_state_omits_location_when_absent(self):
        captured = {}

        def handler(request):
            captured["body"] = json.loads(request.content)
            return httpx.Response(200, json={})

        make_client(handler).set_state("eggs", "in")
        self.assertNotIn("location", captured["body"])

    def test_bulk_add_wraps_items(self):
        captured = {}

        def handler(request):
            captured["body"] = json.loads(request.content)
            return httpx.Response(201, json={"added": 1})

        make_client(handler).bulk_add([{"ingredient_name": "eggs"}])
        self.assertEqual(captured["body"], {"items": [{"ingredient_name": "eggs"}]})

    def test_what_can_i_cook_passes_servings(self):
        captured = {}

        def handler(request):
            captured["servings"] = request.url.params.get("servings")
            return httpx.Response(200, json={"results": []})

        make_client(handler).what_can_i_cook(servings=4)
        self.assertEqual(captured["servings"], "4")

    def test_error_response_raises(self):
        def handler(request):
            return httpx.Response(404, json={"error": "nope"})

        with self.assertRaises(FoodApiError):
            make_client(handler).set_state("x", "out")

    def test_unreachable_api_raises(self):
        def handler(request):
            raise httpx.ConnectError("boom")

        with self.assertRaises(FoodApiError):
            make_client(handler).pantry()


if __name__ == "__main__":
    unittest.main()