Skip to content

Commit c253e3d

Browse files
fix: address review feedback for telemetry PR
1 parent 1d8d146 commit c253e3d

5 files changed

Lines changed: 27 additions & 9 deletions

File tree

src/auth0_server_python/auth_server/mfa_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def __init__(
7575

7676
def _get_http_client(self, **kwargs) -> httpx.AsyncClient:
7777
"""Return an httpx.AsyncClient with default headers injected."""
78-
headers = {**self._headers, **kwargs.pop("headers", {})}
78+
headers = {**kwargs.pop("headers", {}), **self._headers}
7979
return httpx.AsyncClient(headers=headers, **kwargs)
8080

8181
async def _resolve_base_url(

src/auth0_server_python/auth_server/my_account_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def __init__(self, domain: str, headers: Optional[dict[str, str]] = None):
3838

3939
def _get_http_client(self, **kwargs) -> httpx.AsyncClient:
4040
"""Return an httpx.AsyncClient with default headers injected."""
41-
headers = {**self._headers, **kwargs.pop("headers", {})}
41+
headers = {**kwargs.pop("headers", {}), **self._headers}
4242
return httpx.AsyncClient(headers=headers, **kwargs)
4343

4444
@property

src/auth0_server_python/auth_server/server_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ def __init__(
186186

187187
def _get_http_client(self, **kwargs) -> httpx.AsyncClient:
188188
"""Return an httpx.AsyncClient with telemetry headers injected."""
189-
headers = {**self._telemetry_headers, **kwargs.pop("headers", {})}
189+
headers = {**kwargs.pop("headers", {}), **self._telemetry_headers}
190190
return httpx.AsyncClient(headers=headers, **kwargs)
191191

192192
def _normalize_url(self, value: str) -> str:

src/auth0_server_python/telemetry.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,6 @@ def default() -> "Telemetry":
4444
"""Create a Telemetry instance with this SDK's package metadata."""
4545
try:
4646
version = importlib.metadata.version(Telemetry._PACKAGE_NAME)
47-
except Exception:
47+
except importlib.metadata.PackageNotFoundError:
4848
version = "unknown"
4949
return Telemetry(name=Telemetry._PACKAGE_NAME, version=version)

src/auth0_server_python/tests/test_telemetry.py

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import base64
2+
import importlib.metadata
23
import json
34
import platform
4-
from unittest.mock import AsyncMock, patch
5+
from unittest.mock import AsyncMock, MagicMock, patch
56

67
import pytest
78

@@ -63,7 +64,7 @@ def test_default_factory(self):
6364

6465
@patch(
6566
"auth0_server_python.telemetry.importlib.metadata.version",
66-
side_effect=Exception("not installed"),
67+
side_effect=importlib.metadata.PackageNotFoundError("not installed"),
6768
)
6869
def test_default_factory_unknown_version_on_error(self, _mock):
6970
telemetry = Telemetry.default()
@@ -96,23 +97,40 @@ def test_server_client_telemetry_payload_structure(self):
9697
assert "version" in decoded
9798
assert "python" in decoded["env"]
9899

99-
def test_get_http_client_includes_telemetry_headers(self):
100+
@pytest.mark.asyncio
101+
async def test_get_http_client_includes_telemetry_headers(self):
100102
client = self._make_client()
101103
http_client = client._get_http_client()
102104
for key, value in client._telemetry_headers.items():
103105
assert http_client.headers.get(key) == value
106+
await http_client.aclose()
107+
108+
@pytest.mark.asyncio
109+
async def test_get_http_client_per_request_headers_do_not_override_telemetry(self):
110+
client = self._make_client()
111+
http_client = client._get_http_client(headers={"User-Agent": "custom", "X-Custom": "val"})
112+
# Telemetry headers must win over caller-provided duplicates
113+
assert http_client.headers.get("User-Agent") == client._telemetry_headers["User-Agent"]
114+
assert http_client.headers.get("Auth0-Client") == client._telemetry_headers["Auth0-Client"]
115+
# Non-conflicting caller headers are preserved
116+
assert http_client.headers.get("X-Custom") == "val"
117+
await http_client.aclose()
104118

105119
def test_my_account_client_receives_telemetry_headers(self):
106120
client = self._make_client()
107121
assert client._my_account_client._headers == client._telemetry_headers
108122

123+
def test_mfa_client_receives_telemetry_headers(self):
124+
client = self._make_client()
125+
assert client._mfa_client._headers == client._telemetry_headers
126+
109127
@pytest.mark.asyncio
110128
async def test_fetch_oidc_metadata_sends_telemetry(self, mocker):
111129
client = self._make_client()
112-
mock_response = AsyncMock()
130+
mock_response = MagicMock()
113131
mock_response.status_code = 200
114132
mock_response.json.return_value = {"issuer": "https://auth0.local/"}
115-
mock_response.raise_for_status = AsyncMock()
133+
mock_response.raise_for_status = MagicMock()
116134

117135
mock_http_client = AsyncMock()
118136
mock_http_client.get.return_value = mock_response

0 commit comments

Comments
 (0)