This commit is contained in:
Binary file not shown.
@@ -49,6 +49,29 @@ def mission_id(api):
|
||||
return resolve_mission_id(api)
|
||||
|
||||
|
||||
def clear_queue(api: requests.Session) -> None:
|
||||
api.delete(f"{BASE}/api/mission_queue", timeout=TIMEOUT)
|
||||
|
||||
|
||||
def wait_runner_state(api: requests.Session, state: str, timeout: float = 8.0) -> dict:
|
||||
deadline = time.time() + timeout
|
||||
while time.time() < deadline:
|
||||
runner = api.get(f"{BASE}/api/mission_queue", timeout=TIMEOUT).json().get("runner", {})
|
||||
if runner.get("state") == state:
|
||||
return runner
|
||||
time.sleep(0.15)
|
||||
pytest.fail(f"runner did not reach state {state!r} within {timeout}s")
|
||||
|
||||
|
||||
def enqueue_mission(api: requests.Session, mission_id: str) -> None:
|
||||
r = api.post(
|
||||
f"{BASE}/api/mission_queue",
|
||||
json={"mission_id": mission_id},
|
||||
timeout=TIMEOUT,
|
||||
)
|
||||
assert r.status_code == 201
|
||||
|
||||
|
||||
def test_health(api):
|
||||
r = api.get(f"{BASE}/api/health", timeout=TIMEOUT)
|
||||
assert r.status_code == 200
|
||||
@@ -80,20 +103,9 @@ def test_mir_v2_enqueue_and_list(api, mission_id):
|
||||
|
||||
|
||||
def test_queue_pause_continue(api, mission_id):
|
||||
api.delete(f"{BASE}/api/mission_queue", timeout=TIMEOUT)
|
||||
api.post(
|
||||
f"{BASE}/api/mission_queue",
|
||||
json={"mission_id": mission_id},
|
||||
timeout=TIMEOUT,
|
||||
)
|
||||
deadline = time.time() + 5
|
||||
while time.time() < deadline:
|
||||
runner = api.get(f"{BASE}/api/mission_queue", timeout=TIMEOUT).json().get("runner", {})
|
||||
if runner.get("state") == "running":
|
||||
break
|
||||
time.sleep(0.2)
|
||||
else:
|
||||
pytest.skip("runner did not enter running state in time")
|
||||
clear_queue(api)
|
||||
enqueue_mission(api, mission_id)
|
||||
wait_runner_state(api, "running", timeout=5)
|
||||
|
||||
r = api.post(f"{BASE}/api/mission_queue/pause", timeout=TIMEOUT)
|
||||
assert r.status_code == 200
|
||||
@@ -104,6 +116,48 @@ def test_queue_pause_continue(api, mission_id):
|
||||
assert r.json().get("state") != "paused"
|
||||
|
||||
|
||||
def test_queue_cancel_rejects_when_idle(api):
|
||||
clear_queue(api)
|
||||
r = api.post(f"{BASE}/api/mission_queue/cancel", timeout=TIMEOUT)
|
||||
assert r.status_code == 400
|
||||
body = r.json()
|
||||
assert "error" in body
|
||||
|
||||
|
||||
def test_queue_cancel_stops_running_mission(api, mission_id):
|
||||
clear_queue(api)
|
||||
enqueue_mission(api, mission_id)
|
||||
wait_runner_state(api, "running", timeout=5)
|
||||
|
||||
r = api.post(f"{BASE}/api/mission_queue/cancel", timeout=TIMEOUT)
|
||||
assert r.status_code == 200
|
||||
assert r.json().get("message")
|
||||
|
||||
wait_runner_state(api, "idle", timeout=8)
|
||||
data = api.get(f"{BASE}/api/mission_queue", timeout=TIMEOUT).json()
|
||||
assert data["runner"]["state"] == "idle"
|
||||
|
||||
cancelled = [item for item in data.get("queue", []) if item.get("status") == "cancelled"]
|
||||
assert cancelled, "expected a cancelled queue entry"
|
||||
assert cancelled[0].get("mission_id") == mission_id
|
||||
log = cancelled[0].get("log") or []
|
||||
assert any(entry.get("message") == "Mission hủy bởi operator" for entry in log if isinstance(entry, dict))
|
||||
|
||||
|
||||
def test_queue_cancel_rejects_while_cancelling(api, mission_id):
|
||||
clear_queue(api)
|
||||
enqueue_mission(api, mission_id)
|
||||
wait_runner_state(api, "running", timeout=5)
|
||||
|
||||
first = api.post(f"{BASE}/api/mission_queue/cancel", timeout=TIMEOUT)
|
||||
assert first.status_code == 200
|
||||
|
||||
second = api.post(f"{BASE}/api/mission_queue/cancel", timeout=TIMEOUT)
|
||||
assert second.status_code == 400
|
||||
|
||||
wait_runner_state(api, "idle", timeout=8)
|
||||
|
||||
|
||||
def test_modbus_trigger_flow(api, mission_id):
|
||||
trig = api.post(
|
||||
f"{BASE}/api/triggers",
|
||||
|
||||
Reference in New Issue
Block a user