"""Integration tests for the full pipeline CRUD + execution flow.""" import time import uuid import requests def _unique_id(): return str(uuid.uuid4()) def test_full_pipeline_lifecycle(pipeline_server): """Create, list, get, run, poll, log, delete a pipeline end-to-end.""" base = pipeline_server.base_url pipeline_id = _unique_id() # --- Create pipeline --- pipeline = { "id": pipeline_id, "name": "integration-test-pipeline", "working_dir": "/tmp", "prompts": [ {"id": _unique_id(), "text": "echo step1", "title": "Step 1", "order": 0}, {"id": _unique_id(), "text": "echo step2", "title": "Step 2", "order": 1}, {"id": _unique_id(), "text": "echo step3", "title": "Step 3", "order": 2}, ], } resp = requests.post(f"{base}/api/pipelines", json=pipeline) assert resp.status_code == 200 created = resp.json() assert created["id"] == pipeline_id assert created["name"] == "integration-test-pipeline" assert len(created["prompts"]) == 3 # --- List pipelines --- resp = requests.get(f"{base}/api/pipelines") assert resp.status_code == 200 pipelines = resp.json() assert any(p["id"] == pipeline_id for p in pipelines) # --- Get single pipeline --- resp = requests.get(f"{base}/api/pipelines/{pipeline_id}") assert resp.status_code == 200 fetched = resp.json() assert fetched["id"] == pipeline_id assert fetched["name"] == "integration-test-pipeline" assert len(fetched["prompts"]) == 3 assert fetched["prompts"][0]["order"] == 0 # --- Start a run --- resp = requests.post(f"{base}/api/runs", json={"pipeline_id": pipeline_id}) assert resp.status_code == 200 run_data = resp.json() run_id = run_data["run_id"] assert run_id assert run_data["status"] == "running" # --- Poll run status until completed --- for _ in range(60): resp = requests.get(f"{base}/api/runs/{run_id}/status") assert resp.status_code == 200 status_data = resp.json() if status_data["status"] in ("completed", "error"): break time.sleep(0.5) else: pytest.fail("Run did not complete within timeout") assert status_data["status"] == "completed" assert len(status_data["steps"]) == 3 # --- Get log --- resp = requests.get(f"{base}/api/runs/{run_id}/log") assert resp.status_code == 200 assert len(resp.text) > 0 # --- Delete pipeline --- resp = requests.delete(f"{base}/api/pipelines/{pipeline_id}") assert resp.status_code == 200 assert resp.json()["deleted"] == pipeline_id # --- Verify deletion --- resp = requests.get(f"{base}/api/pipelines/{pipeline_id}") assert resp.status_code == 404