Files
2026-08-29 13:17:59 +02:00

81 lines
2.9 KiB
Python

"""Ścieżka agentowa (LlmBrain) przepuszczona przez atrapę serwera OpenAI.
Tryb offline sprawdza reguły; ten test sprawdza to, czego reguły nie dotykają:
budowę agentów z definicji APM, wywoływanie sandboxowanych narzędzi przez model
i parsowanie strukturalnych wyjść. Bez GPU, bez sieci, tak samo na Linuksie i macOS.
"""
from __future__ import annotations
import threading
import pytest
from mock_server import serve
from agentic_codemod.schemas import ChangeRequest, TaskType
from agentic_codemod.workflow.runner import run_pipeline
@pytest.fixture()
def mock_llm():
httpd = serve(host="127.0.0.1", port=0)
thread = threading.Thread(target=httpd.serve_forever, daemon=True)
thread.start()
host, port = httpd.server_address[:2]
try:
yield f"http://{host}:{port}/v1"
finally:
httpd.shutdown()
thread.join(timeout=5)
@pytest.fixture()
def llm_settings(settings, mock_llm):
settings.provider = "openai_like"
settings.base_url = mock_llm
settings.api_key = "mock"
for role in ("planner", "coder", "reviewer", "scribe"):
setattr(settings.models, role, "mock/agentic-codemod")
return settings
@pytest.fixture()
def request_upgrade(acme_app):
return ChangeRequest(
task_type=TaskType.SDK_UPGRADE,
repo_path=str(acme_app),
package="acme-sdk",
module_name="acme",
from_version="1.4.2",
to_version="2.1.0",
)
def test_przebieg_z_agentami_konczy_sie_zielona_weryfikacja(request_upgrade, llm_settings, acme_app):
manifest = run_pipeline(request_upgrade, settings=llm_settings, mode="llm", in_place=True)
assert manifest.status == "success", manifest.errors
assert manifest.mode == "llm"
assert manifest.verifications and manifest.verifications[-1].passed
assert set(manifest.changed_files) == {"pyproject.toml", "src/acme_app/notifier.py"}
migrated = (acme_app / "src/acme_app/notifier.py").read_text(encoding="utf-8")
assert "AcmeClient(api_key=api_key, base_url=endpoint)" in migrated
assert "client.send(" not in migrated
def test_strukturalne_wyjscia_agentow_sa_parsowane(request_upgrade, llm_settings):
manifest = run_pipeline(request_upgrade, settings=llm_settings, mode="llm", in_place=True)
assert manifest.profile and manifest.profile.module_name == "acme"
assert manifest.plan and manifest.plan.actionable_edits[0].path == "src/acme_app/notifier.py"
assert manifest.review and manifest.review.verdict == "approve"
assert manifest.merge_request and manifest.merge_request.title.startswith("build(deps):")
def test_agent_uzywa_sandboxowanych_narzedzi(request_upgrade, llm_settings):
manifest = run_pipeline(request_upgrade, settings=llm_settings, mode="llm", in_place=True)
used = {entry["tool"] for entry in manifest.tool_calls}
assert {"read_file", "replace_in_file", "run_verification"} <= used