"""Apps verwijderen: veilige dataretentie, volledige wisactie en symlinks.""" import time from conftest import login def _wacht(client, jid, timeout=5): einde = time.time() + timeout while time.time() < einde: data = client.get(f"/api/jobs/{jid}").get_json() or {} if data.get("status") in ("done", "error"): return data time.sleep(0.03) return {} def _stack(env, naam): pad = env["lib"] / naam pad.mkdir() (pad / "compose.yaml").write_text( "services:\n web:\n image: nginx\n", encoding="utf-8") data = env["tmp"] / "appdata" / naam data.mkdir(parents=True) (data / "blijft.txt").write_text("data", encoding="utf-8") return pad, data def test_app_verwijderen_haalt_app_weg_en_bewaart_data( client, env, monkeypatch): from core import docker csrf = login(client) env["core"].patch({"BACKUP_BEFORE_REMOVE": False}) stack, data = _stack(env, "veilig") volumes = [] monkeypatch.setattr( docker, "compose_down", lambda *a, **kw: volumes.append(kw.get("volumes")) or 0) r = client.post("/api/stacks/veilig/remove", json={"mode": "full"}, headers={"X-CSRF-Token": csrf}) job = _wacht(client, r.get_json()["job_id"]) assert job["status"] == "done" assert not stack.exists() assert data.is_dir() assert volumes == [False] def test_app_en_data_verwijderen_wist_ook_volumes_en_appdata( client, env, monkeypatch): from core import docker csrf = login(client) env["core"].patch({"BACKUP_BEFORE_REMOVE": False}) stack, data = _stack(env, "alles") volumes = [] monkeypatch.setattr( docker, "compose_down", lambda *a, **kw: volumes.append(kw.get("volumes")) or 0) r = client.post("/api/stacks/alles/remove", json={"mode": "all"}, headers={"X-CSRF-Token": csrf}) job = _wacht(client, r.get_json()["job_id"]) assert job["status"] == "done" assert not stack.exists() assert not data.exists() assert volumes == [True] def test_overgenomen_app_verwijderen_haalt_alleen_symlink_weg( client, env, monkeypatch): from core import docker csrf = login(client) env["core"].patch({"BACKUP_BEFORE_REMOVE": False}) bron = env["tmp"] / "eigen-compose" bron.mkdir() (bron / "compose.yaml").write_text( "services:\n web:\n image: nginx\n", encoding="utf-8") link = env["lib"] / "overgenomen" link.symlink_to(bron) monkeypatch.setattr(docker, "compose_down", lambda *a, **kw: 0) r = client.post("/api/stacks/overgenomen/remove", json={"mode": "full"}, headers={"X-CSRF-Token": csrf}) assert r.status_code == 200, r.get_json() job = _wacht(client, r.get_json()["job_id"]) assert job["status"] == "done" assert not link.exists() and not link.is_symlink() assert (bron / "compose.yaml").is_file()