| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- #!/usr/bin/env python3
- """End-to-end test for labor arbitration system: upload -> extract -> portrait -> similar"""
- import json
- import requests
- import sys
- BASE = "http://localhost:8000"
- NLP = "http://localhost:8001"
- def test_health():
- print("=== 0. Health Check ===")
- for name, url in [("Backend", f"{BASE}/health"), ("NLP", f"{NLP}/health")]:
- try:
- r = requests.get(url, timeout=5)
- print(f" {name}: {r.json()}")
- except Exception as e:
- print(f" {name}: ERROR - {e}")
- return False
- return True
- def test_upload():
- print("\n=== 1. Upload Case ===")
- text = (
- "申请人:张明,男,汉族,1990年5月15日出生。\n"
- "被申请人:北京恒达科技有限公司,住所北京市海淀区中关村大街1号。\n\n"
- "请求事项:\n"
- "1、请求支付拖欠工资8000元。\n"
- "2、请求支付违法解除劳动合同赔偿金24000元。\n\n"
- "事实与理由:申请人于2020年3月1日入职被申请人处,担任软件工程师,"
- "月工资12000元。2023年6月被申请人无故辞退申请人,"
- "且拖欠2023年5月、6月工资合计8000元。\n\n"
- "依据《劳动合同法》第四十七条、第八十七条规定。"
- )
- files = {"files": ("test_case.txt", text.encode("utf-8"), "text/plain")}
- data = {"case_name": "张明诉北京恒达科技劳动仲裁案"}
- try:
- r = requests.post(f"{BASE}/api/cases/upload", files=files, data=data, timeout=60)
- result = r.json()
- print(f" Status: {r.status_code}")
- # Extract case_id from various possible locations
- case_id = result.get("id") or result.get("case_id")
- if not case_id and "case" in result:
- case_id = result["case"].get("id")
- if not case_id:
- case_id = result.get("case_id_from_task")
- print(f" Case ID: {case_id}")
- if "elements" in result:
- el = result["elements"]
- print(f" Case Cause: {el.get('case_cause', 'N/A')}")
- print(f" Applicant: {el.get('applicant_name', 'N/A')}")
- print(f" Respondent: {el.get('respondent_name', 'N/A')}")
- return case_id
- except Exception as e:
- print(f" ERROR: {e}")
- import traceback
- traceback.print_exc()
- return None
- def test_elements(case_id):
- print(f"\n=== 2. Get Elements (case {case_id}) ===")
- try:
- r = requests.get(f"{BASE}/api/cases/{case_id}/elements", timeout=30)
- result = r.json()
- print(f" Status: {r.status_code}")
- # Show top-level fields
- show_keys = [
- "case_cause", "applicant_name", "respondent_name",
- "entry_date", "leave_date", "month_salary",
- "worker_position", "contract_type", "law_refs",
- "primary_cause_type",
- ]
- for k in show_keys:
- v = result.get(k, "N/A")
- print(f" {k}: {v}")
- # Show claims
- claims = result.get("claims", {})
- if claims:
- print(f" claims: {claims}")
- # Check element table
- table = result.get("case_elements_table", {})
- if table:
- print(f" Element table: {table.get('field_count', 0)} fields")
- return result
- except Exception as e:
- print(f" ERROR: {e}")
- return None
- def test_portrait(case_id):
- print(f"\n=== 3. Get Portrait (case {case_id}) ===")
- try:
- r = requests.get(f"{BASE}/api/cases/{case_id}/portrait", timeout=30)
- result = r.json()
- print(f" Status: {r.status_code}")
- if "legal_score" in result:
- print(f" Legal Score: {result['legal_score']}/100")
- if "fact_score" in result:
- print(f" Fact Score: {result['fact_score']}/100")
- if "risk_score" in result:
- print(f" Risk Score: {result['risk_score']}/100")
- if "risk_level" in result:
- print(f" Risk Level: {result['risk_level']}")
- if "tags" in result:
- print(f" Tags: {result['tags'][:5] if isinstance(result['tags'], list) else result['tags']}")
- if "keywords" in result:
- kws = result["keywords"]
- if isinstance(kws, list):
- print(f" Keywords (top 10): {[kw['word'] for kw in kws[:10]]}")
- return result
- except Exception as e:
- print(f" ERROR: {e}")
- return None
- def test_similar(case_id):
- print(f"\n=== 4. Similar Cases (case {case_id}) ===")
- try:
- r = requests.post(
- f"{BASE}/api/cases/{case_id}/similar",
- json={"top_k": 3},
- timeout=30,
- )
- result = r.json()
- print(f" Status: {r.status_code}")
- if isinstance(result, list):
- print(f" Found {len(result)} similar cases")
- for i, case in enumerate(result[:3]):
- sim = case.get("similarity", case.get("score", 0))
- name = case.get("case_name", case.get("name", "unknown"))
- print(f" [{i+1}] {name} (similarity: {sim})")
- elif isinstance(result, dict):
- cases = result.get("cases", result.get("results", []))
- print(f" Found {len(cases)} similar cases")
- return result
- except Exception as e:
- print(f" ERROR: {e}")
- return None
- def test_nlp_service():
- print("\n=== 5. NLP Service Direct Test ===")
- text = (
- "申请人:张明,男,汉族,1990年5月15日出生。"
- "被申请人:北京恒达科技有限公司,住所北京市海淀区中关村大街1号。"
- "请求事项:1、请求支付拖欠工资8000元。"
- "2、请求支付违法解除劳动合同赔偿金24000元。"
- "事实与理由:申请人于2020年3月1日入职被申请人处,担任软件工程师,"
- "月工资12000元。2023年6月被申请人无故辞退申请人。"
- "依据《劳动合同法》第四十七条、第八十七条规定。"
- )
- try:
- r = requests.post(f"{NLP}/extract", json={"text": text}, timeout=60)
- result = r.json()
- print(f" Status: {r.status_code}")
- cause = result.get("case_cause", {}).get("type", "N/A")
- print(f" Case Cause: {cause}")
- parties = result.get("parties", {})
- print(f" Applicant: {parties.get('applicant_name', 'N/A')}")
- print(f" Respondent: {parties.get('respondent_name', 'N/A')}")
- facts = result.get("facts", {})
- print(f" Entry Date: {facts.get('entry_date', 'N/A')}")
- print(f" Month Salary: {facts.get('month_salary', 'N/A')}")
- return result
- except Exception as e:
- print(f" ERROR: {e}")
- return None
- def main():
- print("=" * 60)
- print("LABOR ARBITRATION SYSTEM - E2E TEST")
- print("=" * 60)
- if not test_health():
- print("\n[FAIL] Services not running!")
- print("Start them first:")
- print(" cd backend && uvicorn app.main:app --port 8000")
- print(" cd nlp-service && uvicorn app.main:app --port 8001")
- sys.exit(1)
- case_id = test_upload()
- if case_id:
- test_elements(case_id)
- test_portrait(case_id)
- test_similar(case_id)
- test_nlp_service()
- print("\n" + "=" * 60)
- print("E2E TEST COMPLETE")
- print("=" * 60)
- print(f"Frontend: http://localhost:5173")
- print(f"Backend: http://localhost:8000")
- print(f"NLP: http://localhost:8001")
- print(f"API Docs: http://localhost:8000/docs")
- if __name__ == "__main__":
- main()
|