mirror of
https://github.com/nesquena/hermes-webui.git
synced 2026-05-24 18:50:15 +00:00
83 lines
2.6 KiB
Python
83 lines
2.6 KiB
Python
import json
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from api import workspace
|
|
|
|
|
|
def test_load_workspaces_preserves_unavailable_entries_on_disk(tmp_path, monkeypatch):
|
|
"""A transient stat/is_dir failure must not silently delete a saved workspace."""
|
|
state_dir = tmp_path / "state"
|
|
state_dir.mkdir()
|
|
existing = tmp_path / "existing"
|
|
existing.mkdir()
|
|
unavailable = tmp_path / "missing-or-inaccessible"
|
|
ws_file = state_dir / "workspaces.json"
|
|
raw = [
|
|
{"path": str(existing), "name": "Existing"},
|
|
{"path": str(unavailable), "name": "Unavailable"},
|
|
]
|
|
ws_file.write_text(json.dumps(raw), encoding="utf-8")
|
|
monkeypatch.setattr(workspace, "_workspaces_file", lambda: ws_file)
|
|
|
|
loaded = workspace.load_workspaces()
|
|
|
|
assert [w["path"] for w in loaded] == [str(existing.resolve()), str(unavailable.resolve())]
|
|
assert json.loads(ws_file.read_text(encoding="utf-8")) == raw
|
|
|
|
|
|
def test_clean_workspace_list_still_renames_default_without_dropping_missing(tmp_path):
|
|
missing = tmp_path / "temporarily-unavailable"
|
|
|
|
cleaned = workspace._clean_workspace_list([
|
|
{"path": str(missing), "name": "default"},
|
|
])
|
|
|
|
assert cleaned == [{"path": str(missing.resolve()), "name": "Home"}]
|
|
|
|
|
|
def test_validate_workspace_to_add_distinguishes_permission_denied(monkeypatch, tmp_path):
|
|
candidate = tmp_path / "Documents"
|
|
candidate.mkdir()
|
|
|
|
target = str(candidate.resolve())
|
|
original_stat = Path.stat
|
|
|
|
def fake_stat(self):
|
|
if str(self) == target:
|
|
raise PermissionError("Operation not permitted")
|
|
return original_stat(self)
|
|
|
|
monkeypatch.setattr(Path, "stat", fake_stat)
|
|
|
|
with pytest.raises(ValueError) as excinfo:
|
|
workspace.validate_workspace_to_add(str(candidate))
|
|
|
|
message = str(excinfo.value)
|
|
assert "Cannot access path" in message
|
|
assert "Operation not permitted" in message
|
|
assert "macOS" in message
|
|
assert "Full Disk Access" in message
|
|
|
|
|
|
def test_resolve_trusted_workspace_distinguishes_missing_from_permission_denied(monkeypatch, tmp_path):
|
|
candidate = tmp_path / "Documents"
|
|
candidate.mkdir()
|
|
|
|
target = str(candidate.resolve())
|
|
original_stat = Path.stat
|
|
|
|
def fake_stat(self):
|
|
if str(self) == target:
|
|
raise PermissionError("Operation not permitted")
|
|
return original_stat(self)
|
|
|
|
monkeypatch.setattr(Path, "stat", fake_stat)
|
|
|
|
with pytest.raises(ValueError) as excinfo:
|
|
workspace.resolve_trusted_workspace(str(candidate))
|
|
|
|
assert "Cannot access path" in str(excinfo.value)
|
|
assert "Path does not exist" not in str(excinfo.value)
|