from __future__ import annotations import unittest from polymarket_collector.discovery import daily_reward, select_markets def market( identifier: str, reward: float, volume: float, token_suffix: str, ) -> dict: return { "condition_id": identifier, "volume_24hr": volume, "rewards_config": [{"rate_per_day": reward}], "tokens": [ {"token_id": f"yes-{token_suffix}", "outcome": "YES"}, {"token_id": f"no-{token_suffix}", "outcome": "NO"}, ], } class DiscoveryTests(unittest.TestCase): def test_daily_reward_sums_configs(self) -> None: self.assertEqual( daily_reward( {"rewards_config": [{"rate_per_day": 2}, {"rate_per_day": "1.5"}]} ), 3.5, ) def test_selects_by_reward_then_volume(self) -> None: candidates = [ market("a", 2, 1_000, "a"), market("b", 5, 10, "b"), market("c", 2, 2_000, "c"), market("d", 0.5, 10_000, "d"), ] selection = select_markets( candidates, max_markets=2, min_daily_reward=1, min_volume_24h=0, ) self.assertEqual( [item["condition_id"] for item in selection.markets], ["b", "c"] ) self.assertEqual( selection.asset_ids, ("yes-b", "no-b", "yes-c", "no-c") ) def test_skips_market_without_two_tokens(self) -> None: invalid = market("a", 10, 1_000, "a") invalid["tokens"] = invalid["tokens"][:1] selection = select_markets( [invalid], max_markets=10, min_daily_reward=0, min_volume_24h=0, ) self.assertEqual(selection.markets, ()) if __name__ == "__main__": unittest.main()