5a558eb09e
TypeScript SDK Compatibility V1.x E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / TypeScript SDK Compatibility V1.x E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
TypeScript SDK E2E Tests / TypeScript SDK E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
Python SDK E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK E2E Tests / Python SDK E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK E2E Tests / build-opik (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Python SDK Compatibility V1.x E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK E2E Tests / build-opik (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer E2E Tests Python ${{matrix.python_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer Integration Smoke Tests (push) Has been cancelled
🐙 Code Quality / detect (push) Has been cancelled
🐙 Code Quality / lint (${{ matrix.leg.name }}) (push) Has been cancelled
🐙 Code Quality / summary (push) Has been cancelled
TypeScript SDK Library Integration Tests / Check Secrets (push) Has been cancelled
TypeScript SDK Library Integration Tests / opik-vercel (Vercel AI SDK / eve) (push) Has been cancelled
SDK Library Integration Tests Runner / Check Secrets (push) Has been cancelled
SDK Library Integration Tests Runner / Missed OpenAI API Key Warning (push) Has been cancelled
SDK Library Integration Tests Runner / Build (push) Has been cancelled
SDK Library Integration Tests Runner / openai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_legacy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / llama_index_tests (push) Has been cancelled
SDK Library Integration Tests Runner / anthropic_tests (push) Has been cancelled
SDK Library Integration Tests Runner / mistral_tests (push) Has been cancelled
SDK Library Integration Tests Runner / groq_tests (push) Has been cancelled
SDK Library Integration Tests Runner / aisuite_tests (push) Has been cancelled
SDK Library Integration Tests Runner / haystack_tests (push) Has been cancelled
SDK Library Integration Tests Runner / dspy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v1_tests (push) Has been cancelled
SDK Library Integration Tests Runner / genai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_legacy_1_3_0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / evaluation_metrics_tests (push) Has been cancelled
SDK Library Integration Tests Runner / bedrock_tests (push) Has been cancelled
SDK Library Integration Tests Runner / litellm_tests (push) Has been cancelled
SDK Library Integration Tests Runner / harbor_tests (push) Has been cancelled
SDK Library Integration Tests Runner / Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / render-equality (push) Has been cancelled
Opik Optimizer - Unit Tests / Opik Optimizer Unit Tests Python ${{matrix.python_version}} (push) Has been cancelled
Python BE E2E Tests / Python BE E2E (push) Has been cancelled
Python Backend Tests / run-python-backend-tests (push) Has been cancelled
Python SDK Unit Tests / Python SDK Unit Tests ${{matrix.python_version}} (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
SDK E2E Libraries Integration Tests / Check Secrets (push) Has been cancelled
SDK E2E Libraries Integration Tests / Missed OpenAI API Key Warning (push) Has been cancelled
SDK E2E Libraries Integration Tests / build-opik (push) Has been cancelled
SDK E2E Libraries Integration Tests / E2E Lib Integration Python ${{matrix.python_version}} (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-gemini) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-langchain) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-openai) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-otel) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-vercel) (push) Has been cancelled
TypeScript SDK Build & Publish / build-and-publish (push) Has been cancelled
TypeScript SDK Unit Tests / Test on Node ${{ matrix.node-version }} (push) Has been cancelled
Backend Tests / discover-tests (push) Has been cancelled
Backend Tests / ${{ matrix.name }} (push) Has been cancelled
Build and Publish SDK / build-and-publish (push) Has been cancelled
Build Opik Docker Images / set-version (push) Has been cancelled
Build Opik Docker Images / build-backend (push) Has been cancelled
Build Opik Docker Images / build-sandbox-executor-python (push) Has been cancelled
Build Opik Docker Images / build-python-backend (push) Has been cancelled
Build Opik Docker Images / build-frontend (push) Has been cancelled
Build Opik Docker Images / create-git-tag (push) Has been cancelled
ClickHouse Migration Cluster Check / validate-clickhouse-migrations (push) Has been cancelled
Docs - Publish / run (push) Has been cancelled
E2E Tests - Post Merge (v2) / 🧪 E2E v2 Tests (${{ github.event.inputs.tier || 't1' }}) (push) Has been cancelled
E2E Tests - Post Merge (v2) / 📢 Slack Notification (push) Has been cancelled
Frontend Unit Tests / Test on Node 20 (push) Has been cancelled
Guardrails E2E Tests / Select Python version matrix (push) Has been cancelled
Guardrails E2E Tests / Guardrails E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Guardrails E2E Tests / 📢 Slack Notification (push) Has been cancelled
Guardrails Backend Unit Tests / Guardrails Backend Unit Tests (push) Has been cancelled
Guardrails Backend Unit Tests / 📢 Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v3.21.0) (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v4.2.0) (push) Has been cancelled
Lint Opik Helm Chart / unittest-helm-chart (push) Has been cancelled
138 lines
3.9 KiB
Python
138 lines
3.9 KiB
Python
import httpx
|
|
|
|
from opik.configurator.mcp import detection
|
|
|
|
BASE_URL = "https://dev.comet.com/"
|
|
API_URL = "https://dev.comet.com/opik/api/"
|
|
WELL_KNOWN_URL = "https://dev.comet.com/.well-known/oauth-authorization-server/opik"
|
|
MCP_URL = "https://dev.comet.com/opik/api/v1/mcp"
|
|
|
|
_VALID_METADATA = {
|
|
"issuer": "https://dev.comet.com/opik",
|
|
"authorization_endpoint": "https://dev.comet.com/opik/oauth/authorize",
|
|
"token_endpoint": "https://dev.comet.com/opik/oauth/token",
|
|
}
|
|
|
|
|
|
class _Response:
|
|
def __init__(self, status_code, json_data=None, json_error=False):
|
|
self.status_code = status_code
|
|
self._json_data = json_data
|
|
self._json_error = json_error
|
|
|
|
def json(self):
|
|
if self._json_error:
|
|
raise ValueError("Expecting value")
|
|
return self._json_data
|
|
|
|
|
|
def _patch_client(monkeypatch, *, response=None, error=None):
|
|
"""Wire ``httpx_client.get`` to a fake client, capturing the probe URL and the
|
|
client kwargs (so tests can assert the TLS flag is forwarded)."""
|
|
captured = {}
|
|
|
|
class _Client:
|
|
def __enter__(self):
|
|
return self
|
|
|
|
def __exit__(self, *exc):
|
|
return False
|
|
|
|
def get(self, url, timeout=None):
|
|
captured["url"] = url
|
|
captured["timeout"] = timeout
|
|
if error is not None:
|
|
raise error
|
|
return response
|
|
|
|
def fake_get(**kwargs):
|
|
captured["client_kwargs"] = kwargs
|
|
return _Client()
|
|
|
|
monkeypatch.setattr(detection.httpx_client, "get", fake_get)
|
|
return captured
|
|
|
|
|
|
def test_detect__valid_oauth_metadata__returns_mcp_url(monkeypatch):
|
|
captured = _patch_client(
|
|
monkeypatch, response=_Response(200, json_data=_VALID_METADATA)
|
|
)
|
|
|
|
result = detection.detect_hosted_mcp_server(
|
|
base_url=BASE_URL, api_url=API_URL, check_tls_certificate=True
|
|
)
|
|
|
|
assert result == MCP_URL
|
|
assert captured["url"] == WELL_KNOWN_URL
|
|
|
|
|
|
def test_detect__forwards_tls_flag_without_rereading_config(monkeypatch):
|
|
captured = _patch_client(
|
|
monkeypatch, response=_Response(200, json_data=_VALID_METADATA)
|
|
)
|
|
|
|
detection.detect_hosted_mcp_server(
|
|
base_url=BASE_URL, api_url=API_URL, check_tls_certificate=False
|
|
)
|
|
|
|
assert captured["client_kwargs"]["check_tls_certificate"] is False
|
|
|
|
|
|
def test_detect__html_catch_all_200__returns_none(monkeypatch):
|
|
# The frontend SPA answers any unknown path with HTML and a 200 status.
|
|
_patch_client(monkeypatch, response=_Response(200, json_error=True))
|
|
|
|
result = detection.detect_hosted_mcp_server(
|
|
base_url=BASE_URL, api_url=API_URL, check_tls_certificate=True
|
|
)
|
|
|
|
assert result is None
|
|
|
|
|
|
def test_detect__not_found__returns_none(monkeypatch):
|
|
_patch_client(
|
|
monkeypatch, response=_Response(404, json_data={"error": "not_found"})
|
|
)
|
|
|
|
assert (
|
|
detection.detect_hosted_mcp_server(
|
|
base_url=BASE_URL, api_url=API_URL, check_tls_certificate=True
|
|
)
|
|
is None
|
|
)
|
|
|
|
|
|
def test_detect__json_without_authorization_endpoint__returns_none(monkeypatch):
|
|
_patch_client(
|
|
monkeypatch, response=_Response(200, json_data={"unrelated": "value"})
|
|
)
|
|
|
|
assert (
|
|
detection.detect_hosted_mcp_server(
|
|
base_url=BASE_URL, api_url=API_URL, check_tls_certificate=True
|
|
)
|
|
is None
|
|
)
|
|
|
|
|
|
def test_detect__non_dict_json__returns_none(monkeypatch):
|
|
_patch_client(monkeypatch, response=_Response(200, json_data=["not", "a", "dict"]))
|
|
|
|
assert (
|
|
detection.detect_hosted_mcp_server(
|
|
base_url=BASE_URL, api_url=API_URL, check_tls_certificate=True
|
|
)
|
|
is None
|
|
)
|
|
|
|
|
|
def test_detect__network_error__returns_none(monkeypatch):
|
|
_patch_client(monkeypatch, error=httpx.ConnectError("unreachable"))
|
|
|
|
assert (
|
|
detection.detect_hosted_mcp_server(
|
|
base_url=BASE_URL, api_url=API_URL, check_tls_certificate=True
|
|
)
|
|
is None
|
|
)
|