feat(query-tool): split serial reverse trace tab and use reverse lineage
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""E2E coverage for the Query Tool page (LOT 追蹤 + 設備查詢 tabs)."""
|
||||
"""E2E coverage for the Query Tool page tabs and core query flows."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
@@ -262,10 +262,12 @@ class TestQueryToolPageE2E:
|
||||
heading = page.get_by_role("heading", name="批次追蹤工具")
|
||||
expect(heading).to_be_visible()
|
||||
|
||||
# Both tab buttons should exist
|
||||
lot_tab = page.locator("button", has_text="LOT 追蹤")
|
||||
equipment_tab = page.locator("button", has_text="設備查詢")
|
||||
# All tab buttons should exist
|
||||
lot_tab = page.locator("button", has_text="批次追蹤(正向)")
|
||||
reverse_tab = page.locator("button", has_text="流水批反查(反向)")
|
||||
equipment_tab = page.locator("button", has_text="設備生產批次追蹤")
|
||||
expect(lot_tab).to_be_visible()
|
||||
expect(reverse_tab).to_be_visible()
|
||||
expect(equipment_tab).to_be_visible()
|
||||
|
||||
def test_lot_tab_resolve_work_order(self, page: Page, app_server: str):
|
||||
@@ -388,12 +390,12 @@ class TestQueryToolPageE2E:
|
||||
textarea.fill("GA26010001")
|
||||
|
||||
# Switch to equipment tab
|
||||
equipment_tab = page.locator("button", has_text="設備查詢")
|
||||
equipment_tab = page.locator("button", has_text="設備生產批次追蹤")
|
||||
equipment_tab.click()
|
||||
page.wait_for_timeout(500)
|
||||
|
||||
# Switch back to LOT tab
|
||||
lot_tab = page.locator("button", has_text="LOT 追蹤")
|
||||
lot_tab = page.locator("button", has_text="批次追蹤(正向)")
|
||||
lot_tab.click()
|
||||
page.wait_for_timeout(500)
|
||||
|
||||
|
||||
@@ -59,6 +59,38 @@ def test_seed_resolve_query_tool_success(mock_resolve_lots):
|
||||
assert payload['cache_key'].startswith('trace:seed:query_tool:')
|
||||
|
||||
|
||||
@patch('mes_dashboard.routes.trace_routes.resolve_lots')
|
||||
def test_seed_resolve_query_tool_reverse_success(mock_resolve_lots):
|
||||
mock_resolve_lots.return_value = {
|
||||
'data': [
|
||||
{
|
||||
'container_id': 'CID-SN',
|
||||
'lot_id': 'LOT-SN',
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
client = _client()
|
||||
response = client.post(
|
||||
'/api/trace/seed-resolve',
|
||||
json={
|
||||
'profile': 'query_tool_reverse',
|
||||
'params': {
|
||||
'resolve_type': 'serial_number',
|
||||
'values': ['SN-001'],
|
||||
},
|
||||
},
|
||||
)
|
||||
|
||||
assert response.status_code == 200
|
||||
payload = response.get_json()
|
||||
assert payload['stage'] == 'seed-resolve'
|
||||
assert payload['seed_count'] == 1
|
||||
assert payload['seeds'][0]['container_id'] == 'CID-SN'
|
||||
assert payload['seeds'][0]['container_name'] == 'LOT-SN'
|
||||
assert payload['cache_key'].startswith('trace:seed:query_tool_reverse:')
|
||||
|
||||
|
||||
def test_seed_resolve_invalid_profile_returns_400():
|
||||
client = _client()
|
||||
response = client.post(
|
||||
@@ -122,6 +154,38 @@ def test_lineage_success_returns_forward_tree(mock_resolve_tree):
|
||||
assert payload['names']['CID-A'] == 'LOT-A'
|
||||
|
||||
|
||||
@patch('mes_dashboard.routes.trace_routes.LineageEngine.resolve_full_genealogy')
|
||||
def test_lineage_reverse_profile_returns_ancestors(mock_resolve_genealogy):
|
||||
mock_resolve_genealogy.return_value = {
|
||||
'ancestors': {'CID-SN': {'CID-A', 'CID-B'}},
|
||||
'cid_to_name': {
|
||||
'CID-SN': 'LOT-SN',
|
||||
'CID-A': 'LOT-A',
|
||||
'CID-B': 'LOT-B',
|
||||
},
|
||||
'parent_map': {'CID-SN': ['CID-A'], 'CID-A': ['CID-B']},
|
||||
'merge_edges': {'CID-SN': ['CID-A']},
|
||||
}
|
||||
|
||||
client = _client()
|
||||
response = client.post(
|
||||
'/api/trace/lineage',
|
||||
json={
|
||||
'profile': 'query_tool_reverse',
|
||||
'container_ids': ['CID-SN'],
|
||||
},
|
||||
)
|
||||
|
||||
assert response.status_code == 200
|
||||
payload = response.get_json()
|
||||
assert payload['stage'] == 'lineage'
|
||||
assert payload['roots'] == ['CID-SN']
|
||||
assert sorted(payload['ancestors']['CID-SN']) == ['CID-A', 'CID-B']
|
||||
assert payload['parent_map']['CID-SN'] == ['CID-A']
|
||||
assert payload['merge_edges']['CID-SN'] == ['CID-A']
|
||||
assert payload['names']['CID-A'] == 'LOT-A'
|
||||
|
||||
|
||||
@patch(
|
||||
'mes_dashboard.routes.trace_routes.LineageEngine.resolve_forward_tree',
|
||||
side_effect=TimeoutError('lineage timed out'),
|
||||
|
||||
Reference in New Issue
Block a user