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_domain_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-01"] == Decimal("20.74") assert totals["2026-02"] == Decimal("20.74") assert totals["2026-03"] == Decimal("29.73") assert totals["2026-06"] == Decimal("29.73") def test_monthly_ledger_starts_january_2025() -> None: ledger = load_monthly_ledger(DATA_DIR) assert ledger[0].period == "2025-01" assert len(ledger) == 18 march = next(row for row in ledger if row.period == "2025-03") june = next(row for row in ledger if row.period == "2026-06") assert march.infrastructure_cost == Decimal("20.74") assert march.payment_processing_cost == Decimal("0.00") assert june.infrastructure_cost == Decimal("29.73") assert june.payment_processing_cost == Decimal("0.44") assert june.gross_revenue == Decimal("8.99") def test_build_snapshot_june_2026_domain_only_infrastructure() -> 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("29.73") assert snapshot.monthly_payment_processing_cost == Decimal("0.44") assert snapshot.monthly_total_platform_cost == Decimal("30.17") assert snapshot.period_net_liquidity == Decimal("-21.18") assert snapshot.liquidity_status == "burning" def test_liquidity_summary_with_actual_domain_costs() -> 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("409.28") assert summary.cumulative_payment_processing_cost == Decimal("3.52") assert summary.cumulative_total_platform_cost == Decimal("412.80") assert summary.cumulative_member_payments == Decimal("68.40") assert summary.cumulative_net_liquidity == Decimal("-340.88") assert summary.remaining_budget == Decimal("659.12") assert summary.liquidity_status == "burning" assert summary.months_tracked == 18 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_payment_records_match_stripe_actuals_for_tegwick() -> None: payments = load_payment_records(DATA_DIR) nov = next(p for p in payments if p.period == "2025-11") assert nov.gross_amount == Decimal("8.99") assert nov.fees_amount == Decimal("0.44") assert nov.net_amount == Decimal("8.55") assert nov.member_username == "tegwick" assert nov.payout_account == "binky-hedgehog" assert nov.source == "stripe" 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 "409.28" in report assert "659.12" in report assert "coulomb.social" not in report # dashboard shows aggregates, not domain names