[READY][Gameplay] #310 Host transition idempotency and error catalog for scoreboard -> next round / finish #320
@@ -80,7 +80,7 @@ def reset_round_question_bootstrap_state(round_question: RoundQuestion) -> Round
|
|||||||
|
|
||||||
def select_round_question(session: GameSession, round_config: RoundConfig) -> RoundQuestion:
|
def select_round_question(session: GameSession, round_config: RoundConfig) -> RoundQuestion:
|
||||||
existing_round_question = get_current_round_question(session)
|
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
|
return existing_round_question
|
||||||
|
|
||||||
used_question_ids = RoundQuestion.objects.filter(session=session).values_list("question_id", flat=True)
|
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")
|
raise ValueError("no_available_questions")
|
||||||
|
|
||||||
question = random.choice(list(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(
|
return RoundQuestion.objects.create(
|
||||||
session=session,
|
session=session,
|
||||||
round_number=session.current_round,
|
round_number=session.current_round,
|
||||||
|
|||||||
@@ -182,6 +182,49 @@ class FupOgFaktaExtractionSliceTests(TestCase):
|
|||||||
self.assertEqual(result.round_question.id, stale_round_question.id)
|
self.assertEqual(result.round_question.id, stale_round_question.id)
|
||||||
self.assertEqual(stale_round_question.mixed_answers, [])
|
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):
|
def test_finish_game_moves_scoreboard_transition_into_service(self):
|
||||||
self.session.status = GameSession.Status.SCOREBOARD
|
self.session.status = GameSession.Status.SCOREBOARD
|
||||||
self.session.save(update_fields=["status"])
|
self.session.save(update_fields=["status"])
|
||||||
|
|||||||
Reference in New Issue
Block a user