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")