"""Unit tests for pure stats math fixtures.""" from app.stats_math import by_remedy, data_thin, server_picks def _entries() -> list[dict]: # remedy "walk": 4 worked, 1 failed => n=5, p_helped=0.8 # remedy "nap": 2 partial, 1 failed, 2 pending => scored n=3 (below min_n=5) rows = [] for _ in range(4): rows.append( { "remedy": " Walk ", "result": "worked", "emotions": ["calm"], "tags": ["rerun"], "intensity": 5, } ) rows.append( { "remedy": "walk", "result": "failed", "emotions": ["shame"], "tags": ["urge"], "intensity": 8, } ) for _ in range(2): rows.append( { "remedy": "nap", "result": "partial", "emotions": ["tired"], "tags": ["home"], "intensity": 2, } ) rows.append( { "remedy": "nap", "result": "failed", "emotions": ["tired"], "tags": ["home"], "intensity": 2, } ) rows.append( { "remedy": "nap", "result": "pending", "emotions": ["tired"], "tags": ["home"], "intensity": 2, } ) rows.append( { "remedy": "nap", "result": "pending", "emotions": ["tired"], "tags": ["home"], "intensity": 2, } ) return rows def test_p_helped_and_rank() -> None: rows = by_remedy(_entries(), min_n=5, shrink_k=3) assert len(rows) == 1 walk = rows[0] assert walk["key"] == "walk" assert walk["n"] == 5 assert walk["p_worked"] == 0.8 assert walk["p_helped"] == 0.8 assert abs(walk["rank"] - (0.8 * 5 / 8)) < 1e-9 def test_data_thin() -> None: assert data_thin(9) is True assert data_thin(10) is False def test_server_picks_tag_boost() -> None: picks = server_picks( _entries(), ["rerun"], min_n=5, shrink_k=3, match_alpha=0.5, ) assert len(picks) == 1 assert picks[0]["remedy_key"] == "walk" assert picks[0]["match"] == 1.0 expected = (0.8 * 5 / 8) * (1 + 0.5 * 1.0) assert abs(picks[0]["pick"] - expected) < 1e-9