AutoRpa/rpa_yisaiqi/tests/test_callback_client.py

79 lines
2.9 KiB
Python

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