| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- """P2-M2 full integration test: project with BC -> generate plan -> create -> download."""
- import json
- import urllib.request
- import urllib.error
- BASE = "http://127.0.0.1:8001"
- def req(method, path, data=None):
- url = BASE + path
- body = json.dumps(data).encode() if data else None
- r = urllib.request.Request(url, data=body, method=method)
- r.add_header("Content-Type", "application/json")
- try:
- with urllib.request.urlopen(r, timeout=10) as resp:
- return json.loads(resp.read())
- except urllib.error.HTTPError as e:
- return {"error": e.code, "body": e.read().decode()}
- # 1. Health
- print("=== 1. Health ===")
- print(req("GET", "/api/health"))
- # 2. Create project with boundary conditions
- print("\n=== 2. Create Project with BC ===")
- proj = req("POST", "/api/projects", {
- "name": "P2-M2 Integration Test",
- "topology": "SSSR",
- "description": "Full integration test for P2-M2",
- "model_path": "models/MARS-12S10P_SSSR_D76-C150_V5.0-0819.mot",
- "boundary_conditions": {
- "topology": "SSSR",
- "outer_diameter_mm": 76,
- "inner_diameter_mm": 40,
- "speed_rpm": 5000,
- "current_a": 21,
- "magnet_temp_c": 100,
- "target_torque_nm": 0.5,
- "target_efficiency_pct": 85,
- },
- })
- print(f"Project ID: {proj.get('id')}")
- print(f"BC: {json.dumps(proj.get('boundary_conditions'), indent=2)}")
- proj_id = proj.get("id")
- # 3. List scan parameters
- print("\n=== 3. Scan Parameters Registry ===")
- params = req("GET", "/api/scan-parameters")
- print(f"Total: {params.get('total')}")
- for p in params.get("parameters", []):
- print(f" {p['name']:25s} [{p['category']:10s}] {p['default_start']:>8.2f} - {p['default_stop']:<8.2f} {p['unit']}")
- # 4. Recommend range for Airgap
- print("\n=== 4. Recommend Range (Airgap) ===")
- rng = req("POST", "/api/recommend-range", {
- "parameter_name": "Airgap",
- "boundary_conditions": {"outer_diameter_mm": 76, "target_torque_nm": 0.5},
- })
- print(f"Airgap: {rng}")
- # 5. Generate plan for project
- print("\n=== 5. Generate Plan for Project ===")
- gen = req("POST", f"/api/projects/{proj_id}/generate-plan", {
- "parameter_names": ["Airgap", "Magnet_Length", "RMSCurrent"],
- })
- print(f"Plan name: {gen.get('name')}")
- print(f"Topology: {gen.get('topology')}")
- print(f"Estimated points: {gen.get('estimated_points')}")
- print(f"Estimated time: {gen.get('estimated_time_min')} min")
- for v in gen.get("variables", []):
- print(f" {v['name']:20s}: start={v['start']:>6.2f}, stop={v['stop']:>6.2f}, step={v['step']:>5.2f}, count={len(v['values']):>3d}")
- print(f" values: {v['values']}")
- print(f" notes: {v.get('recommendation_notes', '')}")
- # 6. Create plan from generated data
- print("\n=== 6. Create Plan ===")
- plan_variables = [
- {"name": v["name"], "display_name": v["display_name"], "unit": v["unit"], "values": v["values"]}
- for v in gen.get("variables", [])
- ]
- created = req("POST", "/api/plans", {
- "project_id": proj_id,
- "name": gen.get("name", "Generated Plan"),
- "plan_data": {
- "model_path": gen.get("model_path", ""),
- "topology": gen.get("topology", "SSSR"),
- "variables": plan_variables,
- "cases": [],
- },
- "notes": "Generated by rule engine",
- })
- print(f"Created plan ID: {created.get('id')}")
- print(f"Plan UUID: {created.get('plan_id')}")
- print(f"Status: {created.get('status')}")
- print(f"Estimated points: {created.get('estimated_points')}")
- plan_id = created.get("id")
- # 7. Download plan (compatible with system two)
- print("\n=== 7. Download Plan (System 2 Compatible) ===")
- dl = req("GET", f"/api/plans/{plan_id}/download")
- print(f"plan_id: {dl.get('plan_id')}")
- plan_data = dl.get("plan_data", {})
- print(f"model_path: {plan_data.get('model_path')}")
- print(f"topology: {plan_data.get('topology')}")
- print(f"variables count: {len(plan_data.get('variables', []))}")
- for v in plan_data.get("variables", []):
- print(f" {v['name']}: {v.get('values', [])}")
- # Verify compatibility: each variable has name, display_name, unit, values
- compat_ok = all(
- "name" in v and "values" in v
- for v in plan_data.get("variables", [])
- )
- print(f"System 2 compatibility: {'OK' if compat_ok else 'FAILED'}")
- # 8. List plans for project
- print("\n=== 8. List Plans ===")
- plans = req("GET", f"/api/plans?project_id={proj_id}")
- print(f"Total plans: {plans.get('total')}")
- for p in plans.get("items", []):
- print(f" #{p['id']}: {p['name']} ({p['plan_id']}) status={p['status']} points={p['estimated_points']}")
- print("\n=== P2-M2 INTEGRATION TESTS ALL PASSED ===")
|