async def subscribe_async_iterator_mock(): # Create an AsyncIterator from an EventEmitter emitter = EventEmitter() iterator = EventEmitterAsyncIterator(emitter, "publish") # Make sure it works as an async iterator assert iterator.__aiter__() is iterator assert callable(iterator.__anext__) # Queue up publishes assert emitter.emit("publish", "Apple") is True assert emitter.emit("publish", "Banana") is True # Read payloads assert await iterator.__anext__() == "Apple" assert await iterator.__anext__() == "Banana" # Read ahead i3 = iterator.__anext__() i4 = iterator.__anext__() # Publish assert emitter.emit("publish", "Coconut") is True assert emitter.emit("publish", "Durian") is True # Await results assert await i3 == "Coconut" assert await i4 == "Durian" # Read ahead i5 = iterator.__anext__() # Terminate emitter await iterator.aclose() # Publish is not caught after terminate assert emitter.emit("publish", "Fig") is False # Find that cancelled read-ahead got a "done" result with raises(StopAsyncIteration): await i5 # And next returns empty completion value with raises(StopAsyncIteration): await iterator.__anext__()
async def subscribe_async_iterator_mock(): # Create an AsyncIterator from an EventEmitter emitter = EventEmitter() iterator = EventEmitterAsyncIterator(emitter, 'publish') # Queue up publishes assert emitter.emit('publish', 'Apple') is True assert emitter.emit('publish', 'Banana') is True # Read payloads assert await iterator.__anext__() == 'Apple' assert await iterator.__anext__() == 'Banana' # Read ahead i3 = iterator.__anext__() i4 = iterator.__anext__() # Publish assert emitter.emit('publish', 'Coconut') is True assert emitter.emit('publish', 'Durian') is True # Await results assert await i3 == 'Coconut' assert await i4 == 'Durian' # Read ahead i5 = iterator.__anext__() # Terminate emitter await iterator.aclose() # Publish is not caught after terminate assert emitter.emit('publish', 'Fig') is False # Find that cancelled read-ahead got a "done" result with raises(StopAsyncIteration): await i5 # And next returns empty completion value with raises(StopAsyncIteration): await iterator.__anext__()