Files
Forge-Engine/tests/test_sound.py
T
william 50835a18e2
Build and deploy / test-python (push) Successful in 9m41s
Build and deploy / test-js (push) Successful in 1m0s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped
Supprime le type d'écran "document" et recentre le produit sur le jeu 2D
Le document de cadrage produit cible des formateurs non techniques créant
des serious games/quiz gamifiés — l'éditeur générique "document" (blocs de
logique en nœuds, timeline d'animation, définitions d'objets/relations,
templates réutilisables) est une complexité hors cible que l'effort
d'ingénierie récent avait déjà abandonnée au profit du jeu_2d.

- Onboarding : ne garde que le parcours "RPG" (jeu_2d), retire
  Quiz/Embranchement/Créer mon jeu de A à Z (tous document-only)
- Suppression en bloc des modules exclusifs au document : routes/elements,
  routes/element_types, routes/objects, routes/legacy_actions,
  screens/elements, screens/element_types, screens/widgets,
  screens/legacy_actions, le rendu render_element_html.py et son cluster,
  templates/screen_edit.html, templates/game_dashboard.html,
  flow-editor.js/tabs-and-blocks.js/animation-timeline.js
- Dashboard toujours simplifié (un seul mode possible désormais)
- Tests document-only supprimés, tests de logique partagée (flow,
  événements personnalisés, animations) retargetés sur des écrans jeu_2d
- Aucune régression jeu_2d : 299 tests passent

Carte d'onboarding retravaillée : argumentaire RH non technique (liste à
coche, badge "Compatible LMS"), taille et interaction de retournement
ajustées.
2026-09-04 20:56:32 +02:00

100 lines
3.9 KiB
Python

"""Son — Phase 6 du plan d'extension du moteur : musique de fond par écran
(en boucle, suit le cycle de vie de l'écran) et action ponctuelle "Jouer un
son" (effet sonore, non bouclé). Comme le reste du graphe de logique côté
client, la lecture audio RÉELLE n'est pas testable sans navigateur (voir
play_js_bundle() — on vérifie que la logique existe dans le JS livré et que
les données persistent, pas qu'elles jouent un son)."""
import json
import re
from conftest import play_js_bundle
import screens
def _create_screen(client, slug, name="Accueil"):
resp = client.post(f"/game/{slug}/screens/new", data={"name": name}, follow_redirects=False)
return int(re.search(r"/screens/(\d+)/edit", resp.headers["Location"]).group(1))
def _add_flow_node(client, slug, screen_id, **fields):
resp = client.post(
f"/game/{slug}/screens/{screen_id}/flow/nodes/add",
data=json.dumps(fields),
content_type="application/json",
)
assert resp.status_code == 200
return resp.get_json()["id"]
def test_screen_background_music_persists(client, game):
screen_id = _create_screen(client, game)
resp = client.post(
f"/game/{game}/screens/{screen_id}/background-music",
data=json.dumps({"url": "https://example.com/song.mp3"}),
content_type="application/json",
)
assert resp.status_code == 200
screen = screens.get_screen(game, screen_id)
assert screen["background_music_url"] == "https://example.com/song.mp3"
def test_screen_background_music_empty_string_clears_it(client, game):
screen_id = _create_screen(client, game)
client.post(
f"/game/{game}/screens/{screen_id}/background-music",
data=json.dumps({"url": "https://example.com/song.mp3"}),
content_type="application/json",
)
client.post(
f"/game/{game}/screens/{screen_id}/background-music",
data=json.dumps({"url": ""}),
content_type="application/json",
)
screen = screens.get_screen(game, screen_id)
assert screen["background_music_url"] is None
def test_play_payload_exposes_background_music_per_screen(client, game):
screen_id = _create_screen(client, game)
client.post(
f"/game/{game}/screens/{screen_id}/background-music",
data=json.dumps({"url": "https://example.com/song.mp3"}),
content_type="application/json",
)
html = client.get(f"/game/{game}/runtime-payload").get_json()
screen_payload = next(s for s in html["screens"] if s["id"] == screen_id)
assert screen_payload["background_music_url"] == "https://example.com/song.mp3"
def test_sound_action_node_persists_url(client, game):
screen_id = _create_screen(client, game)
node_id = _add_flow_node(
client, game, screen_id, node_type="action", action_type="jouer_son",
data_value="https://example.com/effect.wav",
)
node = screens.get_flow_node(game, node_id)
assert node["action_type"] == "jouer_son"
assert node["data_value"] == "https://example.com/effect.wav"
def test_play_page_exposes_sound_runtime(client, game):
js = play_js_bundle()
assert "runScreenBackgroundMusic" in js
assert "'jouer_son'" in js
assert "new Audio" in js
def test_scene_editor_exposes_sound_action(client, game):
"""L'UI de réglage de la musique de fond par écran (screen-bg-music-url)
et le formulaire générique de nœud d'action (nf-action-sound-fields)
n'existaient que dans l'éditeur document, retiré — l'action "Jouer un
son" reste disponible pour jeu_2d via l'assistant "+ Action" de
l'onglet Collision (voir screens/scenes/flow_palette.py) ; le réglage
de musique de fond par écran (screen_set_background_music.py) reste
fonctionnel côté backend/API (voir les tests ci-dessus), même sans UI
dédiée dans le nouvel éditeur."""
screen_id = _create_screen(client, game)
html = client.get(f"/game/{game}/screens/{screen_id}/edit").get_data(as_text=True)
assert "jouer_son" in html