Skip to content

Commit 391de39

Browse files
committed
added tests
1 parent b314b28 commit 391de39

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

featuremanagement/azuremonitor/_send_telemetry.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ def on_start(self, span: Span, parent_context: Optional[Context] = None) -> None
136136
:param parent_context: The parent context of the span.
137137
"""
138138
if not HAS_AZURE_MONITOR_EVENTS_EXTENSION:
139+
logger.warning("Azure Monitor Events Extension is not installed.")
139140
return
140141
if self._targeting_context_accessor and callable(self._targeting_context_accessor):
141142
if inspect.iscoroutinefunction(self._targeting_context_accessor):

tests/test_send_telemetry_appinsights.py

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,19 @@
33
# Licensed under the MIT License. See License.txt in the project root for
44
# license information.
55
# --------------------------------------------------------------------------
6+
import logging
67
from unittest.mock import patch
78
import pytest
8-
from featuremanagement import EvaluationEvent, FeatureFlag, Variant, VariantAssignmentReason
9+
from featuremanagement import EvaluationEvent, FeatureFlag, Variant, VariantAssignmentReason, TargetingContext
910
import featuremanagement.azuremonitor._send_telemetry
11+
from featuremanagement.azuremonitor import TargetingSpanProcessor
1012

1113

1214
@pytest.mark.usefixtures("caplog")
1315
class TestSendTelemetryAppinsights:
1416

17+
user_id = None
18+
1519
def test_send_telemetry_appinsights(self):
1620
feature_flag = FeatureFlag.convert_from_json(
1721
{
@@ -211,3 +215,49 @@ def test_send_telemetry_appinsights_allocation(self):
211215
assert mock_track_event.call_args[0][1]["VariantAssignmentReason"] == "Percentile"
212216
assert mock_track_event.call_args[0][1]["VariantAssignmentPercentage"] == "25"
213217
assert "DefaultWhenEnabled" not in mock_track_event.call_args[0][1]
218+
219+
def test_targeting_span_processor(self, caplog):
220+
processor = TargetingSpanProcessor()
221+
processor.on_start(None)
222+
assert "" in caplog.text
223+
caplog.clear()
224+
225+
processor = TargetingSpanProcessor(targeting_context_accessor="not callable")
226+
processor.on_start(None)
227+
assert "" in caplog.text
228+
caplog.clear()
229+
230+
processor = TargetingSpanProcessor(targeting_context_accessor=self.bad_targeting_context_accessor)
231+
processor.on_start(None)
232+
assert (
233+
"targeting_context_accessor did not return a TargetingContext. Received type <class 'str'>." in caplog.text
234+
)
235+
caplog.clear()
236+
237+
processor = TargetingSpanProcessor(targeting_context_accessor=self.async_targeting_context_accessor)
238+
processor.on_start(None)
239+
assert "Async targeting_context_accessor is not supported." in caplog.text
240+
caplog.clear()
241+
242+
processor = TargetingSpanProcessor(targeting_context_accessor=self.accessor_callback)
243+
logging.getLogger().setLevel(logging.DEBUG)
244+
processor.on_start(None)
245+
assert "TargetingContext does not have a user ID." in caplog.text
246+
caplog.clear()
247+
248+
with patch("opentelemetry.sdk.trace.Span") as mock_span:
249+
self.user_id = "test_user"
250+
processor.on_start(mock_span)
251+
assert mock_span.set_attribute.call_args[0][0] == "TargetingId"
252+
assert mock_span.set_attribute.call_args[0][1] == "test_user"
253+
254+
self.user_id = None
255+
256+
def bad_targeting_context_accessor(self):
257+
return "not targeting context"
258+
259+
async def async_targeting_context_accessor(self):
260+
return TargetingContext(user_id=self.user_id)
261+
262+
def accessor_callback(self):
263+
return TargetingContext(user_id=self.user_id)

0 commit comments

Comments
 (0)