From 7fb097f20fbea35e382a1b78da6fd90609c55a9e Mon Sep 17 00:00:00 2001 From: Eric Gustin <34000337+EricGustin@users.noreply.github.com> Date: Mon, 24 Nov 2025 17:22:17 -0800 Subject: [PATCH] Use monkeypatch for tests that use ARCADE_WORKER_SECRET (#694) Reverts the updates to unit tests in https://github.com/ArcadeAI/arcade-mcp/pull/691 and replaces with monkeypatch. They inadvertently changed global process state during the test run causing failure of post-merge and failure of PyPI publish. See https://github.com/ArcadeAI/arcade-mcp/actions/runs/19651637906/job/56283833231 to see what failed --- libs/arcade-mcp-server/pyproject.toml | 2 +- libs/tests/worker/test_worker_base.py | 35 +++++------------------- libs/tests/worker/test_worker_fastapi.py | 6 ++-- pyproject.toml | 2 +- 4 files changed, 12 insertions(+), 33 deletions(-) diff --git a/libs/arcade-mcp-server/pyproject.toml b/libs/arcade-mcp-server/pyproject.toml index 23851845..5d22e093 100644 --- a/libs/arcade-mcp-server/pyproject.toml +++ b/libs/arcade-mcp-server/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "arcade-mcp-server" -version = "1.9.0" +version = "1.9.1" description = "Model Context Protocol (MCP) server framework for Arcade.dev" readme = "README.md" authors = [{ name = "Arcade.dev" }] diff --git a/libs/tests/worker/test_worker_base.py b/libs/tests/worker/test_worker_base.py index 537d85fc..19ba74ff 100644 --- a/libs/tests/worker/test_worker_base.py +++ b/libs/tests/worker/test_worker_base.py @@ -43,18 +43,11 @@ def mock_router(): @pytest.fixture -def base_worker(mock_router): - # Save original value - original_secret = os.environ.get("ARCADE_WORKER_SECRET") +def base_worker(mock_router, monkeypatch): # Set env var temporarily for testing secret loading - os.environ["ARCADE_WORKER_SECRET"] = "test_secret_env" # noqa: S105 + monkeypatch.setenv("ARCADE_WORKER_SECRET", "test_secret_env") worker = BaseWorker() worker.register_routes(mock_router) # Register routes using the mock router - # Restore original value - if original_secret is not None: - os.environ["ARCADE_WORKER_SECRET"] = original_secret - else: - del os.environ["ARCADE_WORKER_SECRET"] return worker @@ -72,33 +65,19 @@ def test_base_worker_init_with_secret(): assert not worker.disable_auth -def test_base_worker_init_with_env_secret(): - original_secret = os.environ.get("ARCADE_WORKER_SECRET") - os.environ["ARCADE_WORKER_SECRET"] = "env_secret_value" # noqa: S105 +def test_base_worker_init_with_env_secret(monkeypatch): + monkeypatch.setenv("ARCADE_WORKER_SECRET", "env_secret_value") worker = BaseWorker() assert worker.secret == "env_secret_value" # noqa: S105 assert not worker.disable_auth - # Restore secret to original if it was set - if original_secret is not None: - os.environ["ARCADE_WORKER_SECRET"] = original_secret - else: - del os.environ["ARCADE_WORKER_SECRET"] - - -def test_base_worker_init_no_secret_raises_error(): - # Ensure secret is not set - original_secret = os.environ.get("ARCADE_WORKER_SECRET") - if "ARCADE_WORKER_SECRET" in os.environ: - del os.environ["ARCADE_WORKER_SECRET"] +def test_base_worker_init_no_secret_raises_error(monkeypatch): + # Ensure env var is not set + monkeypatch.delenv("ARCADE_WORKER_SECRET", raising=False) with pytest.raises(ValueError, match="No secret provided for worker"): BaseWorker() - # Restore secret if it was set - if original_secret is not None: - os.environ["ARCADE_WORKER_SECRET"] = original_secret - def test_base_worker_init_disable_auth(): worker = BaseWorker(disable_auth=True) diff --git a/libs/tests/worker/test_worker_fastapi.py b/libs/tests/worker/test_worker_fastapi.py index 399a25b3..f4b5cbf8 100644 --- a/libs/tests/worker/test_worker_fastapi.py +++ b/libs/tests/worker/test_worker_fastapi.py @@ -100,8 +100,8 @@ def test_health_check_route_no_auth(client_no_auth): # Catalog def test_get_catalog_route_no_auth_header(client): response = client.get("/worker/tools") - assert response.status_code == 403 - assert "Not authenticated" in response.text + assert response.status_code in [403, 401] + assert "Not authenticated" in response.text or "Unauthorized" in response.text def test_get_catalog_route_invalid_auth_header(client, worker_secret): @@ -131,7 +131,7 @@ def call_tool_payload(): def test_call_tool_route_no_auth_header(client, call_tool_payload): response = client.post("/worker/tools/invoke", json=call_tool_payload) - assert response.status_code == 403 + assert response.status_code in [403, 401] def test_call_tool_route_invalid_auth_header(client, worker_secret, call_tool_payload): diff --git a/pyproject.toml b/pyproject.toml index 405ea72d..dde893f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "arcade-mcp" -version = "1.5.4" +version = "1.5.6" description = "Arcade.dev - Tool Calling platform for Agents" readme = "README.md" license = {file = "LICENSE"}