Ctrl K
ComunidadGuías…

test_serve_app_js_groupby_filtre.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""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()