import asyncio from uuid import uuid4 from fastapi import FastAPI from fastapi.testclient import TestClient from app.api.v1.endpoints import operational_tasks as endpoints from tests.unit.test_task_questions import setup, finish def test_question_http_contract_waits_and_resumes_original_task(monkeypatch): service, repo, task_id, command = setup() app = FastAPI() app.include_router(endpoints.router) monkeypatch.setattr(endpoints, "_service", lambda *_args: service) # Exercise HTTP parsing and response contracts; service tests cover authorization. for route in app.routes: if getattr(route, "name", "") in {"create_operational_task_question", "answer_operational_task_question"}: for dependency in route.dependant.dependencies: app.dependency_overrides[dependency.call] = lambda: None with TestClient(app) as client: path = f"/operational-tasks/{task_id}/questions" invalid = client.post(path, json={**command.model_dump(mode="json"), "project_id": str(uuid4())}) assert invalid.status_code == 422 created = client.post(path, json=command.model_dump(mode="json")) assert created.status_code == 200, created.text question_id = created.json()["question_request_id"] asyncio.run(finish(service, repo, task_id)) answered = client.post(f"{path}/{question_id}/answer", json={ "request_id": str(uuid4()), "expected_version": 1, "answers": [{"question_id": "flow", "selected_option_ids": ["unknown"], "custom_text": ""}], }) assert answered.status_code == 200, answered.text result = answered.json() assert result["task_id"] == str(task_id) and result["execution_generation"] == 2 assert result["active_run"]["status"] == "queued" assert result["questions"][0]["status"] == "answered" assert result["questions"][0]["answered_by"] == service._actor() assert result["evidence"] == []