generated from coulomb/repo-seed
Update payment_records to 8.99 EUR gross, 0.44 EUR fees, 8.55 EUR net payout to binky-hedgehog. Link member tegwick in membership ledger and add Stripe reference catalog.
117 lines
4.2 KiB
Python
117 lines
4.2 KiB
Python
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 |