generated from coulomb/repo-seed
61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
from decimal import Decimal
|
|
from pathlib import Path
|
|
|
|
from observatory.economics import build_snapshot
|
|
from observatory.load import (
|
|
load_market_signals,
|
|
load_membership,
|
|
load_monthly_ledger,
|
|
load_payment_records,
|
|
load_pricing_models,
|
|
load_product,
|
|
load_value_range,
|
|
)
|
|
from observatory.pricing_context import (
|
|
build_cost_floor,
|
|
build_market_price_view,
|
|
build_value_range_view,
|
|
)
|
|
|
|
DATA_DIR = Path(__file__).resolve().parent.parent / "data"
|
|
|
|
|
|
def _snapshot_for(period: str = "2026-06"):
|
|
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)
|
|
return build_snapshot(period, product, models, members, payments, ledger)
|
|
|
|
|
|
def test_cost_floor_derives_from_snapshot() -> None:
|
|
snapshot = _snapshot_for()
|
|
models = load_pricing_models(DATA_DIR)
|
|
floor = build_cost_floor(snapshot, models)
|
|
|
|
assert floor["cost_per_member"] == snapshot.cost_per_member
|
|
assert floor["active_price"] == Decimal("8.99")
|
|
assert floor["active_model_id"] == "flat-899-eur-monthly"
|
|
|
|
|
|
def test_value_range_computes_headroom() -> None:
|
|
snapshot = _snapshot_for()
|
|
product = load_product(DATA_DIR)
|
|
models = load_pricing_models(DATA_DIR)
|
|
view = build_value_range_view(load_value_range(DATA_DIR), snapshot, product, models)
|
|
|
|
assert view["current_price_eur"] == Decimal("8.99")
|
|
assert len(view["segments"]) == 2
|
|
solo = next(item for item in view["segments"] if item["id"] == "solo-builder")
|
|
assert solo["headroom_to_high_eur"] == Decimal("10.01")
|
|
|
|
|
|
def test_market_price_summarises_alternatives() -> None:
|
|
view = build_market_price_view(load_market_signals(DATA_DIR))
|
|
|
|
assert view["alternative_count"] == 4
|
|
assert view["market_low_eur"] == Decimal("4.00")
|
|
assert view["market_high_eur"] == Decimal("49.00") |