import unittest from scripts.gameplay_snake_stats import ( StatsFilter, build_where, format_table, opponent_query, pivot_rows, win_rate, ) class TestGameplaySnakeStats(unittest.TestCase): def test_filters_use_positional_arguments(self): where, args = build_where(StatsFilter(since_hours=2, snake_type="ZenithBattleSnake", source="ladder")) self.assertIn("g.status = 'finished'", where) self.assertIn("make_interval(secs => $1)", where) self.assertIn("g.your_snake_type = $2", where) self.assertIn("g.source = $3", where) self.assertEqual(args, [7200.0, "ZenithBattleSnake", "ladder"]) def test_opponent_query_appends_min_games_last(self): sql, args = opponent_query(StatsFilter(game_type="duel"), min_games=5) self.assertIn("HAVING count(*) >= $2", sql) self.assertEqual(args, ["duel", 5]) def test_win_rate_handles_zero_games(self): self.assertEqual(win_rate(1, 4), " 25.0%") self.assertEqual(win_rate(0, 0), " -") def test_pivot_keeps_opponents_faced_by_every_listed_version(self): records = [ {"opponent": "A", "snake": "Prism", "version": "1.5.0", "wins": 2, "games": 10}, {"opponent": "A", "snake": "Zenith", "version": "1.2.0", "wins": 3, "games": 6}, {"opponent": "B", "snake": "Prism", "version": "1.5.0", "wins": 1, "games": 9}, ] headers, rows = pivot_rows(records, min_games=3) self.assertEqual(headers, ["opponent", "Prism 1.5.0", "Zenith 1.2.0"]) self.assertEqual(rows, [["A", "2/10 20.0%", "3/6 50.0%"]]) def test_format_table_aligns_columns(self): table = format_table(["name", "n"], [["long-name", 1]]) self.assertEqual(table.splitlines(), ["name n", "--------- -", "long-name 1"]) if __name__ == "__main__": unittest.main()