11import pytest
22import logging
3+ import contextlib
34from unittest .mock import patch , MagicMock
45
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+
513@pytest .fixture (autouse = True )
6- def mock_logger (monkeypatch ):
14+ def patch_otel_for_tests (monkeypatch ):
715 """
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.
918 """
1019 # Create a proper logger with a handler that won't cause errors
1120 test_logger = logging .getLogger ("test-logger" )
@@ -15,41 +24,34 @@ def mock_logger(monkeypatch):
1524 test_logger .addHandler (handler )
1625 test_logger .propagate = False
1726
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
3528 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
3730 mock_traces .get_tracer .return_value = MagicMock ()
31+ mock_traces .new_span .return_value = MagicMock ()
3832
39- # Configure the logs mock
4033 mock_logs = MagicMock ()
4134 mock_logs .new_log .return_value = None
42- mock_logs .get_logger .return_value = MagicMock ()
35+ mock_logs .get_logger .return_value = test_logger
4336
44- # Configure the metrics mock
4537 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
4647
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 )
5255
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