From 92f2cda83ae01bc47e7648a36d821b3b31d89c91 Mon Sep 17 00:00:00 2001 From: dev-bot Date: Wed, 18 Mar 2026 04:36:20 +0000 Subject: [PATCH] test(lobby): lock scoreboard next-round bootstrap target --- lobby/tests.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/lobby/tests.py b/lobby/tests.py index cc65eb8..e7b2741 100644 --- a/lobby/tests.py +++ b/lobby/tests.py @@ -1684,6 +1684,47 @@ 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_bootstraps_new_round_question_instead_of_reusing_current_round(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() + + stale_shown_at = timezone.now() - timedelta(minutes=10) + current_round_question = RoundQuestion.objects.get(session=self.session, round_number=1) + current_round_question.shown_at = stale_shown_at + current_round_question.mixed_answers = ["Stale truth", "Stale lie"] + current_round_question.save(update_fields=["shown_at", "mixed_answers"]) + LieAnswer.objects.create(round_question=current_round_question, player=self.player_one, text="Stale lie") + Guess.objects.create( + round_question=current_round_question, + player=self.player_two, + selected_text="Stale truth", + is_correct=True, + ) + + response = self.client.post(reverse("lobby:start_next_round", kwargs={"code": self.session.code})) + + self.assertEqual(response.status_code, 200) + self.session.refresh_from_db() + current_round_question.refresh_from_db() + self.assertEqual(self.session.status, GameSession.Status.LIE) + self.assertEqual(self.session.current_round, 2) + payload = response.json() + self.assertEqual(payload["round_question"]["id"], RoundQuestion.objects.get(session=self.session, round_number=2).id) + self.assertEqual(payload["round_question"]["prompt"], self.next_question.prompt) + self.assertEqual(current_round_question.round_number, 1) + self.assertEqual(current_round_question.question_id, self.question.id) + self.assertEqual(current_round_question.shown_at, stale_shown_at) + self.assertEqual(current_round_question.mixed_answers, ["Stale truth", "Stale lie"]) + self.assertEqual(current_round_question.lies.count(), 1) + self.assertEqual(current_round_question.guesses.count(), 1) + detail_payload = self.client.get(reverse("lobby:session_detail", kwargs={"code": self.session.code})).json() + self.assertEqual(detail_payload["round_question"]["id"], payload["round_question"]["id"]) + self.assertEqual(detail_payload["round_question"]["prompt"], self.next_question.prompt) + mock_sync_broadcast_phase_event.assert_called_once() + 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")