feat: add monthly settlement read model
Implements REQ-022 monthly settlement read-model foundation.
This commit is contained in:
@@ -147,6 +147,38 @@ def test_budget_vs_actual_and_investable_cashflow(tmp_path):
|
||||
assert investable["investable_cashflow"] == 1_250_000
|
||||
|
||||
|
||||
def test_monthly_settlement_summary_read_model_foundation(tmp_path):
|
||||
db_path = str(tmp_path / "ledger.sqlite3")
|
||||
service.create_ledger_budget("2026-06", "식비", 500_000, db_path=db_path)
|
||||
service.create_ledger_transaction("2026-06-01", "income", 4_000_000, category="수입", db_path=db_path)
|
||||
service.create_ledger_transaction("2026-06-02", "expense", 550_000, category="식비", db_path=db_path)
|
||||
service.create_ledger_transaction("2026-06-03", "expense", 150_000, category="", db_path=db_path)
|
||||
|
||||
summary = service.get_monthly_settlement_summary("2026-06", db_path=db_path)
|
||||
|
||||
assert summary["success"] is True
|
||||
assert summary["selected_month"] == "2026-06"
|
||||
assert summary["basis_date"] == "2026-06-30"
|
||||
assert summary["actual_income"] == 4_000_000
|
||||
assert summary["actual_expense"] == 550_000
|
||||
assert summary["net_cashflow"] == 3_450_000
|
||||
assert summary["savings_rate"] == 0.8625
|
||||
assert summary["budget_overrun_count"] == 1
|
||||
assert summary["unresolved_blocker_count"] >= 1
|
||||
assert summary["unresolved_blockers"]["counts"]["uncategorized_recommendation_backlog"] == 1
|
||||
assert summary["source_coverage"]["assets"]["basis_date"] == "2026-06-30"
|
||||
assert summary["read_only"] is True
|
||||
|
||||
|
||||
def test_monthly_settlement_summary_rejects_invalid_month(tmp_path):
|
||||
db_path = str(tmp_path / "ledger.sqlite3")
|
||||
|
||||
summary = service.get_monthly_settlement_summary("2026-99", db_path=db_path)
|
||||
|
||||
assert summary["success"] is False
|
||||
assert summary["error_code"] == "validation_error"
|
||||
|
||||
|
||||
def test_duplicate_detection_and_soft_delete(tmp_path):
|
||||
db_path = str(tmp_path / "ledger.sqlite3")
|
||||
first = service.create_ledger_transaction("2026-06-10", "expense", 10_000, merchant="카페", account_id="card1", db_path=db_path)
|
||||
|
||||
Reference in New Issue
Block a user