Files
devplacepy/tests/unit/services/containers/store.py
T
retoorandClaude Sonnet 5 68a7c3b002 Give the system-prune CLI command a two-phase plan/execute report
Restructures the disk-cleanup command to show location, current on-disk
size, and an estimated reclaim per area (attachments, project files,
container workspaces) before touching anything - --dry-run stops there.
A real run re-executes each check, reports actual items/bytes freed,
an "After" size per area, and a final total with elapsed time, flagging
any drift between the estimate and execution passes (e.g. the live
server wrote something in between).

store.gc_workspaces() now reports bytes freed alongside the removed
count (previously count-only), so the containers gc-workspaces CLI
action picks up the same reporting for free.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W5tFWkm3UbcstcbPKFE5gP
2026-09-08 05:07:31 +02:00

82 lines
2.4 KiB
Python

# retoor <retoor@molodetz.nl>
import pytest
from devplacepy.database import get_table, init_db
from devplacepy.services.containers import store
from devplacepy.utils import generate_uid
@pytest.fixture(autouse=True)
def _init_db_containers_store():
init_db()
yield
def _make_instance(project_uid, deleted_at=None):
uid = generate_uid()
get_table("instances").insert(
{
"uid": uid,
"project_uid": project_uid,
"deleted_at": deleted_at,
"deleted_by": None,
"name": f"inst-{uid[:8]}",
"status": "running",
"desired_state": "running",
}
)
return uid
def test_gc_workspaces_removes_directories_with_no_live_instance(
local_db, tmp_path, monkeypatch
):
monkeypatch.setattr("devplacepy.config.CONTAINER_WORKSPACES_DIR", tmp_path)
active_project = "gcws-active-project"
orphan_project = "gcws-orphan-project"
(tmp_path / active_project).mkdir()
(tmp_path / orphan_project).mkdir()
(tmp_path / orphan_project / "leftover.bin").write_bytes(b"x" * 42)
_make_instance(active_project)
removed, freed = store.gc_workspaces()
assert removed == 1
assert freed == 42
assert (tmp_path / active_project).exists()
assert not (tmp_path / orphan_project).exists()
def test_gc_workspaces_ignores_soft_deleted_instances(local_db, tmp_path, monkeypatch):
monkeypatch.setattr("devplacepy.config.CONTAINER_WORKSPACES_DIR", tmp_path)
project = "gcws-soft-deleted-project"
(tmp_path / project).mkdir()
_make_instance(project, deleted_at="2020-01-01T00:00:00+00:00")
removed, freed = store.gc_workspaces()
assert removed == 1
assert freed == 0
assert not (tmp_path / project).exists()
def test_gc_workspaces_dry_run_changes_nothing(local_db, tmp_path, monkeypatch):
monkeypatch.setattr("devplacepy.config.CONTAINER_WORKSPACES_DIR", tmp_path)
orphan_project = "gcws-dry-run-project"
(tmp_path / orphan_project).mkdir()
(tmp_path / orphan_project / "leftover.bin").write_bytes(b"y" * 7)
removed, freed = store.gc_workspaces(dry_run=True)
assert removed == 1
assert freed == 7
assert (tmp_path / orphan_project).exists()
def test_gc_workspaces_missing_base_dir_is_a_noop(local_db, tmp_path, monkeypatch):
monkeypatch.setattr(
"devplacepy.config.CONTAINER_WORKSPACES_DIR", tmp_path / "does-not-exist"
)
assert store.gc_workspaces() == (0, 0)