"""Tests du déclencheur clavier ("clavier") et du minuteur récurrent ("minuteur") — Phase 3 du plan d'extension du moteur. Comme le reste du graphe de logique côté client, le comportement RÉEL d'un vrai keydown/ setInterval n'est pas testable sans navigateur (voir play_js_bundle() — on vérifie que la logique existe dans le JS livré, pas qu'elle s'exécute).""" 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_keyboard_trigger_node_persists_key(client, game): screen_id = _create_screen(client, game) node_id = _add_flow_node(client, game, screen_id, node_type="trigger", trigger_event="clavier", trigger_key="ArrowUp") node = screens.get_flow_node(game, node_id) assert node["trigger_event"] == "clavier" assert node["trigger_key"] == "ArrowUp" assert node["trigger_element_id"] is None def test_keyboard_trigger_persists_space_key(client, game): """La barre d'espace (ev.key === ' ', un seul caractère espace) ne doit PAS être traitée comme une valeur "vide" par add_flow_node.py (qui filtre None/"" — " " n'est ni l'un ni l'autre) : une touche très probablement utilisée ("Espace pour sauter") doit bien se persister.""" screen_id = _create_screen(client, game) node_id = _add_flow_node(client, game, screen_id, node_type="trigger", trigger_event="clavier", trigger_key=" ") node = screens.get_flow_node(game, node_id) assert node["trigger_key"] == " " def test_timer_trigger_node_persists_interval(client, game): screen_id = _create_screen(client, game) node_id = _add_flow_node( client, game, screen_id, node_type="trigger", trigger_event="minuteur", trigger_interval_ms=500, ) node = screens.get_flow_node(game, node_id) assert node["trigger_event"] == "minuteur" assert node["trigger_interval_ms"] == 500 def test_play_page_exposes_keyboard_and_timer_trigger_runtime(client, game): js = play_js_bundle() assert "bindKeyboardTriggers" in js assert "'clavier'" in js assert "runScreenTimerTriggers" in js assert "'minuteur'" in js assert "trigger_interval_ms" in js