diff --git a/.claude/repo-routine-state.json b/.claude/repo-routine-state.json new file mode 100644 index 0000000..dd392f2 --- /dev/null +++ b/.claude/repo-routine-state.json @@ -0,0 +1,4 @@ +{ + "rotation": {"dead-code": {"last_slice": null}, "missing-tests": {"last_slice": "src/supervaizer/admin/workbench_routes.py"}}, + "dedup_backlog": [] +} diff --git a/tests/test_workbench_routes.py b/tests/test_workbench_routes.py index 4d9d284..8d45eba 100644 --- a/tests/test_workbench_routes.py +++ b/tests/test_workbench_routes.py @@ -30,6 +30,7 @@ EntityStatus, Job, JobContext, + JobResponse, Parameter, ParametersSetup, ) @@ -206,6 +207,46 @@ def test_answer_hitl_returns_404_for_missing_case( assert "missing-case" in response.json()["detail"] +class TestWorkbenchStartJob: + """Test workbench job startup and parameter merging.""" + + def setup_method(self) -> None: + Jobs().reset() + + def teardown_method(self) -> None: + Jobs().reset() + + def test_start_job_uses_environment_parameter_fallback( + self, + test_client_with_agent: tuple[TestClient, str], + monkeypatch: pytest.MonkeyPatch, + mocker: MockerFixture, + ) -> None: + client, agent_slug = test_client_with_agent + monkeypatch.setenv("API_KEY", "from-env") + execute = mocker.patch.object( + Agent, + "_execute", + return_value=JobResponse( + job_id="workbench-job", + status=EntityStatus.COMPLETED, + message="done", + ), + ) + + response = client.post( + f"/manage/agents/{agent_slug}/workbench/start", + json={"parameters": {}, "fields": {"how_many": 3}}, + ) + + assert response.status_code == 200 + assert response.json()["status"] == "STARTING" + execute.assert_called_once() + params = execute.call_args.args[1] + assert params["fields"] == {"how_many": 3} + assert params["agent_parameters"] == [{"name": "API_KEY", "value": "from-env"}] + + class TestWorkbenchExecuteStep: """Test scheduled-step execute-now ownership checks."""