feat: add freshness decay to tackle analytics

This commit is contained in:
ik
2026-09-21 18:02:23 +07:00
parent 91019cbf3a
commit e4e10bb4e9
7 changed files with 819 additions and 6 deletions
+30
View File
@@ -69,3 +69,33 @@ def test_tackle_analytics_handles_empty_and_multicomponent_observations() -> Non
assert tackle_combinations(db, waterbody="missing", fish=None, method=None, hours=72) == []
engine.dispose()
def test_tackle_analytics_exposes_decay_and_prefers_fresher_equal_samples() -> None:
now = datetime.now(timezone.utc)
engine = create_engine("sqlite://")
Base.metadata.create_all(engine)
with Session(engine) as db:
waterbody = Waterbody(slug="decay-check", name_ru="Свежесть", unlock_level=1)
fish = Fish(slug="pike", name_ru="Щука", trophy_weight_g=10_000)
spot = Spot(waterbody=waterbody, x=3, y=4)
db.add_all([waterbody, fish, spot])
db.flush()
for value, age in (("Fresh spinner", 1), ("Old spinner", 48)):
for index, player in enumerate(("One", "One", "Two")):
report = CatchReport(
fish=fish, waterbody=waterbody, spot=spot, weight_g=1000,
caught_at=now - timedelta(hours=age), reported_at=now - timedelta(hours=age),
player_name=player, source_type=SourceType.user, source_confidence=80,
moderation_status=ModerationStatus.approved,
)
report.tackle_components.append(CatchTackleComponent(role="lure", position=index, raw_value=value))
db.add(report)
db.commit()
rows = tackle_combinations(db, waterbody="decay-check", fish="pike", method=None, hours=72, min_samples=3, min_players=2)
assert [row.value for row in rows] == ["Fresh spinner", "Old spinner"]
assert rows[0].freshness_score > rows[1].freshness_score
assert rows[0].freshness_score <= 100
engine.dispose()