from fastapi.testclient import TestClient import pytest from sqlalchemy.ext.asyncio import AsyncSession from app.model.transaction import Transaction from app.model.user import User from tests.utils import get_fake_transactions @pytest.mark.asyncio async def test_income_statement(client: TestClient, get_db_session_fixture: AsyncSession) -> None: session_override = get_db_session_fixture # 1. Create a user user = await User.create(session_override, name="user", email="email", hashed_password="password") # 2. Create a bunch of transactions fake_transactions = get_fake_transactions(user.id) await Transaction.bulk_create(session_override, fake_transactions) # 3. Create an income statement min_date = min(t.transaction_date for t in fake_transactions) max_date = max(t.transaction_date for t in fake_transactions) print(f"min_date: {min_date}, max_date: {max_date}") response = client.post( "/api/v1/income_statement", json={ "user_id": 1, "date_from": str(min_date), "date_to": str(max_date), }, ) assert response.status_code == 200 # 4. Verify that the income statement matches the transactions response = client.get(f"/api/v1/income_statement/user/1") print(response.json()) assert response.status_code == 200 assert response.json()[0].get("income") assert response.json()[0].get("expenses") report_id = response.json()[0].get("id") # # 5. Verify that the income statement can be retrieved if report_id is not None: response = client.get(f"/api/v1/income_statement/report/{report_id}") assert response.status_code == 200 assert response.json().get("income") assert response.json().get("expenses") assert response.json().get("id") == report_id