60e0ffc959
Upgrade checks / Notify on failure (push) Has been cancelled
Upgrade checks / Close issue on success (push) Has been cancelled
Schema Crash Test / Real-world schema crash test (232K schemas) (push) Has been cancelled
Run static analysis / static_analysis (push) Has been cancelled
Tests / Tests: Python 3.10 on ubuntu-latest (push) Has been cancelled
Tests / Tests: Python 3.13 on ubuntu-latest (push) Has been cancelled
Tests / Tests: Python 3.10 on windows-latest (push) Has been cancelled
Tests / Tests with lowest-direct dependencies (push) Has been cancelled
Tests / MCP conformance tests (push) Has been cancelled
Tests / Integration tests (push) Has been cancelled
Tests / Package install smoke (push) Has been cancelled
Upgrade checks / Static analysis (push) Has been cancelled
Upgrade checks / Tests: Python 3.10 on ubuntu-latest (push) Has been cancelled
Upgrade checks / Tests: Python 3.13 on ubuntu-latest (push) Has been cancelled
Upgrade checks / Tests: Python 3.10 on windows-latest (push) Has been cancelled
Upgrade checks / Integration tests (push) Has been cancelled
Update MCPServerConfig Schema / update-config-schema (push) Has been cancelled
Update SDK Documentation / update-sdk-docs (push) Has been cancelled
100 lines
3.7 KiB
Python
100 lines
3.7 KiB
Python
"""Unit tests for Auth0 OAuth provider."""
|
|
|
|
from unittest.mock import patch
|
|
|
|
import pytest
|
|
|
|
from fastmcp.server.auth.oidc_proxy import OIDCConfiguration
|
|
from fastmcp.server.auth.providers.auth0 import Auth0Provider
|
|
from fastmcp.server.auth.providers.jwt import JWTVerifier
|
|
|
|
TEST_CONFIG_URL = "https://example.com/.well-known/openid-configuration"
|
|
TEST_CLIENT_ID = "test-client-id"
|
|
TEST_CLIENT_SECRET = "test-client-secret"
|
|
TEST_AUDIENCE = "test-audience"
|
|
TEST_BASE_URL = "https://example.com:8000/"
|
|
TEST_REDIRECT_PATH = "/test/callback"
|
|
TEST_REQUIRED_SCOPES = ["openid", "email"]
|
|
|
|
|
|
@pytest.fixture
|
|
def valid_oidc_configuration_dict():
|
|
"""Create a valid OIDC configuration dict for testing."""
|
|
return {
|
|
"issuer": "https://example.com",
|
|
"authorization_endpoint": "https://example.com/authorize",
|
|
"token_endpoint": "https://example.com/oauth/token",
|
|
"jwks_uri": "https://example.com/.well-known/jwks.json",
|
|
"response_types_supported": ["code"],
|
|
"subject_types_supported": ["public"],
|
|
"id_token_signing_alg_values_supported": ["RS256"],
|
|
}
|
|
|
|
|
|
class TestAuth0Provider:
|
|
"""Test Auth0Provider initialization."""
|
|
|
|
def test_init_with_explicit_params(self, valid_oidc_configuration_dict):
|
|
"""Test initialization with explicit parameters."""
|
|
with patch(
|
|
"fastmcp.server.auth.oidc_proxy.OIDCConfiguration.get_oidc_configuration"
|
|
) as mock_get:
|
|
oidc_config = OIDCConfiguration.model_validate(
|
|
valid_oidc_configuration_dict
|
|
)
|
|
mock_get.return_value = oidc_config
|
|
|
|
provider = Auth0Provider(
|
|
config_url=TEST_CONFIG_URL,
|
|
client_id=TEST_CLIENT_ID,
|
|
client_secret=TEST_CLIENT_SECRET,
|
|
audience=TEST_AUDIENCE,
|
|
base_url=TEST_BASE_URL,
|
|
redirect_path=TEST_REDIRECT_PATH,
|
|
required_scopes=TEST_REQUIRED_SCOPES,
|
|
jwt_signing_key="test-secret",
|
|
)
|
|
|
|
mock_get.assert_called_once()
|
|
|
|
call_args = mock_get.call_args
|
|
assert str(call_args[0][0]) == TEST_CONFIG_URL
|
|
|
|
assert provider._upstream_client_id == TEST_CLIENT_ID
|
|
assert provider._upstream_client_secret is not None
|
|
assert (
|
|
provider._upstream_client_secret.get_secret_value()
|
|
== TEST_CLIENT_SECRET
|
|
)
|
|
|
|
assert isinstance(provider._token_validator, JWTVerifier)
|
|
assert provider._token_validator.audience == TEST_AUDIENCE
|
|
|
|
assert str(provider.base_url) == TEST_BASE_URL
|
|
assert provider._redirect_path == TEST_REDIRECT_PATH
|
|
assert provider._token_validator.required_scopes == TEST_REQUIRED_SCOPES
|
|
|
|
def test_init_defaults(self, valid_oidc_configuration_dict):
|
|
"""Test that default values are applied correctly."""
|
|
with patch(
|
|
"fastmcp.server.auth.oidc_proxy.OIDCConfiguration.get_oidc_configuration"
|
|
) as mock_get:
|
|
oidc_config = OIDCConfiguration.model_validate(
|
|
valid_oidc_configuration_dict
|
|
)
|
|
mock_get.return_value = oidc_config
|
|
|
|
provider = Auth0Provider(
|
|
config_url=TEST_CONFIG_URL,
|
|
client_id=TEST_CLIENT_ID,
|
|
client_secret=TEST_CLIENT_SECRET,
|
|
audience=TEST_AUDIENCE,
|
|
base_url=TEST_BASE_URL,
|
|
jwt_signing_key="test-secret",
|
|
)
|
|
|
|
# Check defaults
|
|
assert str(provider.base_url) == TEST_BASE_URL
|
|
assert provider._redirect_path == "/auth/callback"
|
|
assert provider._token_validator.required_scopes == ["openid"]
|