from __future__ import annotations from decimal import Decimal from pathlib import Path from observatory.economics import active_members, build_liquidity_summary, build_snapshot from observatory.ledger import aggregate_infrastructure_by_period, build_monthly_ledger from observatory.load import ( load_budget, load_expense_records, load_fx_rates, load_membership, load_monthly_ledger, load_payment_records, load_pricing_models, load_product, ) DATA_DIR = Path(__file__).resolve().parent.parent / "data" def test_active_members_counts_only_active_status() -> None: members = load_membership(DATA_DIR) assert active_members(members) == 1 def test_infrastructure_aggregated_from_expense_records() -> None: expenses = load_expense_records(DATA_DIR) fx = load_fx_rates(DATA_DIR) totals = aggregate_infrastructure_by_period(expenses, fx) assert totals["2025-03"] == Decimal("69.44") assert totals["2026-06"] == Decimal("69.44") # Bubble $32 @ 0.92 = 29.44 + 15 domains + 25 overhead bubble_eur = Decimal("32.00") * Decimal("0.92") assert bubble_eur == Decimal("29.44") def test_monthly_ledger_computes_processing_from_payment_records() -> None: ledger = load_monthly_ledger(DATA_DIR) june = next(row for row in ledger if row.period == "2026-06") march = next(row for row in ledger if row.period == "2025-03") assert march.infrastructure_cost == Decimal("69.44") assert march.payment_processing_cost == Decimal("0.00") assert march.gross_revenue == Decimal("0.00") assert june.infrastructure_cost == Decimal("69.44") assert june.payment_processing_cost == Decimal("0.38") assert june.gross_revenue == Decimal("8.99") def test_build_snapshot_june_2026_uses_ledger_not_hand_totals() -> None: product = load_product(DATA_DIR) models = load_pricing_models(DATA_DIR) members = load_membership(DATA_DIR) payments = load_payment_records(DATA_DIR) ledger = load_monthly_ledger(DATA_DIR) snapshot = build_snapshot("2026-06", product, models, members, payments, ledger) assert snapshot.monthly_infrastructure_cost == Decimal("69.44") assert snapshot.monthly_payment_processing_cost == Decimal("0.38") assert snapshot.monthly_total_platform_cost == Decimal("69.82") assert snapshot.period_net_liquidity == Decimal("-60.83") assert snapshot.gross_margin == Decimal("-60.83") def test_liquidity_summary_aggregates_ledgers_deterministically() -> None: budget = load_budget(DATA_DIR) payments = load_payment_records(DATA_DIR) ledger = load_monthly_ledger(DATA_DIR) summary = build_liquidity_summary(budget, payments, ledger, "2026-06") assert summary.cumulative_infrastructure_cost == Decimal("1111.04") assert summary.cumulative_payment_processing_cost == Decimal("3.04") assert summary.cumulative_total_platform_cost == Decimal("1114.08") assert summary.cumulative_member_payments == Decimal("68.88") assert summary.cumulative_net_liquidity == Decimal("-1042.16") assert summary.remaining_budget == Decimal("-42.16") assert summary.liquidity_status == "burning" assert summary.months_tracked == 16 def test_build_monthly_ledger_matches_loader() -> None: budget = load_budget(DATA_DIR) expenses = load_expense_records(DATA_DIR) payments = load_payment_records(DATA_DIR) members = load_membership(DATA_DIR) fx = load_fx_rates(DATA_DIR) assert build_monthly_ledger(budget, expenses, payments, members, fx) == load_monthly_ledger( DATA_DIR ) def test_dashboard_notes_expense_record_source() -> None: from observatory.dashboard import generate_dashboard report = generate_dashboard(DATA_DIR, "2026-06") assert "expense and payment record ledgers" in report assert "1111.04" in report assert "-42.16" in report