104 lines
3.5 KiB
Python
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")
|