generated from coulomb/repo-seed
70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
from observatory.economics import build_snapshot
|
|
from observatory.load import (
|
|
load_ltv_scenarios,
|
|
load_membership,
|
|
load_monthly_ledger,
|
|
load_payment_records,
|
|
load_pricing_models,
|
|
load_product,
|
|
)
|
|
from observatory.simulator import build_pricing_simulations
|
|
from observatory.usage import load_usage_records
|
|
|
|
DATA_DIR = Path(__file__).resolve().parent.parent / "data"
|
|
|
|
|
|
def _snapshot(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_simulations_include_reference_model_and_profile_comparisons() -> None:
|
|
snapshot = _snapshot()
|
|
models = load_pricing_models(DATA_DIR)
|
|
simulations = build_pricing_simulations(
|
|
snapshot,
|
|
models,
|
|
snapshot.cost_per_member,
|
|
usage_records=load_usage_records(DATA_DIR),
|
|
scenario_catalog=load_ltv_scenarios(DATA_DIR),
|
|
)
|
|
|
|
assert simulations["primary_profile_id"] == "solo-builder"
|
|
assert simulations["reference_model_id"] is not None
|
|
assert simulations["best_ltv_scenario_id"] is not None
|
|
assert len(simulations["profile_comparisons"]) == 2
|
|
assert simulations["scenarios"][0]["average_comparable_customer_lifetime_value"] is not None
|
|
assert simulations["scenarios"][0]["sensitivity"]
|
|
|
|
|
|
def test_small_team_profile_has_reference_and_non_passing_candidates() -> None:
|
|
snapshot = _snapshot()
|
|
models = load_pricing_models(DATA_DIR)
|
|
simulations = build_pricing_simulations(
|
|
snapshot,
|
|
models,
|
|
snapshot.cost_per_member,
|
|
usage_records=load_usage_records(DATA_DIR),
|
|
scenario_catalog=load_ltv_scenarios(DATA_DIR),
|
|
)
|
|
|
|
small_team = next(
|
|
item for item in simulations["profile_comparisons"] if item["profile"]["id"] == "small-team"
|
|
)
|
|
|
|
assert small_team["reference_model_id"] is not None
|
|
assert small_team["best_valid_model_id"] is not None
|
|
assert any(
|
|
not comparison["passes_required_improvement"]
|
|
for comparison in small_team["comparisons"]
|
|
if comparison["model_id"] != small_team["reference_model_id"]
|
|
)
|