Padcontrole toetsen zonder op de omgeving te leunen
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 17m42s

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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
This commit is contained in:
Ramon 2026-08-02 14:12:37 +02:00
parent 90e4160727
commit 1530df277d
2 changed files with 37 additions and 1 deletions

View file

@ -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("/") + "/")

View file

@ -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):