Files
2026-07-13 13:22:34 +08:00

52 lines
1.9 KiB
Python

import base64
from collections.abc import Generator
from contextlib import contextmanager
from unittest.mock import patch
from mlflow.tracing.utils.otlp import MLFLOW_EXPERIMENT_ID_HEADER, build_otlp_headers
from mlflow.utils.credentials import MlflowCreds
@contextmanager
def mock_creds(username: str | None = None, password: str | None = None) -> Generator[None]:
with patch(
"mlflow.tracing.utils.otlp.read_mlflow_creds",
return_value=MlflowCreds(username=username, password=password),
) as m:
yield
m.assert_called_once()
def test_build_otlp_headers_no_credentials(monkeypatch):
monkeypatch.delenv("MLFLOW_TRACKING_TOKEN", raising=False)
with mock_creds():
headers = build_otlp_headers("42")
assert headers == {MLFLOW_EXPERIMENT_ID_HEADER: "42"}
assert "Authorization" not in headers
def test_build_otlp_headers_basic_auth(monkeypatch):
monkeypatch.delenv("MLFLOW_TRACKING_TOKEN", raising=False)
with mock_creds(username="admin", password="s3cret"):
headers = build_otlp_headers("7")
expected = base64.standard_b64encode(b"admin:s3cret").decode()
assert headers[MLFLOW_EXPERIMENT_ID_HEADER] == "7"
assert headers["Authorization"] == f"Basic {expected}"
def test_build_otlp_headers_bearer_token(monkeypatch):
monkeypatch.setenv("MLFLOW_TRACKING_TOKEN", "tok-abc")
with mock_creds():
headers = build_otlp_headers("1")
assert headers[MLFLOW_EXPERIMENT_ID_HEADER] == "1"
assert headers["Authorization"] == "Bearer tok-abc"
def test_build_otlp_headers_basic_auth_takes_precedence_over_token(monkeypatch):
monkeypatch.setenv("MLFLOW_TRACKING_TOKEN", "tok-xyz")
with mock_creds(username="admin", password="pass"):
headers = build_otlp_headers("5")
expected = base64.standard_b64encode(b"admin:pass").decode()
assert headers[MLFLOW_EXPERIMENT_ID_HEADER] == "5"
assert headers["Authorization"] == f"Basic {expected}"