async def test_reclaim_lost_messages(loop, redis_client, redis_pool, dummy_api): """Test that messages which another consumer has timed out on can be reclaimed""" # Add a message await redis_client.xadd( "my.dummy.my_event:stream", fields={ b"api_name": b"my.dummy", b"event_name": b"my_event", b"id": b"123", b"version": b"1", b":field": b'"value"', }, ) # Create the consumer group await redis_client.xgroup_create( stream="my.dummy.my_event:stream", group_name="test_service", latest_id="0" ) # Claim it in the name of another consumer result = await redis_client.xread_group( group_name="test_service", consumer_name="bad_consumer", streams=["my.dummy.my_event:stream"], latest_ids=[">"], ) assert result, "Didn't actually manage to claim any message" # Sleep a moment to fake a short timeout await asyncio.sleep(0.1) event_transport = RedisEventTransport( redis_pool=redis_pool, service_name="test_service", consumer_name="good_consumer", acknowledgement_timeout=0.01, # in ms, short for the sake of testing stream_use=StreamUse.PER_EVENT, ) reclaimer = event_transport._reclaim_lost_messages( stream_names=["my.dummy.my_event:stream"], consumer_group="test_service", expected_events={"my_event"}, ) reclaimed_messages = [] async for m in reclaimer: reclaimed_messages.extend(m) assert len(reclaimed_messages) == 1 assert reclaimed_messages[0].native_id assert type(reclaimed_messages[0].native_id) == str
async def test_reclaim_lost_messages_ignores_non_timed_out_messages( loop, redis_client, redis_pool, dummy_api ): """Ensure messages which have not timed out are not reclaimed""" # Add a message await redis_client.xadd( "my.dummy.my_event:stream", fields={ b"api_name": b"my.dummy", b"event_name": b"my_event", b"id": b"123", b":field": b'"value"', }, ) # Create the consumer group await redis_client.xgroup_create( stream="my.dummy.my_event:stream", group_name="test_service", latest_id="0" ) # Claim it in the name of another consumer await redis_client.xread_group( group_name="test_service", consumer_name="bad_consumer", streams=["my.dummy.my_event:stream"], latest_ids=[">"], ) # Sleep a moment to fake a short timeout await asyncio.sleep(0.1) event_transport = RedisEventTransport( redis_pool=redis_pool, service_name="test_service", consumer_name="good_consumer", # in ms, longer as we want to check that the messages is not reclaimed acknowledgement_timeout=0.9, stream_use=StreamUse.PER_EVENT, ) reclaimer = event_transport._reclaim_lost_messages( stream_names=["my.dummy.my_event:stream"], consumer_group="test_service", expected_events={"my_event"}, ) reclaimed_messages = [m async for m in reclaimer] assert len(reclaimed_messages) == 0
async def test_reclaim_lost_messages(loop, redis_client, redis_pool, dummy_api): """Test that messages which another consumer has timed out on can be reclaimed""" # Add a message await redis_client.xadd( "my.dummy.my_event:stream", fields={ b"api_name": b"my.dummy", b"event_name": b"my_event", b"id": b"123", b"version": b"1", b":field": b'"value"', }, ) # Create the consumer group await redis_client.xgroup_create("my.dummy.my_event:stream", "test_group", latest_id="0") # Claim it in the name of another consumer await redis_client.xread_group("test_group", "bad_consumer", ["my.dummy.my_event:stream"], latest_ids=[0]) # Sleep a moment to fake a short timeout await asyncio.sleep(0.02) event_transport = RedisEventTransport( redis_pool=redis_pool, consumer_group_prefix="test_group", consumer_name="good_consumer", acknowledgement_timeout=0.01, # in ms, short for the sake of testing stream_use=StreamUse.PER_EVENT, ) reclaimer = event_transport._reclaim_lost_messages( stream_names=["my.dummy.my_event:stream"], consumer_group="test_group", expected_events={"my_event"}, ) reclaimed_messages = [m async for m, id_ in reclaimer] assert len(reclaimed_messages) == 1 assert reclaimed_messages[0].native_id assert type(reclaimed_messages[0].native_id) == str