from __future__ import annotations from fastapi import FastAPI from fastapi.testclient import TestClient from src.api.v1.agents import router def test_delivery_closure_workbench_endpoint_returns_product_summary(): app = FastAPI() app.include_router(router, prefix="/api/v1") client = TestClient(app) response = client.get("/api/v1/agents/delivery-closure-workbench") assert response.status_code == 200 data = response.json() assert data["schema_version"] == "delivery_closure_workbench_v1" assert data["summary"]["source_count"] == 5 assert data["summary"]["loaded_source_count"] == 5 assert data["summary"]["runtime_execution_authorized"] is False assert data["summary"]["remote_write_authorized"] is True assert data["summary"]["repo_creation_authorized"] is True assert data["summary"]["visibility_change_authorized"] is True assert data["summary"]["refs_sync_authorized"] is True assert data["summary"]["workflow_trigger_authorized"] is True assert data["summary"]["github_write_channel_ready"] is False assert data["summary"]["github_account_status"] == "suspended" assert data["summary"]["github_account_suspended"] is True assert data["summary"]["github_api_forbidden_count"] == 6 assert data["summary"]["github_controlled_apply_ready_count"] == 0 assert data["summary"]["github_blocked_preflight_target_count"] == 5 assert data["summary"]["secret_values_collected"] is False assert data["summary"]["average_completion_percent"] >= 0 assert data["summary"]["high_risk_blocker_count"] > 0 lanes = {lane["id"]: lane for lane in data["lanes"]} sources = {source["id"]: source for source in data["source_statuses"]} assert sorted(lanes) == ["backup", "gitea", "github", "release", "runtime"] assert lanes["release"]["metric"]["kind"] == "blocked_gate" assert lanes["release"]["status"] == "controlled_status_cleanup_package_ready" assert lanes["release"]["blocker_count"] == 0 assert lanes["release"]["metric"]["blocked"] == 0 assert lanes["release"]["metric"]["total"] == 5 assert lanes["github"]["metric"]["kind"] == "private_backup_verified" assert lanes["gitea"]["metric"]["kind"] == "workflow_count" assert lanes["runtime"]["metric"]["kind"] == "surface_count" assert lanes["backup"]["metric"]["kind"] == "readiness_row_count" assert sources["github_private_backup"]["loaded"] is True assert ( sources["github_private_backup"]["schema_version"] == "github_target_private_backup_evidence_gate_v1" ) assert sources["github_private_backup"]["missing_reason"] == "" assert lanes["github"]["blocker_count"] == 5 assert ( lanes["github"]["status"] == "blocked_github_account_suspended_and_write_channel_required" ) assert lanes["github"]["metric"]["verified"] == 4 assert lanes["github"]["metric"]["total"] == 9 assert lanes["github"]["metric"]["controlled_apply_ready"] == 0 assert lanes["github"]["metric"]["blocked_preflight"] == 5 assert lanes["github"]["metric"]["write_channel_ready"] is False assert lanes["github"]["metric"]["github_account_status"] == "suspended" assert lanes["github"]["metric"]["github_account_suspended"] is True assert all(0 <= lane["completion_percent"] <= 100 for lane in lanes.values()) assert all(lane["tone"] in {"ok", "warn", "danger"} for lane in lanes.values()) boundaries = data["operation_boundaries"] assert boundaries["read_only_api_allowed"] is True assert boundaries["runtime_write_allowed"] is False assert boundaries["remote_write_allowed"] is True assert boundaries["repo_creation_allowed"] is True assert boundaries["visibility_change_allowed"] is True assert boundaries["refs_sync_allowed"] is True assert boundaries["workflow_trigger_allowed"] is True assert boundaries["github_write_channel_ready"] is False assert boundaries["github_controlled_apply_allowed"] is False assert boundaries["secret_value_collection_allowed"] is False assert boundaries["backup_restore_execution_allowed"] is False assert boundaries["active_scan_allowed"] is False assert "192.168.0." not in response.text