Files
microsoft--agent-framework/python/tests/samples/hosting/test_toolbox_endpoint.py
T
wehub-resource-sync db620d33df
CodeQL / Analyze (csharp) (push) Waiting to run
CodeQL / Analyze (python) (push) Waiting to run
dotnet-build-and-test / dotnet-test-functions (push) Has been cancelled
dotnet-build-and-test / paths-filter (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Debug, windows-latest, net9.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, ubuntu-latest, net10.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, ubuntu-latest, net8.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, windows-latest, net472) (push) Has been cancelled
dotnet-build-and-test / dotnet-test (Release, integration, true, ubuntu-latest, net10.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-test (Release, integration, true, windows-latest, net472) (push) Has been cancelled
dotnet-build-and-test / dotnet-foundry-hosted-it (push) Has been cancelled
dotnet-build-and-test / dotnet-build-and-test-check (push) Has been cancelled
dotnet-build-and-test / Integration Test Report (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:39:25 +08:00

100 lines
4.1 KiB
Python

# Copyright (c) Microsoft. All rights reserved.
"""Unit tests for resolve_toolbox_endpoint() in the foundry-hosted-agents response samples.
Covers both 04_foundry_toolbox/main.py and 06_files/main.py which share the same
implementation of resolve_toolbox_endpoint().
"""
import importlib.util
import sys
from pathlib import Path
from unittest.mock import MagicMock
import pytest
# ---------------------------------------------------------------------------
# Stub out packages unavailable in the unit-test environment so that importing
# the sample modules does not fail.
# ---------------------------------------------------------------------------
_MISSING_MODULES = (
"agent_framework_foundry_hosting",
"azure.ai.agentserver",
"azure.ai.agentserver.responses",
)
for _mod_name in _MISSING_MODULES:
sys.modules.setdefault(_mod_name, MagicMock())
# ---------------------------------------------------------------------------
# Load the two sample modules by file path to avoid needing them on sys.path.
# ---------------------------------------------------------------------------
_RESPONSES_DIR = (
Path(__file__).parent.parent.parent.parent / "samples" / "04-hosting" / "foundry-hosted-agents" / "responses"
)
def _load_sample(subdir: str, module_alias: str):
spec = importlib.util.spec_from_file_location(module_alias, _RESPONSES_DIR / subdir / "main.py")
assert spec is not None
mod = importlib.util.module_from_spec(spec)
assert spec.loader is not None
spec.loader.exec_module(mod)
return mod
_toolbox_mod = _load_sample("04_foundry_toolbox", "foundry_toolbox_main")
_files_mod = _load_sample("06_files", "files_main")
# ---------------------------------------------------------------------------
# Parameterise over both modules so the same test cases run for each.
# ---------------------------------------------------------------------------
@pytest.fixture(params=["04_foundry_toolbox", "06_files"])
def resolve_endpoint(request):
"""Return resolve_toolbox_endpoint from the requested sample module."""
mod = _toolbox_mod if request.param == "04_foundry_toolbox" else _files_mod
return mod.resolve_toolbox_endpoint
class TestResolveToolboxEndpoint:
def test_explicit_endpoint_returned_as_is(self, resolve_endpoint, monkeypatch: pytest.MonkeyPatch):
monkeypatch.setenv("TOOLBOX_ENDPOINT", "https://example.com/mcp")
monkeypatch.delenv("FOUNDRY_PROJECT_ENDPOINT", raising=False)
monkeypatch.delenv("TOOLBOX_NAME", raising=False)
assert resolve_endpoint() == "https://example.com/mcp"
def test_empty_string_raises_value_error(self, resolve_endpoint, monkeypatch: pytest.MonkeyPatch):
monkeypatch.setenv("TOOLBOX_ENDPOINT", "")
with pytest.raises(ValueError, match="TOOLBOX_ENDPOINT is set but empty"):
resolve_endpoint()
def test_fallback_constructs_url_from_project_vars(self, resolve_endpoint, monkeypatch: pytest.MonkeyPatch):
monkeypatch.delenv("TOOLBOX_ENDPOINT", raising=False)
monkeypatch.setenv("FOUNDRY_PROJECT_ENDPOINT", "https://project.azure.com/")
monkeypatch.setenv("TOOLBOX_NAME", "my-toolbox")
result = resolve_endpoint()
assert result == "https://project.azure.com/toolboxes/my-toolbox/mcp?api-version=v1"
def test_fallback_strips_trailing_slash_from_project_endpoint(
self, resolve_endpoint, monkeypatch: pytest.MonkeyPatch
):
monkeypatch.delenv("TOOLBOX_ENDPOINT", raising=False)
monkeypatch.setenv("FOUNDRY_PROJECT_ENDPOINT", "https://project.azure.com///")
monkeypatch.setenv("TOOLBOX_NAME", "my-toolbox")
result = resolve_endpoint()
assert result == "https://project.azure.com/toolboxes/my-toolbox/mcp?api-version=v1"
def test_neither_variable_group_set_raises_value_error(self, resolve_endpoint, monkeypatch: pytest.MonkeyPatch):
monkeypatch.delenv("TOOLBOX_ENDPOINT", raising=False)
monkeypatch.delenv("FOUNDRY_PROJECT_ENDPOINT", raising=False)
monkeypatch.delenv("TOOLBOX_NAME", raising=False)
with pytest.raises(ValueError, match="Either set TOOLBOX_ENDPOINT"):
resolve_endpoint()