Files
2026-07-13 13:08:41 +08:00

129 lines
4.3 KiB
Python

import asyncio
from types import SimpleNamespace
import httpx
import mcp_server
def test_is_mcp_server_enabled_in_server_deployments(monkeypatch):
monkeypatch.setattr(mcp_server, "is_presenton_electron_desktop", lambda: False)
assert mcp_server.is_mcp_server_enabled() is True
def test_is_mcp_server_disabled_in_electron_desktop(monkeypatch):
monkeypatch.setattr(mcp_server, "is_presenton_electron_desktop", lambda: True)
assert mcp_server.is_mcp_server_enabled() is False
def test_create_mcp_auth_provider_disabled_when_auth_is_disabled(monkeypatch):
monkeypatch.setattr(mcp_server, "is_disable_auth_enabled", lambda: True)
monkeypatch.setattr(mcp_server, "is_auth_configured", lambda: True)
assert mcp_server.create_mcp_auth_provider() is None
def test_create_mcp_auth_provider_disabled_when_auth_not_configured(monkeypatch):
monkeypatch.setattr(mcp_server, "is_disable_auth_enabled", lambda: False)
monkeypatch.setattr(mcp_server, "is_auth_configured", lambda: False)
assert mcp_server.create_mcp_auth_provider() is None
def test_create_mcp_auth_provider_enabled_when_auth_configured(monkeypatch):
monkeypatch.setattr(mcp_server, "is_disable_auth_enabled", lambda: False)
monkeypatch.setattr(mcp_server, "is_auth_configured", lambda: True)
provider = mcp_server.create_mcp_auth_provider()
assert isinstance(provider, mcp_server.PresentonTokenVerifier)
def test_presenton_token_verifier_accepts_valid_token(monkeypatch):
monkeypatch.setattr(
mcp_server,
"validate_session_token",
lambda token: "admin" if token == "valid-token" else None,
)
verifier = mcp_server.PresentonTokenVerifier()
access_token = asyncio.run(verifier.verify_token("valid-token"))
assert access_token is not None
assert access_token.token == "valid-token"
assert access_token.client_id == "admin"
assert access_token.claims["u"] == "admin"
def test_presenton_token_verifier_rejects_invalid_token(monkeypatch):
monkeypatch.setattr(mcp_server, "validate_session_token", lambda _token: None)
verifier = mcp_server.PresentonTokenVerifier()
access_token = asyncio.run(verifier.verify_token("invalid-token"))
assert access_token is None
def test_attach_request_auth_header_uses_authenticated_mcp_token(monkeypatch):
monkeypatch.setattr(
mcp_server,
"get_access_token",
lambda: SimpleNamespace(token="session-abc"),
)
request = httpx.Request("POST", "http://127.0.0.1:8000/api/v1/example")
asyncio.run(mcp_server.attach_request_auth_header(request))
assert request.headers["Authorization"] == "Bearer session-abc"
def test_attach_request_auth_header_keeps_existing_auth_header(monkeypatch):
monkeypatch.setattr(
mcp_server,
"get_access_token",
lambda: SimpleNamespace(token="session-abc"),
)
request = httpx.Request(
"POST",
"http://127.0.0.1:8000/api/v1/example",
headers={"Authorization": "Bearer existing"},
)
asyncio.run(mcp_server.attach_request_auth_header(request))
assert request.headers["Authorization"] == "Bearer existing"
def test_attach_request_auth_header_skips_when_no_mcp_access_token(monkeypatch):
monkeypatch.setattr(mcp_server, "get_access_token", lambda: None)
monkeypatch.setattr(mcp_server, "get_http_headers", lambda include=None: {})
request = httpx.Request("POST", "http://127.0.0.1:8000/api/v1/example")
asyncio.run(mcp_server.attach_request_auth_header(request))
assert "Authorization" not in request.headers
def test_attach_request_auth_header_forwards_incoming_authorization_header(monkeypatch):
monkeypatch.setattr(mcp_server, "get_access_token", lambda: None)
monkeypatch.setattr(
mcp_server,
"get_http_headers",
lambda include=None: {"authorization": "Basic YWRtaW46c2VjcmV0MTIz"},
)
request = httpx.Request("POST", "http://127.0.0.1:8000/api/v1/example")
asyncio.run(mcp_server.attach_request_auth_header(request))
assert request.headers["Authorization"].startswith("Basic ")
def test_get_mcp_api_timeout_supports_long_running_requests():
timeout = mcp_server.get_mcp_api_timeout()
assert timeout.read >= 300
assert timeout.write >= 300
assert timeout.pool >= 300
assert timeout.connect == mcp_server.MCP_API_CONNECT_TIMEOUT_SECONDS