[READY][Gameplay] #310 Host transition idempotency and error catalog for scoreboard -> next round / finish #320
@@ -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[0], self.session.code)
|
||||||
self.assertEqual(mock_sync_broadcast_phase_event.call_args.args[1], "phase.lie_started")
|
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")
|
@patch("lobby.views.sync_broadcast_phase_event")
|
||||||
def test_start_next_round_is_idempotent_after_transition_to_lie(self, mock_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.login(username="host_reveal", password="secret123")
|
||||||
|
|||||||
Reference in New Issue
Block a user