79 lines
2.6 KiB
Python
79 lines
2.6 KiB
Python
from __future__ import annotations
|
|
|
|
from router.query_classifier import RouteDecisionFlags
|
|
from router.route_selector import choose_route
|
|
from router.store_sufficiency import StoreSufficiencyResult
|
|
|
|
|
|
def _flags() -> RouteDecisionFlags:
|
|
return RouteDecisionFlags(
|
|
needs_exact_object_trace=False,
|
|
needs_causal_chain=False,
|
|
needs_cross_entity_join=False,
|
|
needs_full_period_aggregation=False,
|
|
needs_ranking=False,
|
|
needs_anomaly_summary=False,
|
|
needs_runtime_truth=False,
|
|
freshness_sensitive=False,
|
|
ambiguous_object_scope=False,
|
|
store_sufficiency_confident=False,
|
|
precomputed_aggregate_available=True,
|
|
)
|
|
|
|
|
|
def _suff() -> StoreSufficiencyResult:
|
|
return StoreSufficiencyResult(
|
|
canonical_sufficient=True,
|
|
feature_sufficient=True,
|
|
risk_sufficient=True,
|
|
freshness_ok=True,
|
|
aggregate_level_ok=True,
|
|
ranking_ready=True,
|
|
explanation_ready=True,
|
|
reason_codes=[],
|
|
)
|
|
|
|
|
|
def test_route_guard_exact_object_trace_to_live() -> None:
|
|
flags = _flags()
|
|
flags.needs_exact_object_trace = True
|
|
result = choose_route(flags, _suff(), parsed_as_trend_or_risk=False)
|
|
assert result.chosen_route == "live_mcp_drilldown"
|
|
|
|
|
|
def test_route_guard_heavy_without_aggregate_to_batch() -> None:
|
|
flags = _flags()
|
|
flags.needs_full_period_aggregation = True
|
|
flags.precomputed_aggregate_available = False
|
|
suff = _suff()
|
|
suff.aggregate_level_ok = False
|
|
result = choose_route(flags, suff, parsed_as_trend_or_risk=False)
|
|
assert result.chosen_route == "batch_refresh_then_store"
|
|
|
|
|
|
def test_route_guard_cross_entity_causal_to_hybrid() -> None:
|
|
flags = _flags()
|
|
flags.needs_cross_entity_join = True
|
|
flags.needs_causal_chain = True
|
|
suff = _suff()
|
|
suff.explanation_ready = False
|
|
result = choose_route(flags, suff, parsed_as_trend_or_risk=False)
|
|
assert result.chosen_route == "hybrid_store_plus_live"
|
|
|
|
|
|
def test_route_guard_simple_factual_to_store_canonical() -> None:
|
|
result = choose_route(_flags(), _suff(), parsed_as_trend_or_risk=False)
|
|
assert result.chosen_route == "store_canonical"
|
|
|
|
|
|
def test_route_guard_trend_to_store_feature_risk() -> None:
|
|
result = choose_route(_flags(), _suff(), parsed_as_trend_or_risk=True)
|
|
assert result.chosen_route == "store_feature_risk"
|
|
|
|
|
|
def test_route_guard_inventory_exact_trace_stays_live() -> None:
|
|
flags = _flags()
|
|
flags.needs_exact_object_trace = True
|
|
result = choose_route(flags, _suff(), parsed_as_trend_or_risk=False)
|
|
assert result.chosen_route == "live_mcp_drilldown"
|