Leaderboard and dynamic layout
This commit is contained in:
@@ -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 = {}
|
||||
|
||||
Reference in New Issue
Block a user