open-swe/tests/agent/test_repo_prep.py

146 lines
4.7 KiB
Python
Raw Permalink Normal View History

from __future__ import annotations
from deepagents.backends.protocol import ExecuteResponse
from agent.utils.repo_prep import materialize_trusted_skills, prepare_review_repo
class _FakeSandboxBackend:
def __init__(
self,
*,
exit_code: int = 0,
raise_exc: bool = False,
output: str = "",
outputs: list[str] | None = None,
) -> None:
self._exit_code = exit_code
self._raise = raise_exc
self._output = output
self._outputs = outputs
self.commands: list[str] = []
@property
def id(self) -> str:
return "fake-sandbox"
def execute(self, command: str, *, timeout: int | None = None) -> ExecuteResponse:
del timeout
if self._raise:
raise RuntimeError("sandbox unreachable")
self.commands.append(command)
output = self._output
if self._outputs is not None:
output = self._outputs[len(self.commands) - 1]
return ExecuteResponse(output=output, exit_code=self._exit_code, truncated=False)
async def test_prepare_review_repo_clones_and_checks_out_head() -> None:
backend = _FakeSandboxBackend()
ok = await prepare_review_repo(
backend,
work_dir="/work",
repo_owner="acme",
repo_name="widget",
head_sha="abc123",
pr_number=42,
base_sha="def456",
)
assert ok is True
assert len(backend.commands) == 1
cmd = backend.commands[0]
assert "gh repo clone acme/widget" in cmd
assert "/work/widget/.git" in cmd
assert "git fetch origin def456" in cmd
assert "git fetch origin refs/pull/42/head" in cmd
assert "git checkout --force abc123 --quiet" in cmd
assert "git checkout --force abc123 --quiet 2>/dev/null || true" not in cmd
assert '[ "$(git rev-parse HEAD)" = abc123 ]' in cmd
assert "git fetch --all --quiet || true" in cmd
async def test_prepare_review_repo_skips_pull_ref_without_pr_number() -> None:
backend = _FakeSandboxBackend()
ok = await prepare_review_repo(
backend,
work_dir="/work",
repo_owner="acme",
repo_name="widget",
head_sha="abc123",
)
assert ok is True
assert "refs/pull" not in backend.commands[0]
async def test_prepare_review_repo_skips_checkout_without_head() -> None:
backend = _FakeSandboxBackend()
ok = await prepare_review_repo(
backend,
work_dir="/work",
repo_owner="acme",
repo_name="widget",
head_sha="",
)
assert ok is True
assert "git checkout" not in backend.commands[0]
async def test_prepare_review_repo_requires_owner_and_name() -> None:
backend = _FakeSandboxBackend()
ok = await prepare_review_repo(
backend, work_dir="/work", repo_owner="", repo_name="widget", head_sha="abc"
)
assert ok is False
assert backend.commands == []
async def test_prepare_review_repo_returns_false_on_nonzero_exit() -> None:
backend = _FakeSandboxBackend(exit_code=1)
ok = await prepare_review_repo(
backend, work_dir="/work", repo_owner="acme", repo_name="widget", head_sha="abc"
)
assert ok is False
async def test_prepare_review_repo_returns_false_on_exception() -> None:
backend = _FakeSandboxBackend(raise_exc=True)
ok = await prepare_review_repo(
backend, work_dir="/work", repo_owner="acme", repo_name="widget", head_sha="abc"
)
assert ok is False
async def test_materialize_trusted_skills_extracts_from_trusted_ref() -> None:
backend = _FakeSandboxBackend(outputs=["/work/.review-skills/.agents/skills\n", ""])
sources = await materialize_trusted_skills(
backend, repo_dir="/work/widget", trusted_ref="def456"
)
assert sources == ["/work/.review-skills/.agents/skills/"]
assert len(backend.commands) == 2
for cmd in backend.commands:
assert "git cat-file -e def456:" in cmd
assert "git archive def456" in cmd
async def test_materialize_trusted_skills_empty_without_ref() -> None:
backend = _FakeSandboxBackend()
sources = await materialize_trusted_skills(backend, repo_dir="/work/widget", trusted_ref="")
assert sources == []
assert backend.commands == []
async def test_materialize_trusted_skills_empty_when_none_exist() -> None:
backend = _FakeSandboxBackend(output="")
sources = await materialize_trusted_skills(
backend, repo_dir="/work/widget", trusted_ref="def456"
)
assert sources == []
async def test_materialize_trusted_skills_handles_exception() -> None:
backend = _FakeSandboxBackend(raise_exc=True)
sources = await materialize_trusted_skills(
backend, repo_dir="/work/widget", trusted_ref="def456"
)
assert sources == []