From 1530df277da49364a92f5745661aba6312647ae4 Mon Sep 17 00:00:00 2001 From: Ramon Date: Sun, 2 Aug 2026 14:12:37 +0200 Subject: [PATCH] Padcontrole toetsen zonder op de omgeving te leunen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit De CI draait zelf in een container, dus `bereikbaar()` viel daar al bij `buiten_mount` uit voordat de schrijftest werd bereikt — de test slaagde alleen op een machine zonder /.dockerenv. - `_in_container()` afgesplitst, zodat de tests kiezen welke tak ze toetsen - de schrijftest zet dat expliciet uit - twee tests erbij voor de mountcontrole zelf, inclusief dat een gekoppelde /opt/serverup de map /opt/serverup-oud niet bereikbaar maakt Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy --- server-up/core/paden.py | 7 ++++++- tests/test_paden.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/server-up/core/paden.py b/server-up/core/paden.py index 88c9817..621be45 100644 --- a/server-up/core/paden.py +++ b/server-up/core/paden.py @@ -48,6 +48,11 @@ def _mountpunten() -> list[str]: return punten +def _in_container() -> bool: + """Draaien we in een container? Bepaalt of de mountcontrole zin heeft.""" + return Path("/.dockerenv").exists() + + def bereikbaar(pad: str) -> dict: """Kan Server Up hier schrijven, en komt dat ook op de host terecht? @@ -61,7 +66,7 @@ def bereikbaar(pad: str) -> dict: basis = (cfg.load().get("BASE_DIR") or cfg.DEFAULTS["BASE_DIR"]).rstrip("/") # Buiten een container (bij het ontwikkelen) is alles bereikbaar. - in_container = Path("/.dockerenv").exists() + in_container = _in_container() punten = _mountpunten() if in_container else [] binnen = any(schoon == m or schoon.startswith(m.rstrip("/") + "/") diff --git a/tests/test_paden.py b/tests/test_paden.py index cfc59bf..8ec4965 100644 --- a/tests/test_paden.py +++ b/tests/test_paden.py @@ -174,7 +174,14 @@ def test_relatief_pad_wordt_geweigerd(env): def test_onschrijfbaar_pad_wordt_gemeld(env, tmp_path, monkeypatch): + """Buiten een container komt de mountcontrole er niet aan te pas. + + Dit expliciet zetten in plaats van op de omgeving vertrouwen: de CI draait + zelf in een container, en daar sloeg deze test aan op `buiten_mount` zonder + ooit bij de schrijftest te komen. + """ from core import paden + monkeypatch.setattr(paden, "_in_container", lambda: False) monkeypatch.setattr(Path, "mkdir", lambda *a, **k: (_ for _ in ()).throw(OSError("alleen-lezen"))) uit = paden.bereikbaar(str(tmp_path / "kan-niet")) @@ -182,6 +189,30 @@ def test_onschrijfbaar_pad_wordt_gemeld(env, tmp_path, monkeypatch): assert "alleen-lezen" in uit["detail"] +def test_pad_buiten_de_mount_wordt_herkend(env, monkeypatch): + """In de container bestaat /srv wel als pad, maar wat je erheen schrijft + belandt in de overlay en niet op de host. Dat moet je vóóraf horen.""" + from core import paden + monkeypatch.setattr(paden, "_in_container", lambda: True) + monkeypatch.setattr(paden, "_mountpunten", lambda: ["/opt/serverup", "/data"]) + + uit = paden.bereikbaar("/srv/serverup/appdata") + assert not uit["ok"] and uit["reden"] == "buiten_mount" + # De melding moet zeggen wát je in .env zet, niet alleen dát het misging. + assert uit["voorstel_base"] == "/srv/serverup" + + # Wat wél gekoppeld is, komt gewoon door de mountcontrole heen. + assert paden.bereikbaar("/opt/serverup/appdata").get("reden") != "buiten_mount" + + +def test_de_mount_wordt_niet_op_naam_verward(env, monkeypatch): + """`/opt/serverup` gekoppeld maakt `/opt/serverup-oud` niet bereikbaar.""" + from core import paden + monkeypatch.setattr(paden, "_in_container", lambda: True) + monkeypatch.setattr(paden, "_mountpunten", lambda: ["/opt/serverup"]) + assert paden.bereikbaar("/opt/serverup-oud")["reden"] == "buiten_mount" + + # ── Voortgang ──────────────────────────────────────────────────────────────── def test_voortgang_komt_door_de_api(client, env):