from typing import Any, Dict import pytest from fastapi.testclient import TestClient @pytest.mark.usefixtures("invalid_request_payloads") def test_duplicate_scenario_returns_400( api_client: TestClient, invalid_request_payloads: Dict[str, Any] ) -> None: payload = invalid_request_payloads["scenario_duplicate"] response = api_client.post("/api/scenarios/", json=payload) assert response.status_code == 400 body = response.json() assert body["detail"] == "Scenario already exists" @pytest.mark.usefixtures("invalid_request_payloads") def test_parameter_create_missing_scenario_returns_404( api_client: TestClient, invalid_request_payloads: Dict[str, Any] ) -> None: payload = invalid_request_payloads["parameter_missing_scenario"] response = api_client.post("/api/parameters/", json=payload) assert response.status_code == 404 assert response.json()["detail"] == "Scenario not found" @pytest.mark.usefixtures("invalid_request_payloads") def test_parameter_create_invalid_distribution_is_422( api_client: TestClient ) -> None: response = api_client.post( "/api/parameters/", json={ "scenario_id": 1, "name": "Bad Dist", "value": 2.0, "distribution_type": "invalid", }, ) assert response.status_code == 422 errors = response.json()["detail"] assert any("distribution_type" in err["loc"] for err in errors) @pytest.mark.usefixtures("invalid_request_payloads") def test_simulation_unknown_scenario_returns_404( api_client: TestClient, invalid_request_payloads: Dict[str, Any] ) -> None: payload = invalid_request_payloads["simulation_unknown_scenario"] response = api_client.post("/api/simulations/run", json=payload) assert response.status_code == 404 assert response.json()["detail"] == "Scenario not found" @pytest.mark.usefixtures("invalid_request_payloads") def test_simulation_missing_parameters_returns_400( api_client: TestClient, invalid_request_payloads: Dict[str, Any] ) -> None: payload = invalid_request_payloads["simulation_missing_parameters"] response = api_client.post("/api/simulations/run", json=payload) assert response.status_code == 400 assert response.json()["detail"] == "No parameters provided" @pytest.mark.usefixtures("invalid_request_payloads") def test_reporting_summary_rejects_non_list_payload( api_client: TestClient, invalid_request_payloads: Dict[str, Any] ) -> None: payload = invalid_request_payloads["reporting_non_list_payload"] response = api_client.post("/api/reporting/summary", json=payload) assert response.status_code == 400 assert response.json()["detail"] == "Invalid input format" @pytest.mark.usefixtures("invalid_request_payloads") def test_reporting_summary_requires_result_field( api_client: TestClient, invalid_request_payloads: Dict[str, Any] ) -> None: payload = invalid_request_payloads["reporting_missing_result"] response = api_client.post("/api/reporting/summary", json=payload) assert response.status_code == 400 assert "must include numeric 'result'" in response.json()["detail"] @pytest.mark.usefixtures("invalid_request_payloads") def test_maintenance_negative_cost_rejected_by_schema( api_client: TestClient, invalid_request_payloads: Dict[str, Any] ) -> None: payload = invalid_request_payloads["maintenance_negative_cost"] response = api_client.post("/api/maintenance/", json=payload) assert response.status_code == 422 error_locations = [tuple(item["loc"]) for item in response.json()["detail"]] assert ("body", "cost") in error_locations