factory/mcp_server/test_wprs.py

104 lines
3.5 KiB
Python

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