test_serve_app_js_groupby_filtre.py
Rama main · réplica de lectura del repositorio original.
"""Issue #36, suite : dans le panneau du filtre, « Grouper par » apparaît et
disparaît dès qu'on change de caméra dans la liste, sans attendre « Filtrer »
puis une réouverture. Le vrai code de serve_app.js, exécuté par node avec un
faux DOM."""
from __future__ import annotations
import re
import shutil
import subprocess
import unittest
from pathlib import Path
RACINE = Path(__file__).parent
class TestsGroupByDansLeFiltre(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.node = shutil.which("node")
if cls.node is None:
raise unittest.SkipTest("node introuvable")
cls.source = (RACINE / "serve_app.js").read_text(encoding="utf-8")
fragments = []
for nom in ("regroupable", "majGroupBy"):
trouve = re.search(rf"^function {nom}\(.*?^\}}", cls.source, re.DOTALL | re.MULTILINE)
if trouve is None:
raise AssertionError(f"fonction {nom}() introuvable")
fragments.append(trouve.group(0))
cls.code = "\n".join(fragments)
def visible(self, vue: str, camera: str) -> bool:
script = (
f"const boites = {{ view: {{ value: {vue!r} }}, camera: {{ value: {camera!r} }},\n"
" groupBySection: { hidden: true } };\n"
"function $(id) { return boites[id]; }\n"
+ self.code + "\n"
"majGroupBy();\n"
"process.stdout.write(String(!boites.groupBySection.hidden));\n"
)
resultat = subprocess.run([self.node, "-e", script], capture_output=True, text=True,
encoding="utf-8", timeout=60)
self.assertEqual(resultat.returncode, 0, resultat.stderr)
return resultat.stdout == "true"
def test_journalieres_toutes_cameras_le_choix_est_visible(self):
self.assertTrue(self.visible("daily", ""))
def test_journalieres_une_camera_le_choix_disparait(self):
self.assertFalse(self.visible("daily", "camera-abc"))
def test_hebdomadaires_et_mensuelles_n_ont_jamais_le_choix(self):
for vue in ("weekly", "monthly", "clips", "direct", "live"):
with self.subTest(vue=vue):
self.assertFalse(self.visible(vue, ""))
def test_le_choix_suit_la_liste_des_cameras_sans_valider_le_filtre(self):
# Le cas signalé : d'une caméra à « toutes les caméras », le choix devait
# apparaître tout de suite, sans « Filtrer » ni réouverture.
self.assertIn('$("camera").addEventListener("change", majGroupBy);', self.source)
def test_ouvrir_le_filtre_et_le_rendu_passent_par_la_meme_fonction(self):
ouvrir = re.search(r"^function ouvrirFiltre\(.*?^\}", self.source, re.DOTALL | re.MULTILINE)
self.assertIsNotNone(ouvrir)
self.assertIn("majGroupBy();", ouvrir.group(0))
self.assertIn(" majGroupBy();\n $(\"filtreResume\")", self.source)
# Plus de second calcul du même état, qui pourrait diverger.
self.assertEqual(self.source.count('$("groupBySection").hidden ='), 1)
if __name__ == "__main__":
unittest.main()