| from vpa_env.environment import VpaEnvironment |
| from vpa_env.models import VpaAction |
|
|
|
|
| def test_reset_selects_requested_task() -> None: |
| env = VpaEnvironment() |
| observation = env.reset(task_id="easy-secret-rotation") |
| assert observation.task_id == "easy-secret-rotation" |
| assert observation.score == 0.2 |
|
|
|
|
| def test_easy_task_reaches_full_score() -> None: |
| env = VpaEnvironment() |
| env.reset(task_id="easy-secret-rotation") |
| result = env.step( |
| VpaAction( |
| file_updates={ |
| "app.py": ( |
| "import os\n\n" |
| "def get_api_key() -> str:\n" |
| ' return os.getenv("PAYMENT_API_KEY", "")\n' |
| ) |
| }, |
| submit=True, |
| ) |
| ) |
| assert result.done is True |
| assert result.reward == 0.8 |
| assert result.score == 1.0 |
|
|
|
|
| def test_hard_task_blocks_partial_fix_without_root_guard() -> None: |
| env = VpaEnvironment() |
| env.reset(task_id="hard-path-traversal") |
| result = env.step( |
| VpaAction( |
| file_updates={ |
| "app.py": ( |
| "from pathlib import Path\n\n" |
| 'TEMPLATE_ROOT = Path("templates")\n\n' |
| "def read_template(name: str) -> str:\n" |
| ' if ".." in name:\n' |
| ' raise ValueError("unsafe path")\n' |
| " target = TEMPLATE_ROOT / name\n" |
| " return target.read_text()\n" |
| ) |
| } |
| ) |
| ) |
| assert result.done is False |
| assert result.score == 0.5 |
| assert "resolve paths" in result.remaining_findings[0] |
|
|