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]