from uuid import uuid4 from fastapi.testclient import TestClient from config.database import Base, engine from main import app def setup_module(module): Base.metadata.drop_all(bind=engine) Base.metadata.create_all(bind=engine) def teardown_module(module): Base.metadata.drop_all(bind=engine) client = TestClient(app) def _create_scenario() -> int: payload = { "name": f"CostScenario-{uuid4()}", "description": "Cost tracking test scenario", } response = client.post("/api/scenarios/", json=payload) assert response.status_code == 200 return response.json()["id"] def test_create_and_list_capex_and_opex(): sid = _create_scenario() capex_payload = { "scenario_id": sid, "amount": 1000.0, "description": "Initial capex", "currency_code": "USD", } resp2 = client.post("/api/costs/capex", json=capex_payload) assert resp2.status_code == 200 capex = resp2.json() assert capex["scenario_id"] == sid assert capex["amount"] == 1000.0 assert capex["currency_code"] == "USD" resp3 = client.get("/api/costs/capex") assert resp3.status_code == 200 data = resp3.json() assert any(item["amount"] == 1000.0 and item["scenario_id"] == sid for item in data) opex_payload = { "scenario_id": sid, "amount": 500.0, "description": "Recurring opex", "currency_code": "USD", } resp4 = client.post("/api/costs/opex", json=opex_payload) assert resp4.status_code == 200 opex = resp4.json() assert opex["scenario_id"] == sid assert opex["amount"] == 500.0 assert opex["currency_code"] == "USD" resp5 = client.get("/api/costs/opex") assert resp5.status_code == 200 data_o = resp5.json() assert any(item["amount"] == 500.0 and item["scenario_id"] == sid for item in data_o) def test_multiple_capex_entries(): sid = _create_scenario() amounts = [250.0, 750.0] for amount in amounts: resp = client.post( "/api/costs/capex", json={ "scenario_id": sid, "amount": amount, "description": f"Capex {amount}", "currency_code": "EUR", }, ) assert resp.status_code == 200 resp = client.get("/api/costs/capex") assert resp.status_code == 200 data = resp.json() retrieved_amounts = [item["amount"] for item in data if item["scenario_id"] == sid] for amount in amounts: assert amount in retrieved_amounts def test_multiple_opex_entries(): sid = _create_scenario() amounts = [120.0, 340.0] for amount in amounts: resp = client.post( "/api/costs/opex", json={ "scenario_id": sid, "amount": amount, "description": f"Opex {amount}", "currency_code": "CAD", }, ) assert resp.status_code == 200 resp = client.get("/api/costs/opex") assert resp.status_code == 200 data = resp.json() retrieved_amounts = [item["amount"] for item in data if item["scenario_id"] == sid] for amount in amounts: assert amount in retrieved_amounts