Padcontrole toetsen zonder op de omgeving te leunen
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 17m42s
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:
parent
90e4160727
commit
1530df277d
2 changed files with 37 additions and 1 deletions
|
|
@ -48,6 +48,11 @@ def _mountpunten() -> list[str]:
|
||||||
return punten
|
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:
|
def bereikbaar(pad: str) -> dict:
|
||||||
"""Kan Server Up hier schrijven, en komt dat ook op de host terecht?
|
"""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("/")
|
basis = (cfg.load().get("BASE_DIR") or cfg.DEFAULTS["BASE_DIR"]).rstrip("/")
|
||||||
# Buiten een container (bij het ontwikkelen) is alles bereikbaar.
|
# Buiten een container (bij het ontwikkelen) is alles bereikbaar.
|
||||||
in_container = Path("/.dockerenv").exists()
|
in_container = _in_container()
|
||||||
punten = _mountpunten() if in_container else []
|
punten = _mountpunten() if in_container else []
|
||||||
|
|
||||||
binnen = any(schoon == m or schoon.startswith(m.rstrip("/") + "/")
|
binnen = any(schoon == m or schoon.startswith(m.rstrip("/") + "/")
|
||||||
|
|
|
||||||
|
|
@ -174,7 +174,14 @@ def test_relatief_pad_wordt_geweigerd(env):
|
||||||
|
|
||||||
|
|
||||||
def test_onschrijfbaar_pad_wordt_gemeld(env, tmp_path, monkeypatch):
|
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
|
from core import paden
|
||||||
|
monkeypatch.setattr(paden, "_in_container", lambda: False)
|
||||||
monkeypatch.setattr(Path, "mkdir",
|
monkeypatch.setattr(Path, "mkdir",
|
||||||
lambda *a, **k: (_ for _ in ()).throw(OSError("alleen-lezen")))
|
lambda *a, **k: (_ for _ in ()).throw(OSError("alleen-lezen")))
|
||||||
uit = paden.bereikbaar(str(tmp_path / "kan-niet"))
|
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"]
|
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 ────────────────────────────────────────────────────────────────
|
# ── Voortgang ────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
def test_voortgang_komt_door_de_api(client, env):
|
def test_voortgang_komt_door_de_api(client, env):
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue