"""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()