FlowDeck CI / lint (push) Failing after 1s
FlowDeck CI / test (push) Failing after 2s
FlowDeck CI / docker (push) Skipped
FlowDeck CI / lint (pull_request) Failing after 2s
FlowDeck CI / test (pull_request) Failing after 18m37s
FlowDeck CI / docker (pull_request) Skipped
86 lines
3.9 KiB
Python
86 lines
3.9 KiB
Python
"""Page /recherche Flowdeck : onglets, base console, anti-cache (defaut 6).
|
|
|
|
Audit prealable (main 7.84.4, tag v7.84.4 = 984e92b) : la route
|
|
(app/routers/search.py:51), le gabarit (app/templates/recherche.html),
|
|
le JS (static/js/recherche.js) et le CSS (static/css/recherche.css)
|
|
contenaient DEJA la page a onglets des PR #33/#36 — aucune route
|
|
fantome, aucun bloc `scripts` manquant dans base.html:869, aucune
|
|
regle CSP ne bloquant le script (script-src 'self'). Le symptome
|
|
deploie (« pas d'onglets, resultats Flowdeck seuls ») ne s'explique
|
|
donc PAS par un mauvais gabarit dans main, mais par deux causes
|
|
reelles, corrigees ici :
|
|
|
|
1. Assets recherche servis CACHE-FIRST par le service worker
|
|
(static/sw.js) SANS version (?v= absent) sous un CACHE_NAME
|
|
inchange depuis A20 ('flowdeck-v8') : un navigateur ayant visite
|
|
Flowdeck avant #33 gardait le recherche.js pre-#33 (sans onglets,
|
|
sans compteurs, sans logique console, « Tout voir » naviguant
|
|
ailleurs) et le recherche.css pre-#33 (sans .rp-tabs) — la page
|
|
paraissait donc « non corrigee » malgre les deplois 7.84.3/7.84.4,
|
|
et le repli networkFirst du HTML vers le cache couvrait aussi le
|
|
cas reseau lent. Correctif : liens versionnes (?v=asset_version,
|
|
comme tous les autres assets de base.html) + bump CACHE_NAME
|
|
(purge a l'activation du nouveau worker).
|
|
2. Flowdeck etait le seul hote a ne pas rendre data-base-console
|
|
(son propre commentaire l'admettait) : la base console de l'onglet
|
|
Console Spark etait devine (derivation -dev / href d'onglet de
|
|
barre) au lieu d'etre explicite. Correctif : la route expose
|
|
`bases.agent` et le gabarit le rend en data-base-console.
|
|
|
|
La logique d'onglets elle-meme (focus, compteurs, « Tout voir » sur
|
|
place, etats par application, liens -dev, console sur
|
|
GET /api/v1/recherche) est deja couverte par tests/recherche.test.js
|
|
(suite Node, lancee en sandbox) ; ce fichier-ci verrouille le
|
|
branchement gabarit/route/service worker, sans serveur ni base.
|
|
"""
|
|
|
|
import re
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parent.parent
|
|
|
|
ONGLETS_ATTENDUS = ["all", "obsigate", "flowdeck", "tiktak", "kanbante",
|
|
"console"]
|
|
|
|
|
|
def test_gabarit_recherche_onglets_complets():
|
|
gabarit = (ROOT / "app/templates/recherche.html").read_text()
|
|
trouves = re.findall(r'data-rp-tab="([^"]+)"', gabarit)
|
|
assert trouves == ONGLETS_ATTENDUS, trouves
|
|
for section in ("obsigate", "flowdeck", "tiktak", "kanbante", "console"):
|
|
assert f'data-rp-section="{section}"' in gabarit
|
|
assert 'id="rp-q"' in gabarit and "autofocus" in gabarit
|
|
|
|
|
|
def test_gabarit_recherche_base_console_explicite():
|
|
gabarit = (ROOT / "app/templates/recherche.html").read_text()
|
|
assert 'data-base-console="{{ bases.agent }}"' in gabarit
|
|
|
|
|
|
def test_gabarit_recherche_assets_versionnes():
|
|
"""Sans ?v=, le SW cache-first ressert les copies pre-#33."""
|
|
gabarit = (ROOT / "app/templates/recherche.html").read_text()
|
|
assert "/static/css/recherche.css?v={{ asset_version }}" in gabarit
|
|
assert "/static/js/recherche.js?v={{ asset_version }}" in gabarit
|
|
|
|
|
|
def test_route_recherche_expose_base_agent():
|
|
route = (ROOT / "app/routers/search.py").read_text()
|
|
assert '"agent"' in route or "'agent'" in route
|
|
assert "bases.agent" in (ROOT / "app/templates/recherche.html").read_text()
|
|
|
|
|
|
def test_service_worker_purge_anciens_caches():
|
|
"""Le bump de CACHE_NAME purge les caches pre-#33 a l'activation."""
|
|
sw = (ROOT / "static/sw.js").read_text()
|
|
assert "const CACHE_NAME = 'flowdeck-v9'" in sw
|
|
assert "flowdeck-v8" not in sw
|
|
assert "cache-first" in sw or "cacheFirst" in sw
|
|
|
|
|
|
def test_recherche_js_branche_console_v1():
|
|
"""Rappel : l'onglet console appelle GET /api/v1/recherche (cf. #36)."""
|
|
js = (ROOT / "static/js/recherche.js").read_text()
|
|
assert 'CONSOLE_SEARCH_PATH = "api/v1/recherche"' in js
|
|
assert "CONSOLE_SEARCH_LIMIT = 20" in js
|