91 lines
4.3 KiB
Python
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"))
|