- Updated architecture documentation to include details on UI rendering checks and Playwright end-to-end tests. - Revised testing documentation to specify Playwright for frontend E2E tests and added details on running tests. - Implemented feedback mechanism in scenario form for successful creation notifications. - Added feedback div in ScenarioForm.html for user notifications. - Created new fixtures for Playwright tests to manage server and browser instances. - Developed comprehensive E2E tests for consumption, costs, equipment, maintenance, production, and scenarios. - Added smoke tests to verify UI page loading and form submissions. - Enhanced unit tests for simulation and validation, including new tests for report generation and validation errors. - Created new test files for router validation to ensure consistent error handling. - Established a new test suite for UI routes to validate dashboard and reporting functionalities. - Implemented validation tests to ensure proper handling of JSON payloads.
96 lines
3.6 KiB
Python
96 lines
3.6 KiB
Python
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
|