Leaderboard and dynamic layout

This commit is contained in:
2026-10-21 11:53:47 -04:00
parent 77ec52b053
commit 02e7bcf293
4 changed files with 161 additions and 17 deletions
+45
View File
@@ -157,6 +157,51 @@ class PersistenceTests(unittest.TestCase):
initial = self.game.load_state()
self.assertEqual(initial, self.game.load_state())
def test_public_leaderboard_scores_ties_and_zero_press_players(self):
self.game.state = self.sample_state()
self.game.state["players"]["charlie"] = {"name": "Charlie"}
self.game.state["players"]["aaron"] = {"name": "aaron"}
self.game.state["presses"].append({
"player_id": "aaron", "at": 300, "remaining_ms": 10, "zone": "white", "points": 40,
})
self.assertEqual(self.game.public_leaderboard(), [
{"name": "aaron", "total_points": 40, "press_count": 1},
{"name": self.game.state["players"]["alice"]["name"], "total_points": 40, "press_count": 2},
{"name": "Bøb", "total_points": 16, "press_count": 1},
{"name": "Charlie", "total_points": 0, "press_count": 0},
])
def test_leaderboard_http_is_public_before_and_after_game_ends(self):
self.game.state = self.sample_state()
httpd = ThreadingHTTPServer(("127.0.0.1", 0), self.game.Handler)
thread = threading.Thread(target=httpd.serve_forever, daemon=True)
thread.start()
self.addCleanup(httpd.server_close)
self.addCleanup(thread.join)
self.addCleanup(httpd.shutdown)
def get(path):
connection = HTTPConnection(*httpd.server_address, timeout=5)
try:
connection.request("GET", path)
response = connection.getresponse()
return response.status, json.loads(response.read()), response.getheader("Cache-Control")
finally:
connection.close()
for ended in (False, True):
self.game.state["ended"] = ended
status, payload, cache = get("/api/leaderboard")
self.assertEqual(status, 200)
self.assertEqual(cache, "no-store")
self.assertEqual(set(payload), {"leaderboard"})
self.assertEqual(payload["leaderboard"], self.game.public_leaderboard())
for player in payload["leaderboard"]:
self.assertEqual(set(player), {"name", "total_points", "press_count"})
self.assertEqual(get("/api/stats")[0], 200 if ended else 403)
self.game.state = self.game.new_game()
self.assertEqual(get("/api/leaderboard")[1], {"leaderboard": []})
def test_http_registration_login_press_logout_and_restart(self):
self.game.state = self.game.load_state()
self.game.token_index = {}