Files
weirsoe-party-protocol/voice/tests.py
Asger Geel Weirsøe a81bc1250c
Some checks failed
CI / test-and-quality (push) Failing after 4m4s
Big visual overhaul docker compsoe file etc
2026-03-23 14:11:30 +01:00

91 lines
4.3 KiB
Python

import tempfile
from django.contrib.auth import get_user_model
from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import TestCase, override_settings
from fupogfakta.models import Category, GameSession, Question, RoundQuestion
from voice.models import PhaseVoiceLine, QuestionVoiceLine
from voice.services import resolve_session_voice_cues
User = get_user_model()
class VoiceCueResolutionTests(TestCase):
def setUp(self):
self.host = User.objects.create_user(username="voice_host", password="secret123")
self.session = GameSession.objects.create(host=self.host, code="VOICE1", status=GameSession.Status.LIE)
self.category = Category.objects.create(name="Voice", slug="voice", is_active=True)
self.question = Question.objects.create(
category=self.category,
prompt="Which city is the capital of Denmark?",
correct_answer="Copenhagen",
is_active=True,
)
self.round_question = RoundQuestion.objects.create(
session=self.session,
round_number=1,
question=self.question,
correct_answer=self.question.correct_answer,
)
def test_resolve_session_voice_cues_builds_default_multilocale_payload(self):
payload = resolve_session_voice_cues(self.session, current_round_question=self.round_question)
self.assertEqual(payload["default_locale"], "en")
self.assertEqual(payload["intro"]["cue"], "intro")
self.assertIn("Welcome to Fup og Fakta", payload["intro"]["translations"]["en"])
self.assertIn("Velkommen til Fup og Fakta", payload["intro"]["translations"]["da"])
self.assertEqual(payload["intro"]["audio_urls"], {})
self.assertEqual(payload["phase"]["cue"], GameSession.Status.LIE)
self.assertIn(self.question.prompt, payload["question_prompt"]["translations"]["en"])
self.assertIsNone(payload["question_reveal"])
def test_custom_phase_and_question_voice_lines_override_defaults(self):
PhaseVoiceLine.objects.create(
game_key="fupogfakta",
cue_key=PhaseVoiceLine.CueKey.INTRO,
locale="da",
text="Special dansk intro.",
)
QuestionVoiceLine.objects.create(
question=self.question,
cue_key=QuestionVoiceLine.CueKey.QUESTION_PROMPT,
locale="en",
text="Custom English prompt line.",
)
payload = resolve_session_voice_cues(self.session, current_round_question=self.round_question)
self.assertEqual(payload["intro"]["source"], "custom")
self.assertEqual(payload["intro"]["translations"]["da"], "Special dansk intro.")
self.assertEqual(payload["question_prompt"]["source"], "custom")
self.assertEqual(payload["question_prompt"]["translations"]["en"], "Custom English prompt line.")
def test_custom_audio_files_are_exposed_per_locale(self):
with tempfile.TemporaryDirectory() as media_root:
with override_settings(MEDIA_ROOT=media_root):
PhaseVoiceLine.objects.create(
game_key="fupogfakta",
cue_key=PhaseVoiceLine.CueKey.INTRO,
locale="en",
text="English intro with audio.",
audio_file=SimpleUploadedFile("intro-en.mp3", b"fake-mp3-content", content_type="audio/mpeg"),
)
QuestionVoiceLine.objects.create(
question=self.question,
cue_key=QuestionVoiceLine.CueKey.QUESTION_PROMPT,
locale="da",
text="Dansk sporgsmal med lyd.",
audio_file=SimpleUploadedFile("question-da.mp3", b"fake-mp3-content", content_type="audio/mpeg"),
)
payload = resolve_session_voice_cues(self.session, current_round_question=self.round_question)
self.assertEqual(payload["intro"]["source"], "custom")
self.assertIn("/media/voice/phase/", payload["intro"]["audio_urls"]["en"])
self.assertTrue(payload["intro"]["audio_urls"]["en"].endswith("intro-en.mp3"))
self.assertEqual(payload["question_prompt"]["source"], "custom")
self.assertIn("/media/voice/question/", payload["question_prompt"]["audio_urls"]["da"])
self.assertTrue(payload["question_prompt"]["audio_urls"]["da"].endswith("question-da.mp3"))