from datetime import datetime from types import SimpleNamespace from unittest.mock import MagicMock, patch from django.test import SimpleTestCase from mcp_server.tools.wprs import get_wpr, search_wprs def material(material_id="100", name="成品"): return SimpleNamespace( id=material_id, name=name, model="M-1", specification="S-1", ) def wpr(**overrides): values = { "id": "200", "number": "WPR-001", "number_out": "OUT-001", "version": 1, "state": 10, "get_state_display": lambda: "正常", "material": material(), "material_start": material("101", "原料"), "wm_id": "300", "wm": SimpleNamespace(batch="WP-001"), "mb_id": None, "mb": None, "wpr_from_id": None, "wpr_from": None, "oinfo": {"test": "ok"}, "data": {"route": []}, "pre_info": {"tooling": "T-1"}, "create_time": datetime(2026, 8, 1, 8, 0), "update_time": datetime(2026, 8, 10, 8, 0), } values.update(overrides) return SimpleNamespace(**values) class WprToolTests(SimpleTestCase): @patch("mcp_server.tools.wprs._base_queryset") @patch("mcp_server.tools.wprs.authenticated_factory_user") def test_search_returns_read_only_summary(self, _user_mock, queryset_mock): queryset = MagicMock() queryset.filter.return_value = queryset queryset.distinct.return_value = queryset queryset.order_by.return_value = queryset queryset.__getitem__.return_value = [wpr()] queryset_mock.return_value = queryset result = search_wprs(query="WPR", location="workshop", limit=10) self.assertEqual(result["items"][0]["number"], "WPR-001") self.assertEqual(result["items"][0]["workshop_batch"], "WP-001") self.assertNotIn("data", result["items"][0]) self.assertNotIn("pre_info", result["items"][0]) @patch("mcp_server.tools.wprs.WprDefect.objects.filter") @patch("mcp_server.tools.wprs._base_queryset") @patch("mcp_server.tools.wprs.authenticated_factory_user") def test_get_returns_business_detail( self, _user_mock, queryset_mock, defect_filter_mock, ): item = wpr() queryset = MagicMock() queryset.filter.return_value.order_by.return_value.first.return_value = item queryset_mock.return_value = queryset defect_filter_mock.return_value.select_related.return_value.values.return_value = [ { "defect_id": "400", "defect__name": "划伤", "is_main": True, } ] result = get_wpr("WPR-001") self.assertEqual(result["material"]["name"], "成品") self.assertEqual(result["defects"][0]["defect__name"], "划伤") self.assertEqual(result["pre_info"]["tooling"], "T-1") @patch("mcp_server.tools.wprs._base_queryset") @patch("mcp_server.tools.wprs.authenticated_factory_user") def test_get_reports_missing_wpr(self, _user_mock, queryset_mock): queryset = MagicMock() queryset.filter.return_value.order_by.return_value.first.return_value = None queryset_mock.return_value = queryset with self.assertRaisesRegex(ValueError, "未找到 WPR"): get_wpr("missing") @patch("mcp_server.tools.wprs.authenticated_factory_user") def test_search_rejects_unknown_location(self, _user_mock): with self.assertRaisesRegex(ValueError, "不支持的 WPR 位置"): search_wprs(location="invalid")