import json from rpa_yisaiqi.callback_client import StateCenterClient class FakeHttp: def __init__(self, responses=None): self.requests = [] self.responses = list(responses or [{"ok": True}]) def __call__(self, request, timeout): body = json.loads(request.data.decode("utf-8")) if request.data else None self.requests.append({ "url": request.full_url, "method": request.get_method(), "body": body, "headers": dict(request.header_items()), }) return FakeResponse(self.responses.pop(0)) class FakeResponse: def __init__(self, payload): self.payload = payload def __enter__(self): return self def __exit__(self, exc_type, exc, tb): return False def read(self): return json.dumps(self.payload).encode("utf-8") def test_get_job_uses_get_and_token(): http = FakeHttp([{"job": {"job_id": "JOB-1"}, "tasks": []}]) client = StateCenterClient("http://state-center:8000", "dev-agent-token", opener=http) result = client.get_job("JOB-1") assert result["job"]["job_id"] == "JOB-1" assert http.requests[0]["method"] == "GET" assert http.requests[0]["url"] == "http://state-center:8000/api/jobs/JOB-1" assert http.requests[0]["headers"]["X-agent-token"] == "dev-agent-token" def test_ingest_items_posts_rows(): http = FakeHttp([{"ok": True, "inserted": 1}]) client = StateCenterClient("http://state-center:8000", "dev-agent-token", opener=http) client.ingest_items("JOB-1", [{"orderNo": "DD-1", "rawProductName": "阿卡波糖片", "qty": 1}]) assert http.requests[0]["url"].endswith("/api/jobs/JOB-1/items") assert http.requests[0]["body"]["replace"] is True assert http.requests[0]["body"]["rows"][0]["orderNo"] == "DD-1" def test_match_run_and_retry_and_task_submit(): http = FakeHttp([ {"ok": True, "next_node": "CONTRACT_CREATE"}, {"ok": True, "attempt_no": 2}, {"ok": True, "next_node": "CONTRACT_CREATE"}, {"ok": True, "next_node": "REBATE_HEADER"}, ]) client = StateCenterClient("http://state-center:8000", "dev-agent-token", opener=http) assert client.match_run("JOB-1")["next_node"] == "CONTRACT_CREATE" assert client.retry_job("JOB-1")["attempt_no"] == 2 assert client.submit_task("T-1", "CONFIRM_AND_CONTINUE", {}, "tok")["next_node"] == "CONTRACT_CREATE" assert client.check_contract_result("JOB-1", True)["next_node"] == "REBATE_HEADER" assert http.requests[0]["url"].endswith("/api/jobs/JOB-1/match/run") assert http.requests[1]["url"].endswith("/api/jobs/JOB-1/retry") assert http.requests[2]["url"].endswith("/api/tasks/T-1/submit") assert http.requests[2]["body"]["action"] == "CONFIRM_AND_CONTINUE" assert http.requests[3]["url"].endswith("/nodes/CONTRACT_APPROVE_WAIT/check-result") assert http.requests[3]["body"]["approved"] is True