"""Lignes de dialogue (voir db/dialogue_lines.py) — réplique audio (demande explicite : "ajouter une réplique audio"), voix off jouée en même temps que la bulle de réplique s'affiche (voir static/js/play/ dialogue-box-controller.js::forgeRenderDialogueBoxLine).""" import db def test_sanitize_dialogue_lines_keeps_a_valid_audio_url_on_a_dialogue_line() -> None: lines = db.sanitize_dialogue_lines( [ {"speaker": "Marc", "text": "Bonjour !", "audio_url": "/assets/1/bonjour.mp3"}, ] ) assert lines == [{"type": "dialogue", "speaker": "Marc", "text": "Bonjour !", "audio_url": "/assets/1/bonjour.mp3"}] def test_sanitize_dialogue_lines_omits_audio_url_when_absent() -> None: lines = db.sanitize_dialogue_lines([{"speaker": "Marc", "text": "Bonjour !"}]) assert "audio_url" not in lines[0] def test_sanitize_dialogue_lines_omits_a_blank_audio_url() -> None: lines = db.sanitize_dialogue_lines([{"speaker": "Marc", "text": "Bonjour !", "audio_url": " "}]) assert "audio_url" not in lines[0] def test_sanitize_dialogue_lines_ignores_audio_url_on_a_question_line() -> None: """L'audio n'a de sens que pour une RÉPLIQUE — une question à choix ("❓ Question") reste inchangée, voir QUESTION_REWARD_TYPES.""" lines = db.sanitize_dialogue_lines( [ { "type": "question", "text": "2+2 ?", "choices": ["3", "4"], "correct_index": 1, "audio_url": "/assets/1/question.mp3", } ] ) assert "audio_url" not in lines[0]