Files
adaptive-pricing/projects/coulomb-pricing/tests/test_pricing_context.py
2026-06-22 23:05:05 +02:00

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