1
1
import pytest
2
2
import logging
3
+ import contextlib
3
4
from unittest .mock import patch , MagicMock
4
5
6
+ # Create a simple context manager to replace span_in_context
7
+ @contextlib .contextmanager
8
+ def mock_span_in_context (name , kind = None , attributes = None ):
9
+ mock_span = MagicMock ()
10
+ mock_context = MagicMock ()
11
+ yield (mock_span , mock_context )
12
+
5
13
@pytest .fixture (autouse = True )
6
- def mock_logger (monkeypatch ):
14
+ def patch_otel_for_tests (monkeypatch ):
7
15
"""
8
- Mock the logger to prevent test failures.
16
+ Completely disable and replace OpenTelemetry to prevent test failures.
17
+ This is a more aggressive approach that should work even with coverage.
9
18
"""
10
19
# Create a proper logger with a handler that won't cause errors
11
20
test_logger = logging .getLogger ("test-logger" )
@@ -15,41 +24,34 @@ def mock_logger(monkeypatch):
15
24
test_logger .addHandler (handler )
16
25
test_logger .propagate = False
17
26
18
- # Replace the real logger with our test logger
19
- monkeypatch .setattr ("api_to_dataframe.utils.logger.logger" , test_logger )
20
- monkeypatch .setattr ("api_to_dataframe.models.retainer.logger" , test_logger )
21
-
22
- yield test_logger
23
-
24
- @pytest .fixture (autouse = True )
25
- def mock_otel_wrapper ():
26
- """
27
- Mock the OpenTelemetry wrapper to prevent test failures.
28
- This is applied to all tests automatically.
29
- """
30
- # Create mock objects for each component
31
- mock_span = MagicMock ()
32
- mock_context = MagicMock ()
33
-
34
- # Configure the traces mock
27
+ # Mock telemetry components
35
28
mock_traces = MagicMock ()
36
- mock_traces .span_in_context .return_value . __enter__ . return_value = ( mock_span , mock_context )
29
+ mock_traces .span_in_context .side_effect = mock_span_in_context
37
30
mock_traces .get_tracer .return_value = MagicMock ()
31
+ mock_traces .new_span .return_value = MagicMock ()
38
32
39
- # Configure the logs mock
40
33
mock_logs = MagicMock ()
41
34
mock_logs .new_log .return_value = None
42
- mock_logs .get_logger .return_value = MagicMock ()
35
+ mock_logs .get_logger .return_value = test_logger
43
36
44
- # Configure the metrics mock
45
37
mock_metrics = MagicMock ()
38
+ mock_metrics .metric_increment .return_value = None
39
+ mock_metrics .record_gauge .return_value = None
40
+ mock_metrics .record_histogram .return_value = None
41
+
42
+ # Mock main telemetry object
43
+ mock_telemetry = MagicMock ()
44
+ mock_telemetry .traces .return_value = mock_traces
45
+ mock_telemetry .logs .return_value = mock_logs
46
+ mock_telemetry .metrics .return_value = mock_metrics
46
47
47
- # Configure the main telemetry object
48
- mock_wrapper = MagicMock ()
49
- mock_wrapper .traces .return_value = mock_traces
50
- mock_wrapper .logs .return_value = mock_logs
51
- mock_wrapper .metrics .return_value = mock_metrics
48
+ # Apply all patches
49
+ monkeypatch .setattr ("api_to_dataframe.utils.logger.telemetry" , mock_telemetry )
50
+ monkeypatch .setattr ("api_to_dataframe.utils.logger.logger" , test_logger )
51
+ monkeypatch .setattr ("api_to_dataframe.models.retainer.logger" , test_logger )
52
+ monkeypatch .setattr ("api_to_dataframe.models.retainer.telemetry" , mock_telemetry )
53
+ monkeypatch .setattr ("api_to_dataframe.controller.client_builder.telemetry" , mock_telemetry )
54
+ monkeypatch .setattr ("api_to_dataframe.models.get_data.telemetry" , mock_telemetry )
52
55
53
- # Apply the patch to the wrapper_builder function
54
- with patch ('otel_wrapper.deps_injector.wrapper_builder' , return_value = mock_wrapper ):
55
- yield mock_wrapper
56
+ # Also patch the wrapper_builder function in case it's used directly
57
+ monkeypatch .setattr ("otel_wrapper.deps_injector.wrapper_builder" , lambda app_name : mock_telemetry )
0 commit comments