aps-agent/tests/golden/test_empty_seed.py

87 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ============================================================
# 默认空世界:不造演示厂假数据;SQL 投影到主数据页
# ============================================================
from __future__ import annotations
import os
from server.state.seed import build_demo_world, empty_world, purge_demo_residue, seed_world
def test_seed_world_default_empty(monkeypatch):
monkeypatch.delenv("APS_SEED_DEMO", raising=False)
monkeypatch.delenv("APS_SEED_PACK", raising=False)
w = seed_world()
assert w["materials"] == []
assert w["routings"] == []
assert w["flexOrders"] == []
assert (w.get("flexParams") or {}).get("demoDataCleared") is True
assert not any(m.get("code") == "CTRL-A" for m in w["materials"])
def test_purge_demo_residue_strips_controllers():
w = build_demo_world()
assert any(m["code"] == "CTRL-A" for m in w["materials"])
assert purge_demo_residue(w) is True
assert w["materials"] == []
assert w["routings"] == []
assert w["factories"] == []
assert (w.get("flexParams") or {}).get("demoDataCleared") is True
def test_purge_keeps_site_flex_when_classic_is_demo():
"""经典表是演示控制器,但 flex 已是现场订单时,不得清空 flex。"""
w = build_demo_world()
w["flexOrders"] = [{
"id": 1, "orderNo": "SYS202309210001", "productCode": "030129001",
"quantity": 10, "dueDate": "2026-08-01", "status": "RELEASED",
}]
w["flexMaterials"] = [{
"id": 1, "code": "030129001", "name": "支重轮", "type": "FINISHED_PRODUCT",
"unit": "件", "stock": 0, "inTransit": 0, "safetyStock": 0, "procurementLeadTime": 0,
}]
w["flexRoutings"] = [{
"productCode": "030129001", "seq": 10, "operationCode": "NZ0011",
"operationName": "粗车", "stdTimePerUnit": 30,
}]
assert purge_demo_residue(w) is True
assert w["materials"] == [] # 演示经典已剥
assert len(w["flexOrders"]) == 1
assert w["flexOrders"][0]["orderNo"] == "SYS202309210001"
assert w["flexMaterials"][0]["code"] == "030129001"
def test_sql_projects_to_classic_master():
from server.importers.sql_pack import apply_sql_pack_to_world, sql_pack_to_flex
flex = sql_pack_to_flex({
"rowsByTable": {
"pl_order": [{
"code": "ORD1", "material_code": "FG001", "material_name": "成品A",
"quantity": 10, "planned_end_time": "2026-08-01", "is_delete": "0",
"craftl_code": "CRAFT-9", "level": 5,
}],
"md_craftl": [{"code": "CRAFT-9", "product_code": "FG001"}],
"r_production_craftl": [{
"craftl_code": "CRAFT-9", "procedure_code": "OP10", "procedure_name": "粗车",
"output_material_code": "WIP-X", "sort_no": 10, "working_hours": 0.5,
"is_delete": "0",
}],
"md_material": [],
"md_equipment": [{"code": "EQ1", "name": "车床", "is_delete": "0"}],
},
"counts": {},
})
world = empty_world()
# 先塞演示垃圾,确认会被替换掉
world["materials"] = [{
"id": 1, "code": "CTRL-A", "name": "智能控制器A型", "type": "FINISHED_PRODUCT",
"unit": "件", "stock": 1, "inTransit": 0, "safetyStock": 0, "procurementLeadTime": 0,
}]
apply_sql_pack_to_world(world, flex, replace=True)
codes = {m["code"] for m in world["materials"]}
assert "CTRL-A" not in codes
assert "FG001" in codes
assert any(r.get("productId") for r in world["routings"])
assert len(world["routingSteps"]) >= 1