import json from unittest.mock import call import pytest from stream.exceptions import RateLimitReached from getstream_connector.throttling import DummyThrottler from tests import constants from tests.functional import data @pytest.mark.asyncio async def test_add_to_many(stream_client, request_mock): request_mock.add_many(data.ONE_POST_SUCCESS) await stream_client.add_to_many({"some": "data"}, ("feed_1",)) assert request_mock.call_count == 1 request_data = json.loads(request_mock.last_request_data["data"]) activity_data = request_data["activity"] assert activity_data["some"] == "data" assert request_data["feeds"] == ["feed_1"] @pytest.mark.asyncio @pytest.mark.parametrize("stream_client", ({"inject_trace_context": False},), indirect=["stream_client"]) async def test_add_to_many_inject_trace_context_disabled(stream_client, request_mock): request_mock.add_many(data.ONE_POST_SUCCESS) await stream_client.add_to_many({"some": "data"}, ("feed_1",)) assert request_mock.call_count == 1 request_data = json.loads(request_mock.last_request_data["data"]) activity_data = request_data["activity"] assert constants.TRACE_CONTEXT_KEY not in activity_data @pytest.mark.asyncio async def test_add_to_many_trace_context_injected(stream_client, request_mock): request_mock.add_many(data.ONE_POST_SUCCESS) await stream_client.add_to_many({"some": "data"}, ("feed_1",)) assert request_mock.call_count == 1 request_data = json.loads(request_mock.last_request_data["data"]) activity_data = request_data["activity"] assert constants.TRACE_CONTEXT_KEY in activity_data @pytest.mark.asyncio @pytest.mark.parametrize("stream_client", ({"inject_correlation_id": False},), indirect=True) async def test_add_to_many_inject_correlation_id_disabled(stream_client, request_mock): correlation_id = "corr_id_123" stream_client.set_correlation_id(correlation_id) request_mock.add_many(data.ONE_POST_SUCCESS) await stream_client.add_to_many({"some": "data"}, ("feed_1",)) assert request_mock.call_count == 1 request_data = json.loads(request_mock.last_request_data["data"]) activity_data = request_data["activity"] assert constants.CORRELATION_ID_KEY not in activity_data @pytest.mark.asyncio async def test_add_to_many_correlation_id_not_injected(stream_client, request_mock): request_mock.add_many(data.ONE_POST_SUCCESS) await stream_client.add_to_many({"some": "data"}, ("feed_1",)) assert request_mock.call_count == 1 request_data = json.loads(request_mock.last_request_data["data"]) activity_data = request_data["activity"] assert constants.CORRELATION_ID_KEY not in activity_data @pytest.mark.asyncio async def test_add_to_many_correlation_id_injected_from_self(stream_client, request_mock): correlation_id = "corr_id_123" stream_client.set_correlation_id(correlation_id) request_mock.add_many(data.ONE_POST_SUCCESS) await stream_client.add_to_many({"some": "data"}, ("feed_1",)) assert request_mock.call_count == 1 request_data = json.loads(request_mock.last_request_data["data"]) activity_data = request_data["activity"] assert activity_data[constants.CORRELATION_ID_KEY] == correlation_id @pytest.mark.asyncio async def test_add_to_many_correlation_id_injected_from_flask(stream_client, request_mock, mocker): correlation_id = "corr_id_123" request_mock.add_many(data.ONE_POST_SUCCESS) mocker.patch("getstream_connector.integrations.flask.g", correlation_id=correlation_id) await stream_client.add_to_many({"some": "data"}, ("feed_1",)) assert request_mock.call_count == 1 request_data = json.loads(request_mock.last_request_data["data"]) activity_data = request_data["activity"] assert activity_data[constants.CORRELATION_ID_KEY] == correlation_id @pytest.mark.asyncio @pytest.mark.parametrize("stream_client", ({"throttler": DummyThrottler()},), indirect=True) async def test_add_to_many_retry_success(stream_client, frozen_time, request_mock, sleep_mock): request_mock.add_many(data.TWO_POST_RATELIMIT_REACHED_ONE_SUCCESS) await stream_client.add_to_many({"some": "data"}, ("feed_1",)) assert request_mock.call_count == 3 assert sleep_mock.call_args_list == [call(123), call(456)] @pytest.mark.asyncio @pytest.mark.parametrize("stream_client", ({"throttler": DummyThrottler()},), indirect=True) async def test_add_to_many_retry_fail(stream_client, frozen_time, request_mock, sleep_mock): request_mock.add_many(data.THREE_POST_RATELIMIT_REACHED) with pytest.raises(RateLimitReached): await stream_client.add_to_many({"some": "data"}, ("feed_1",)) assert request_mock.call_count == 3 assert sleep_mock.call_args_list == [call(123), call(456)] @pytest.mark.asyncio async def test_add_to_many_delay_request(stream_client, frozen_time, request_mock, sleep_mock): request_mock.add_many(data.THREE_POST_SUCCESS) await stream_client.add_to_many({"some": "data_1"}, ("feed_1",)) await stream_client.add_to_many({"some": "data_2"}, ("feed_2",)) await stream_client.add_to_many({"some": "data_3"}, ("feed_3",)) assert request_mock.call_count == 3 assert sleep_mock.call_args_list == [call(123), call(456)]