fix(gameplay): make scoreboard host exits idempotent
This commit is contained in:
@@ -1216,6 +1216,25 @@ class RevealRoundFlowTests(TestCase):
|
||||
self.session.refresh_from_db()
|
||||
self.assertEqual(self.session.status, GameSession.Status.FINISHED)
|
||||
|
||||
@patch("lobby.views.sync_broadcast_phase_event")
|
||||
def test_finish_game_is_idempotent_after_transition_to_finished(self, mock_sync_broadcast_phase_event):
|
||||
self.client.login(username="host_reveal", password="secret123")
|
||||
self.client.get(reverse("lobby:reveal_scoreboard", kwargs={"code": self.session.code}))
|
||||
|
||||
first_response = self.client.post(reverse("lobby:finish_game", kwargs={"code": self.session.code}))
|
||||
second_response = self.client.post(reverse("lobby:finish_game", kwargs={"code": self.session.code}))
|
||||
|
||||
self.assertEqual(first_response.status_code, 200)
|
||||
self.assertEqual(second_response.status_code, 200)
|
||||
self.assertEqual(first_response.json(), second_response.json())
|
||||
self.assertEqual(second_response.json()["session"]["status"], GameSession.Status.FINISHED)
|
||||
|
||||
self.session.refresh_from_db()
|
||||
self.assertEqual(self.session.status, GameSession.Status.FINISHED)
|
||||
self.assertEqual(mock_sync_broadcast_phase_event.call_count, 2)
|
||||
self.assertEqual(mock_sync_broadcast_phase_event.call_args_list[0].args[1], "phase.scoreboard")
|
||||
self.assertEqual(mock_sync_broadcast_phase_event.call_args_list[1].args[1], "phase.game_over")
|
||||
|
||||
def test_finish_game_requires_host(self):
|
||||
self.client.login(username="other_reveal", password="secret123")
|
||||
|
||||
@@ -1284,6 +1303,29 @@ class RevealRoundFlowTests(TestCase):
|
||||
self.assertEqual(mock_sync_broadcast_phase_event.call_args.args[0], self.session.code)
|
||||
self.assertEqual(mock_sync_broadcast_phase_event.call_args.args[1], "phase.lie_started")
|
||||
|
||||
@patch("lobby.views.sync_broadcast_phase_event")
|
||||
def test_start_next_round_is_idempotent_after_transition_to_lie(self, mock_sync_broadcast_phase_event):
|
||||
self.client.login(username="host_reveal", password="secret123")
|
||||
self.client.get(reverse("lobby:reveal_scoreboard", kwargs={"code": self.session.code}))
|
||||
mock_sync_broadcast_phase_event.reset_mock()
|
||||
|
||||
first_response = self.client.post(reverse("lobby:start_next_round", kwargs={"code": self.session.code}))
|
||||
second_response = self.client.post(reverse("lobby:start_next_round", kwargs={"code": self.session.code}))
|
||||
|
||||
self.assertEqual(first_response.status_code, 200)
|
||||
self.assertEqual(second_response.status_code, 200)
|
||||
self.assertEqual(first_response.json(), second_response.json())
|
||||
self.assertEqual(second_response.json()["session"]["status"], GameSession.Status.LIE)
|
||||
self.assertEqual(second_response.json()["session"]["current_round"], 2)
|
||||
|
||||
self.session.refresh_from_db()
|
||||
self.assertEqual(self.session.status, GameSession.Status.LIE)
|
||||
self.assertEqual(self.session.current_round, 2)
|
||||
self.assertEqual(RoundConfig.objects.filter(session=self.session, number=2).count(), 1)
|
||||
self.assertEqual(RoundQuestion.objects.filter(session=self.session, round_number=2).count(), 1)
|
||||
mock_sync_broadcast_phase_event.assert_called_once()
|
||||
self.assertEqual(mock_sync_broadcast_phase_event.call_args.args[1], "phase.lie_started")
|
||||
|
||||
def test_start_next_round_requires_host(self):
|
||||
self.session.status = GameSession.Status.SCOREBOARD
|
||||
self.session.save(update_fields=["status"])
|
||||
|
||||
Reference in New Issue
Block a user