diff --git a/fupogfakta/services.py b/fupogfakta/services.py index b26ed78..7ef9a6f 100644 --- a/fupogfakta/services.py +++ b/fupogfakta/services.py @@ -51,9 +51,9 @@ class ScoreboardTransitionResult: phase_event_payload: dict[str, Any] | None = None -def get_current_round_question(session: GameSession) -> RoundQuestion | None: +def get_round_question(session: GameSession, round_number: int) -> RoundQuestion | None: return ( - RoundQuestion.objects.filter(session=session, round_number=session.current_round) + RoundQuestion.objects.filter(session=session, round_number=round_number) .select_related("question") .order_by("-id") .first() @@ -61,6 +61,11 @@ def get_current_round_question(session: GameSession) -> RoundQuestion | None: +def get_current_round_question(session: GameSession) -> RoundQuestion | None: + return get_round_question(session, session.current_round) + + + def reset_round_question_bootstrap_state(round_question: RoundQuestion) -> RoundQuestion: Guess.objects.filter(round_question=round_question).delete() LieAnswer.objects.filter(round_question=round_question).delete() @@ -78,8 +83,14 @@ def reset_round_question_bootstrap_state(round_question: RoundQuestion) -> Round -def select_round_question(session: GameSession, round_config: RoundConfig) -> RoundQuestion: - existing_round_question = get_current_round_question(session) +def select_round_question( + session: GameSession, + round_config: RoundConfig, + *, + round_number: int | None = None, +) -> RoundQuestion: + target_round_number = session.current_round if round_number is None else round_number + existing_round_question = get_round_question(session, target_round_number) if existing_round_question is not None and existing_round_question.question.category_id == round_config.category_id: return existing_round_question @@ -101,7 +112,7 @@ def select_round_question(session: GameSession, round_config: RoundConfig) -> Ro return RoundQuestion.objects.create( session=session, - round_number=session.current_round, + round_number=target_round_number, question=question, correct_answer=question.correct_answer, ) @@ -262,7 +273,9 @@ def start_next_round(session: GameSession) -> RoundTransitionResult: locked_session.current_round = next_round_number - round_question = reset_round_question_bootstrap_state(select_round_question(locked_session, next_round_config)) + round_question = reset_round_question_bootstrap_state( + select_round_question(locked_session, next_round_config, round_number=next_round_number) + ) locked_session.status = GameSession.Status.LIE locked_session.save(update_fields=["current_round", "status"]) diff --git a/fupogfakta/tests.py b/fupogfakta/tests.py index bb6237f..6978ad5 100644 --- a/fupogfakta/tests.py +++ b/fupogfakta/tests.py @@ -226,6 +226,39 @@ class FupOgFaktaExtractionSliceTests(TestCase): self.assertEqual(stale_round_question.lies.count(), 0) self.assertEqual(stale_round_question.guesses.count(), 0) + def test_start_next_round_does_not_reuse_previous_round_question_when_category_matches(self): + self.session.status = GameSession.Status.SCOREBOARD + self.session.save(update_fields=["status"]) + previous_round_question = RoundQuestion.objects.create( + session=self.session, + round_number=1, + question=self.question_one, + correct_answer=self.question_one.correct_answer, + mixed_answers=["1989", "1991"], + ) + LieAnswer.objects.create(round_question=previous_round_question, player=self.alice, text="1991") + Guess.objects.create( + round_question=previous_round_question, + player=self.bob, + selected_text="1991", + is_correct=False, + fooled_player=self.alice, + ) + + result = start_next_round(self.session) + + previous_round_question.refresh_from_db() + self.session.refresh_from_db() + self.assertEqual(self.session.current_round, 2) + self.assertEqual(result.round_question.round_number, 2) + self.assertNotEqual(result.round_question.id, previous_round_question.id) + self.assertEqual(result.round_question.question_id, self.question_two.id) + self.assertEqual(previous_round_question.round_number, 1) + self.assertEqual(previous_round_question.question_id, self.question_one.id) + self.assertEqual(previous_round_question.mixed_answers, ["1989", "1991"]) + self.assertEqual(previous_round_question.lies.count(), 1) + self.assertEqual(previous_round_question.guesses.count(), 1) + def test_finish_game_moves_scoreboard_transition_into_service(self): self.session.status = GameSession.Status.SCOREBOARD self.session.save(update_fields=["status"])