"""Issue #40, réglages promis à MCas86 le 2026-10-19. Le titre et l'icône de l'en-tête, réglés une fois pour l'installation et insérés dans la page à chaque envoi ; la dernière vue retenue par navigateur, et la ronde qui reprend quand seule la fermeture de la page l'avait coupée. Le tri des caméras hors ligne est dans test_serve_app_js_confort_cameras.py. Côté page, le vrai code de serve_app.js, exécuté par node avec un faux DOM. """ from __future__ import annotations import json import os import re import shutil import subprocess import tempfile import unittest from pathlib import Path from unittest import mock from urllib.parse import unquote _IMPORT_HOME = tempfile.TemporaryDirectory(prefix="blink-entete-import-") with mock.patch.dict(os.environ, {"BLINK_BOOTSTRAP": "none", "BLINK_HOME": _IMPORT_HOME.name}): import serve import runtime RACINE = Path(__file__).parent SOURCE = (RACINE / "serve_app.js").read_text(encoding="utf-8") def entete(page: str) -> tuple[str, str, str]: titre = re.search(r"(.*?)", page).group(1) favicon = re.search(r'', page).group(1) h1 = re.search(r"

(.*?)", page).group(1) return titre, favicon, h1 class EnteteDeLaPage(unittest.TestCase): def test_sans_reglage_la_page_d_avant(self): titre, favicon, h1 = entete(serve.page_avec_entete(dict(runtime.REGLAGES_DEFAUT))) self.assertEqual((titre, favicon, h1), ("blink2video", "/favicon.ico", "blink2video")) def test_titre_et_icone_dans_l_en_tete_et_l_onglet(self): page = serve.page_avec_entete({"header_title": "Maison", "header_icon": "🏠"}) titre, favicon, h1 = entete(page) self.assertEqual(titre, "Maison") self.assertEqual(h1, '🏠 Maison') self.assertTrue(favicon.startswith("data:image/svg+xml,")) self.assertIn("🏠", unquote(favicon)) # La CSP de la page doit laisser passer cette icône d'onglet. self.assertIn("img-src 'self' data:", Path(serve.__file__).read_text(encoding="utf-8")) def test_icone_seule_garde_le_nom_de_l_application(self): titre, _, h1 = entete(serve.page_avec_entete({"header_title": "", "header_icon": "🚗"})) self.assertEqual((titre, h1), ("blink2video", '🚗 blink2video')) def test_texte_echappe_et_marqueurs_laisses_tels_quels(self): page = serve.page_avec_entete({"header_title": ' & "__FAVICON__"', "header_icon": '">'}) titre, favicon, h1 = entete(page) self.assertEqual(titre, "<script>x</script> & "__FAVICON__"") self.assertNotIn("