diff --git a/fupogfakta/services.py b/fupogfakta/services.py index 46584b4..b26ed78 100644 --- a/fupogfakta/services.py +++ b/fupogfakta/services.py @@ -80,7 +80,7 @@ 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) - if existing_round_question is not None: + if existing_round_question is not None and existing_round_question.question.category_id == round_config.category_id: return existing_round_question used_question_ids = RoundQuestion.objects.filter(session=session).values_list("question_id", flat=True) @@ -93,6 +93,12 @@ def select_round_question(session: GameSession, round_config: RoundConfig) -> Ro raise ValueError("no_available_questions") question = random.choice(list(available_questions)) + if existing_round_question is not None: + existing_round_question.question = question + existing_round_question.correct_answer = question.correct_answer + existing_round_question.save(update_fields=["question", "correct_answer"]) + return existing_round_question + return RoundQuestion.objects.create( session=session, round_number=session.current_round, diff --git a/fupogfakta/tests.py b/fupogfakta/tests.py index f737672..68594a0 100644 --- a/fupogfakta/tests.py +++ b/fupogfakta/tests.py @@ -182,6 +182,49 @@ class FupOgFaktaExtractionSliceTests(TestCase): self.assertEqual(result.round_question.id, stale_round_question.id) self.assertEqual(stale_round_question.mixed_answers, []) + def test_start_next_round_repairs_reused_bootstrap_question_when_category_drifted(self): + self.session.status = GameSession.Status.SCOREBOARD + self.session.save(update_fields=["status"]) + RoundQuestion.objects.create( + session=self.session, + round_number=1, + question=self.question_one, + correct_answer=self.question_one.correct_answer, + ) + stale_category = Category.objects.create(name="Sport drift", slug="sport-drift", is_active=True) + stale_question = Question.objects.create( + category=stale_category, + prompt="Hvem vandt EM i 1992?", + correct_answer="Danmark", + is_active=True, + ) + stale_round_question = RoundQuestion.objects.create( + session=self.session, + round_number=2, + question=stale_question, + correct_answer=stale_question.correct_answer, + shown_at=timezone.now() - timedelta(minutes=10), + mixed_answers=["Stale truth", "Stale lie"], + ) + LieAnswer.objects.create(round_question=stale_round_question, player=self.alice, text="Tyskland") + Guess.objects.create( + round_question=stale_round_question, + player=self.bob, + selected_text="Stale truth", + is_correct=True, + ) + + result = start_next_round(self.session) + + stale_round_question.refresh_from_db() + self.assertEqual(result.round_question.id, stale_round_question.id) + self.assertEqual(stale_round_question.question.category_id, self.round_config.category_id) + self.assertEqual(stale_round_question.question_id, self.question_two.id) + self.assertEqual(stale_round_question.correct_answer, self.question_two.correct_answer) + self.assertEqual(stale_round_question.mixed_answers, []) + self.assertEqual(stale_round_question.lies.count(), 0) + self.assertEqual(stale_round_question.guesses.count(), 0) + def test_finish_game_moves_scoreboard_transition_into_service(self): self.session.status = GameSession.Status.SCOREBOARD self.session.save(update_fields=["status"])