from uuid import uuid4 import pytest from fastapi.testclient import TestClient @pytest.fixture def client(api_client: TestClient) -> TestClient: return api_client def _create_scenario(client: TestClient) -> int: payload = { "name": f"Production Scenario {uuid4()}", "description": "Scenario for production tests", } response = client.post("/api/scenarios/", json=payload) assert response.status_code == 200 return response.json()["id"] def test_create_production_record(client: TestClient) -> None: scenario_id = _create_scenario(client) payload: dict[str, any] = { "scenario_id": scenario_id, "amount": 475.25, "description": "Daily output", "unit_name": "Tonnes", "unit_symbol": "t", } response = client.post("/api/production/", json=payload) assert response.status_code == 201 created = response.json() assert created["scenario_id"] == scenario_id assert created["amount"] == pytest.approx(475.25) assert created["description"] == "Daily output" assert created["unit_symbol"] == "t" def test_list_production_filters_by_scenario(client: TestClient) -> None: target_scenario = _create_scenario(client) other_scenario = _create_scenario(client) for scenario_id, amount in [(target_scenario, 100.0), (target_scenario, 150.0), (other_scenario, 200.0)]: response = client.post( "/api/production/", json={ "scenario_id": scenario_id, "amount": amount, "description": f"Output {amount}", "unit_name": "Kilograms", "unit_symbol": "kg", }, ) assert response.status_code == 201 list_response = client.get("/api/production/") assert list_response.status_code == 200 items = [item for item in list_response.json() if item["scenario_id"] == target_scenario] assert {item["amount"] for item in items} == {100.0, 150.0} def test_create_production_rejects_negative_amount(client: TestClient) -> None: scenario_id = _create_scenario(client) response = client.post( "/api/production/", json={ "scenario_id": scenario_id, "amount": -5, "description": "Invalid output", }, ) assert response.status_code == 422