from unittest.mock import MagicMock, Mock from ddtrace.propagation.http import HTTPPropagator from getstream_connector.utils.injector import ( inject_correlation_id, inject_trace_context, ) from tests import constants def test_inject_trace_context(mocker): activity = {"some": "data"} context = MagicMock(trace_id=123, span_id=456) mock_inject = mocker.patch.object(HTTPPropagator, "inject") inject_trace_context(activity, context) mock_inject.assert_called_once_with(context, {}) assert constants.TRACE_CONTEXT_KEY in activity assert activity[constants.TRACE_CONTEXT_KEY] == {} def test_inject_trace_context_no_activity(mocker): context = MagicMock(trace_id=123, span_id=456) mock_inject = mocker.patch.object(HTTPPropagator, "inject") inject_trace_context({}, context) mock_inject.assert_not_called() def test_inject_trace_context_no_context(mocker): activity = {} mock_inject = mocker.patch.object(HTTPPropagator, "inject") inject_trace_context(activity, None) mock_inject.assert_not_called() def test_inject_trace_context_already_exists(mocker): activity = {constants.TRACE_CONTEXT_KEY: "existing_context"} context = MagicMock(trace_id=123, span_id=456) mock_info = mocker.patch("getstream_connector.utils.injector.logger.info") inject_trace_context(activity, context) mock_info.assert_called_once_with("Trace context already exists in activity.") def test_inject_trace_context_error(mocker): activity = {"some": "data"} context = MagicMock(trace_id=123, span_id=456) exception = Exception("test exception") mock_warning = mocker.patch("getstream_connector.utils.injector.logger.warning") mocker.patch.object(HTTPPropagator, "inject", Mock(side_effect=exception)) inject_trace_context(activity, context) mock_warning.assert_called_once_with("Can't insert trace context to activity.", exc_info=exception) def test_inject_correlation_id(): activity = {"some": "data"} correlation_id = "corr_id_123" inject_correlation_id(activity, correlation_id) assert constants.CORRELATION_ID_KEY in activity assert activity[constants.CORRELATION_ID_KEY] == correlation_id def test_inject_correlation_id_no_activity(): correlation_id = "corr_id_123" inject_correlation_id({}, correlation_id) assert True # Nothing to assert, just ensuring no exception def test_inject_correlation_id_no_correlation_id(): activity = {} inject_correlation_id(activity, None) assert constants.CORRELATION_ID_KEY not in activity def test_inject_correlation_id_already_exists(mocker): activity = {constants.CORRELATION_ID_KEY: "existing_id"} correlation_id = "corr_id_123" mock_info = mocker.patch("getstream_connector.utils.injector.logger.info") inject_correlation_id(activity, correlation_id) mock_info.assert_called_once_with("Correlation id already exists in activity.") def test_inject_correlation_id_error(mocker): exception = Exception("test exception") class DictWithError(dict): def __setitem__(self, key, value): raise exception activity = DictWithError(**{"some": "data"}) context = MagicMock(trace_id=123, span_id=456) exception = Exception() mock_warning = mocker.patch("getstream_connector.utils.injector.logger.warning") inject_correlation_id(activity, context) mock_warning.assert_called_once_with("Can't insert correlation id to activity.", exc_info=exception)