Files
mousehold/tests/test_projects.py
2026-06-28 13:48:15 +02:00

71 lines
2.1 KiB
Python

from __future__ import annotations
from datetime import date
from decimal import Decimal
from mousehold_api import models
from mousehold_api.services.projects import calculate_project_summary
from mousehold_domain import (
PaymentLineStatus,
PaymentStatus,
PlanningStatus,
ProjectStatus,
ReconciliationStatus,
SettlementStatus,
)
from sqlalchemy.orm import Session
def test_project_partial_payment_summary(
session: Session,
household_setup: dict[str, str],
) -> None:
project = models.Project(
household_id=household_setup["household_id"],
name="Stockholm 2026",
status=ProjectStatus.ACTIVE,
currency="EUR",
)
session.add(project)
session.flush()
budget_line = models.ProjectBudgetLine(
project_id=project.id,
name="Accommodation",
budgeted_amount=Decimal("800.00"),
)
session.add(budget_line)
session.flush()
item = models.ProjectPlannedItem(
project_id=project.id,
budget_line_id=budget_line.id,
description="Hotel",
estimated_amount=Decimal("800.00"),
committed_amount=Decimal("760.00"),
due_date=date(2026, 8, 12),
planning_status=PlanningStatus.COMMITTED,
payment_status=PaymentStatus.PARTIALLY_PAID,
reconciliation_status=ReconciliationStatus.EMAIL_SEEN,
settlement_status=SettlementStatus.UNSETTLED,
)
session.add(item)
session.flush()
session.add(
models.PaymentLine(
planned_item_id=item.id,
amount=Decimal("200.00"),
currency="EUR",
date=date(2026, 1, 5),
paid_by_user_id=household_setup["user_a_id"],
status=PaymentLineStatus.PAID,
)
)
session.commit()
summary = calculate_project_summary(session, project.id)
assert summary.budgeted_total == Decimal("800.00")
assert summary.committed_total == Decimal("760.00")
assert summary.paid_total == Decimal("200.00")
assert summary.due_later_total == Decimal("560.00")
assert summary.remaining_uncommitted_budget == Decimal("40.00")