From c45f04f9f171d4cca80c809cf0cc361c3da7402a Mon Sep 17 00:00:00 2001 From: dev-bot Date: Tue, 17 Mar 2026 18:55:28 +0000 Subject: [PATCH] refactor(gameplay): extract round question payload builder --- fupogfakta/payloads.py | 13 +++++++++++++ fupogfakta/tests.py | 10 +++++++++- lobby/tests.py | 1 + lobby/views.py | 11 ++--------- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/fupogfakta/payloads.py b/fupogfakta/payloads.py index 40d4f26..31db22d 100644 --- a/fupogfakta/payloads.py +++ b/fupogfakta/payloads.py @@ -13,6 +13,19 @@ def build_player_ref(player: Player | None) -> dict | None: } +def build_round_question_payload(round_question: RoundQuestion | None) -> dict | None: + if round_question is None: + return None + + return { + "id": round_question.id, + "round_number": round_question.round_number, + "prompt": round_question.question.prompt, + "shown_at": round_question.shown_at.isoformat(), + "answers": [{"text": text} for text in (round_question.mixed_answers or [])], + } + + def build_reveal_payload(round_question: RoundQuestion | None) -> dict | None: if round_question is None: return None diff --git a/fupogfakta/tests.py b/fupogfakta/tests.py index 14e432e..f737672 100644 --- a/fupogfakta/tests.py +++ b/fupogfakta/tests.py @@ -6,7 +6,12 @@ from django.test import TestCase from django.utils import timezone from fupogfakta.models import Category, GameSession, Guess, LieAnswer, Player, Question, RoundConfig, RoundQuestion, ScoreEvent -from fupogfakta.payloads import build_lie_started_payload, build_phase_view_model, build_reveal_payload +from fupogfakta.payloads import ( + build_lie_started_payload, + build_phase_view_model, + build_reveal_payload, + build_round_question_payload, +) from fupogfakta.services import ( finish_game, get_current_round_question, @@ -277,6 +282,7 @@ class FupOgFaktaExtractionSliceTests(TestCase): fooled_player=self.bob, ) + round_question_payload = build_round_question_payload(round_question) lie_payload = build_lie_started_payload(self.session, self.round_config, round_question) reveal_payload = build_reveal_payload(round_question) phase_view_model = build_phase_view_model( @@ -285,6 +291,8 @@ class FupOgFaktaExtractionSliceTests(TestCase): has_round_question=True, ) + self.assertEqual(round_question_payload["prompt"], self.question_one.prompt) + self.assertEqual(round_question_payload["answers"], []) self.assertEqual(lie_payload["category"], {"slug": self.category.slug, "name": self.category.name}) self.assertEqual(lie_payload["round_question_id"], round_question.id) self.assertEqual(reveal_payload["correct_answer"], "1989") diff --git a/lobby/tests.py b/lobby/tests.py index a0c3121..77eb6f7 100644 --- a/lobby/tests.py +++ b/lobby/tests.py @@ -60,6 +60,7 @@ class LobbyGameplayExtractionTests(TestCase): self.assertIs(lobby_views._start_next_round, gameplay_services.start_next_round) self.assertIs(lobby_views._finish_game, gameplay_services.finish_game) self.assertIs(lobby_views._build_phase_view_model, gameplay_payloads.build_phase_view_model) + self.assertIs(lobby_views._build_round_question_payload, gameplay_payloads.build_round_question_payload) self.assertIs(lobby_views._build_scoreboard_phase_event, gameplay_payloads.build_scoreboard_phase_event) def test_start_next_round_view_source_stays_http_thin(self): diff --git a/lobby/views.py b/lobby/views.py index e794aac..a82dff8 100644 --- a/lobby/views.py +++ b/lobby/views.py @@ -14,6 +14,7 @@ from fupogfakta.payloads import ( build_lie_started_payload as _build_lie_started_payload, build_phase_view_model as _build_phase_view_model, build_reveal_payload as _build_reveal_payload, + build_round_question_payload as _build_round_question_payload, build_scoreboard_phase_event as _build_scoreboard_phase_event, ) from fupogfakta.services import ( @@ -190,15 +191,7 @@ def session_detail(request: HttpRequest, code: str) -> JsonResponse: session = _maybe_promote_reveal_to_scoreboard(session) current_round_question = _get_current_round_question(session) - round_question_payload = None - if current_round_question: - round_question_payload = { - "id": current_round_question.id, - "round_number": current_round_question.round_number, - "prompt": current_round_question.question.prompt, - "shown_at": current_round_question.shown_at.isoformat(), - "answers": [{"text": text} for text in (current_round_question.mixed_answers or [])], - } + round_question_payload = _build_round_question_payload(current_round_question) phase_view_model = _build_phase_view_model( session,