refactor(gameplay): extract round question payload builder
All checks were successful
CI / test-and-quality (push) Successful in 3m41s
CI / test-and-quality (pull_request) Successful in 3m42s

This commit is contained in:
2026-03-17 18:55:28 +00:00
parent 319038555a
commit c45f04f9f1
4 changed files with 25 additions and 10 deletions

View File

@@ -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: def build_reveal_payload(round_question: RoundQuestion | None) -> dict | None:
if round_question is None: if round_question is None:
return None return None

View File

@@ -6,7 +6,12 @@ from django.test import TestCase
from django.utils import timezone from django.utils import timezone
from fupogfakta.models import Category, GameSession, Guess, LieAnswer, Player, Question, RoundConfig, RoundQuestion, ScoreEvent 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 ( from fupogfakta.services import (
finish_game, finish_game,
get_current_round_question, get_current_round_question,
@@ -277,6 +282,7 @@ class FupOgFaktaExtractionSliceTests(TestCase):
fooled_player=self.bob, 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) lie_payload = build_lie_started_payload(self.session, self.round_config, round_question)
reveal_payload = build_reveal_payload(round_question) reveal_payload = build_reveal_payload(round_question)
phase_view_model = build_phase_view_model( phase_view_model = build_phase_view_model(
@@ -285,6 +291,8 @@ class FupOgFaktaExtractionSliceTests(TestCase):
has_round_question=True, 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["category"], {"slug": self.category.slug, "name": self.category.name})
self.assertEqual(lie_payload["round_question_id"], round_question.id) self.assertEqual(lie_payload["round_question_id"], round_question.id)
self.assertEqual(reveal_payload["correct_answer"], "1989") self.assertEqual(reveal_payload["correct_answer"], "1989")

View File

@@ -60,6 +60,7 @@ class LobbyGameplayExtractionTests(TestCase):
self.assertIs(lobby_views._start_next_round, gameplay_services.start_next_round) 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._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_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) 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): def test_start_next_round_view_source_stays_http_thin(self):

View File

@@ -14,6 +14,7 @@ from fupogfakta.payloads import (
build_lie_started_payload as _build_lie_started_payload, build_lie_started_payload as _build_lie_started_payload,
build_phase_view_model as _build_phase_view_model, build_phase_view_model as _build_phase_view_model,
build_reveal_payload as _build_reveal_payload, 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, build_scoreboard_phase_event as _build_scoreboard_phase_event,
) )
from fupogfakta.services import ( from fupogfakta.services import (
@@ -190,15 +191,7 @@ def session_detail(request: HttpRequest, code: str) -> JsonResponse:
session = _maybe_promote_reveal_to_scoreboard(session) session = _maybe_promote_reveal_to_scoreboard(session)
current_round_question = _get_current_round_question(session) current_round_question = _get_current_round_question(session)
round_question_payload = None round_question_payload = _build_round_question_payload(current_round_question)
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 [])],
}
phase_view_model = _build_phase_view_model( phase_view_model = _build_phase_view_model(
session, session,