"""Unit tests for kol_analysis._derive_tier — the non-Twitter tier derivation that lets blog/substack/podcast posts get the same trade_signal/directional/ noise tiers (and SIGNAL/VIEW badges + "Signals only" filter) as Twitter posts. """ from app.services.kol_analysis import _derive_tier def _tk(action="mention", conviction=0.0): return {"action": action, "conviction": conviction} def test_no_tickers_is_noise(): assert _derive_tier([], 0.0) == "noise" def test_only_mentions_is_noise(): assert _derive_tier([_tk("mention", 0.9)], 0.1) == "noise" def test_high_conviction_directional_is_trade_signal(): assert _derive_tier([_tk("buy", 0.7)], 0.0) == "trade_signal" def test_strong_divergence_is_trade_signal_even_without_ticker(): assert _derive_tier([], 0.8) == "trade_signal" def test_low_conviction_directional_is_directional(): assert _derive_tier([_tk("bullish", 0.4)], 0.0) == "directional" def test_moderate_divergence_is_directional(): assert _derive_tier([_tk("mention", 0.0)], 0.55) == "directional" def test_boundary_conviction_0_6_is_trade_signal(): assert _derive_tier([_tk("sell", 0.6)], 0.0) == "trade_signal"