60 lines
1.7 KiB
Python
60 lines
1.7 KiB
Python
"""Regression coverage for Claude CLI temporary-directory cleanup."""
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import os
|
|
import shutil
|
|
import tempfile
|
|
from types import SimpleNamespace
|
|
|
|
from skillopt.model import claude_backend
|
|
|
|
|
|
def test_claude_print_uses_cleanup_tolerant_temporary_directory(monkeypatch) -> None:
|
|
cleanup_modes = []
|
|
subprocess_cwd = ""
|
|
|
|
def simulated_windows_rmtree(cls, name, ignore_errors=False, repeated=False):
|
|
del cls, repeated
|
|
cleanup_modes.append(ignore_errors)
|
|
if not ignore_errors:
|
|
raise PermissionError(32, "directory is still in use", name)
|
|
shutil.rmtree(name, ignore_errors=True)
|
|
|
|
def fake_run(*args, **kwargs):
|
|
nonlocal subprocess_cwd
|
|
subprocess_cwd = kwargs["cwd"]
|
|
payload = {
|
|
"type": "result",
|
|
"result": "ok",
|
|
"usage": {"input_tokens": 2, "output_tokens": 3},
|
|
}
|
|
return SimpleNamespace(
|
|
returncode=0,
|
|
stdout=json.dumps(payload) + "\n",
|
|
stderr="",
|
|
)
|
|
|
|
monkeypatch.setattr(
|
|
tempfile.TemporaryDirectory,
|
|
"_rmtree",
|
|
classmethod(simulated_windows_rmtree),
|
|
)
|
|
monkeypatch.setattr(claude_backend.subprocess, "run", fake_run)
|
|
|
|
text, _, usage = claude_backend._run_claude_print(
|
|
system="system",
|
|
prompt="prompt",
|
|
model="",
|
|
tools=None,
|
|
tool_choice=None,
|
|
return_message=False,
|
|
timeout=10,
|
|
)
|
|
|
|
assert text == "ok"
|
|
assert usage == {"prompt_tokens": 2, "completion_tokens": 3, "total_tokens": 5}
|
|
assert cleanup_modes == [True]
|
|
assert subprocess_cwd
|
|
assert not os.path.exists(subprocess_cwd)
|