from unittest.mock import Mock, call from getstream_connector.utils.datadog import set_tags, wrap_methods from tests import constants class MockClient: def method_1(self): pass def method_2(self): pass def test_wrap_methods(mocker): methods = ( "method_1", "method_2", ) prefix = "test" client = MockClient() mock_wrap = mocker.patch("getstream_connector.utils.datadog.tracer.wrap") wrap_methods(client, methods, name_prefix=prefix, service_name=constants.SERVICE_NAME) assert mock_wrap.call_args_list == [ call("test.method_1", service=constants.SERVICE_NAME), call("test.method_2", service=constants.SERVICE_NAME), ] def test_wrap_methods_error(mocker): methods = ("method_3",) prefix = "test" client = MockClient() mock_warning = mocker.patch("getstream_connector.utils.datadog.logger.warning") wrap_methods(client, methods, name_prefix=prefix, service_name=constants.SERVICE_NAME) assert mock_warning.call_args.args[0] == "An error occurred while patching MockClient.method_3" def test_set_tags(mocker): status_code = 200 url = "https://test.test" method = "TEST_METHOD" limit = 1 remaining = 2 reset = 3 reset_in_seconds = 4 span_mock = Mock() mocker.patch( "getstream_connector.utils.datadog.tracer", Mock(enabled=True, current_span=Mock(return_value=span_mock)), ) set_tags( status_code, url, method, { "ratelimit_limit": limit, "ratelimit_remaining": remaining, "ratelimit_reset": reset, "ratelimit_reset_in_seconds": reset_in_seconds, }, ) assert span_mock.set_tag.call_args_list == [ call("http.status_code", str(status_code)), call("http.url", url), call("http.method", method), call("stream.ratelimit_limit", limit), call("stream.ratelimit_remaining", remaining), call("stream.ratelimit_reset", reset), call("stream.ratelimit_reset_in_seconds", reset_in_seconds), ] def test_set_tags_no_url(mocker): status_code = 200 url = None method = "TEST_METHOD" limit = 1 remaining = 2 reset = 3 reset_in_seconds = 4 span_mock = Mock() mocker.patch( "getstream_connector.utils.datadog.tracer", Mock(enabled=True, current_span=Mock(return_value=span_mock)), ) set_tags( status_code, url, method, { "ratelimit_limit": limit, "ratelimit_remaining": remaining, "ratelimit_reset": reset, "ratelimit_reset_in_seconds": reset_in_seconds, }, ) assert span_mock.set_tag.call_args_list == [ call("http.status_code", str(status_code)), call("http.method", method), call("stream.ratelimit_limit", limit), call("stream.ratelimit_remaining", remaining), call("stream.ratelimit_reset", reset), call("stream.ratelimit_reset_in_seconds", reset_in_seconds), ] def test_set_tags_no_method(mocker): status_code = 200 url = "https://test.test" method = None limit = 1 remaining = 2 reset = 3 reset_in_seconds = 4 span_mock = Mock() mocker.patch( "getstream_connector.utils.datadog.tracer", Mock(enabled=True, current_span=Mock(return_value=span_mock)), ) set_tags( status_code, url, method, { "ratelimit_limit": limit, "ratelimit_remaining": remaining, "ratelimit_reset": reset, "ratelimit_reset_in_seconds": reset_in_seconds, }, ) assert span_mock.set_tag.call_args_list == [ call("http.status_code", str(status_code)), call("http.url", url), call("stream.ratelimit_limit", limit), call("stream.ratelimit_remaining", remaining), call("stream.ratelimit_reset", reset), call("stream.ratelimit_reset_in_seconds", reset_in_seconds), ] def test_set_trace_tags_disabled(mocker): status_code = 200 url = "https://test.test" method = "TEST_METHOD" limit = 1 remaining = 2 reset = 3 reset_in_seconds = 4 tracer_mock = mocker.patch("getstream_connector.utils.datadog.tracer", Mock(enabled=False, current_span=Mock())) set_tags( status_code, url, method, { "ratelimit_limit": limit, "ratelimit_remaining": remaining, "ratelimit_reset": reset, "ratelimit_reset_in_seconds": reset_in_seconds, }, ) tracer_mock.current_span.assert_not_called() def test_set_trace_tags_no_span(mocker): status_code = 200 url = "https://test.test" method = "TEST_METHOD" limit = 1 remaining = 2 reset = 3 reset_in_seconds = 4 span_mock = Mock(__bool__=Mock(return_value=False)) mocker.patch( "getstream_connector.utils.datadog.tracer", Mock(enabled=True, current_span=Mock(return_value=span_mock)), ) set_tags( status_code, url, method, { "ratelimit_limit": limit, "ratelimit_remaining": remaining, "ratelimit_reset": reset, "ratelimit_reset_in_seconds": reset_in_seconds, }, ) span_mock.set_tag.assert_not_called() span_mock.set_tag_str.assert_not_called() def test_set_trace_tags_error(mocker): status_code = 200 url = "https://test.test" method = "TEST_METHOD" limit = 1 remaining = 2 reset = 3 reset_in_seconds = 4 exception = Exception("test exception") mocker.patch( "getstream_connector.utils.datadog.tracer", Mock(enabled=True, current_span=Mock(side_effect=exception)), ) logger_mock = mocker.patch("getstream_connector.utils.datadog.logger.warning") set_tags( status_code, url, method, { "ratelimit_limit": limit, "ratelimit_remaining": remaining, "ratelimit_reset": reset, "ratelimit_reset_in_seconds": reset_in_seconds, }, ) logger_mock.assert_called_once_with("An error occurred while adding tags.", exc_info=exception)