Fusionner l'index du worker dans la coquille au rebuild (1er chargement complet)
- Sur la webapp légère, le rebuild ne voyait que le cache local : la coquille HTML embarquait un sous-ensemble des tuiles et le premier chargement n'affichait pas les tuiles récentes du worker — elles n'arrivaient qu'au sondage /api/tiles suivant (15 s). - _merge_remote_index() applique au rebuild la même fusion que /api/tiles (l'index distant prime, le local complète) et réécrit index_tiles.json ET la liste embarquée dans index.html. - AGENTS.md : avertissement — le Pi de prod tourne en compose+override (labels Traefik + /srv/lidar/output), jamais via serve-webapp.sh.
This commit is contained in:
@ -332,6 +332,51 @@ def test_rebuild_flag_synchronous(monkeypatch):
|
||||
webapp._rebuild.update(saved)
|
||||
|
||||
|
||||
def test_merge_remote_index_merges_files(tmp_path, monkeypatch):
|
||||
"""Le rebuild fusionne l'index du worker dans les fichiers, pas seulement /api/tiles.
|
||||
|
||||
Sans fusion, la coquille HTML embarque un sous-ensemble des tuiles (le
|
||||
cache local seul) : au 1er chargement, les tuiles récentes du worker
|
||||
manquent et n'arrivent qu'au sondage suivant.
|
||||
"""
|
||||
import json as _json
|
||||
import lidar_pipeline.webapp as webapp
|
||||
|
||||
monkeypatch.setattr(webapp, "OUTPUT_DIR", tmp_path)
|
||||
locale = {"col": 10, "row": 20, "resolution": 0.2, "name": "locale", "viz": {}}
|
||||
perimee = {"col": 11, "row": 20, "resolution": 0.2, "name": "locale-perimee", "viz": {}}
|
||||
dist_neuve = {"col": 11, "row": 20, "resolution": 0.2, "name": "distante-neuve", "viz": {}}
|
||||
dist_seule = {"col": 12, "row": 20, "resolution": 0.2, "name": "distante-seule", "viz": {}}
|
||||
(tmp_path / "index_tiles.json").write_text(_json.dumps(
|
||||
{"tiles": [locale, perimee],
|
||||
"viz_meta": {"aspect": {"label": "Aspect"}},
|
||||
"stats": {"n_tiles": 2}}), encoding="utf-8")
|
||||
(tmp_path / "index.html").write_text(
|
||||
"<html><script>const TILES = " + _json.dumps([locale, perimee])
|
||||
+ ";</script></html>", encoding="utf-8")
|
||||
monkeypatch.setattr(webapp, "_remote_tiles_data", lambda: {
|
||||
"tiles": [dist_neuve, dist_seule],
|
||||
"viz_meta": {"aspect": {"label": "Aspect distant"}},
|
||||
"stats": {"n_tiles": 2},
|
||||
})
|
||||
webapp._merge_remote_index()
|
||||
data = _json.loads((tmp_path / "index_tiles.json").read_text(encoding="utf-8"))
|
||||
names = [t["name"] for t in data["tiles"]]
|
||||
# Le distant prime sur la même position, le local complète les autres.
|
||||
assert "distante-neuve" in names and "locale" in names and "distante-seule" in names
|
||||
assert "locale-perimee" not in names
|
||||
assert data["viz_meta"]["aspect"]["label"] == "Aspect distant"
|
||||
# La coquille embarque la même liste fusionnée.
|
||||
html = (tmp_path / "index.html").read_text(encoding="utf-8")
|
||||
assert "distante-neuve" in html and "distante-seule" in html
|
||||
assert "locale-perimee" not in html
|
||||
# Worker injoignable : fichiers laissés intacts.
|
||||
before = (tmp_path / "index_tiles.json").read_text(encoding="utf-8")
|
||||
monkeypatch.setattr(webapp, "_remote_tiles_data", lambda: None)
|
||||
webapp._merge_remote_index()
|
||||
assert (tmp_path / "index_tiles.json").read_text(encoding="utf-8") == before
|
||||
|
||||
|
||||
def test_static_mounts_served_no_cache(tmp_path):
|
||||
"""Les montages d'images servent Cache-Control: no-cache.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user