예제 #1
0
    async def accepts_type_definition_with_async_subscribe_function():
        pubsub = EventEmitter()

        async def subscribe_email(_inbox, _info):
            return EventEmitterAsyncIterator(pubsub, "importantEmail")

        schema = GraphQLSchema(
            query=QueryType,
            subscription=GraphQLObjectType(
                "Subscription",
                {
                    "importantEmail":
                    GraphQLField(GraphQLString, subscribe=subscribe_email)
                },
            ),
        )

        ast = parse("""
            subscription {
              importantEmail
            }
            """)

        subscription = await subscribe(schema, ast)

        pubsub.emit("importantEmail", {"importantEmail": {}})

        await anext(subscription)
예제 #2
0
    async def emit_async():
        emitter = EventEmitter()
        emitted = []

        async def listener(value):
            emitted.append(value)

        emitter.add_listener("foo", listener)
        emitter.emit("foo", "bar")
        emitter.emit("bar", "baz")
        await sleep(0)
        assert emitted == ["bar"]
예제 #3
0
    def emit_sync():
        emitter = EventEmitter()
        emitted = []

        def listener(value):
            emitted.append(value)

        emitter.add_listener("foo", listener)
        assert emitter.emit("foo", "bar") is True
        assert emitted == ["bar"]
        assert emitter.emit("bar", "baz") is False
        assert emitted == ["bar"]
예제 #4
0
    async def emit_async():
        emitter = EventEmitter()
        emitted = []

        async def listener(value):
            emitted.append(value)

        emitter.add_listener('foo', listener)
        emitter.emit('foo', 'bar')
        emitter.emit('bar', 'baz')
        await sleep(0)
        assert emitted == ['bar']
예제 #5
0
    def emit_sync():
        emitter = EventEmitter()
        emitted = []

        def listener(value):
            emitted.append(value)

        emitter.add_listener('foo', listener)
        assert emitter.emit('foo', 'bar') is True
        assert emitted == ['bar']
        assert emitter.emit('bar', 'baz') is False
        assert emitted == ['bar']
예제 #6
0
 async def aclose_cleans_up():
     emitter = EventEmitter()
     assert emitter.listeners["publish"] == []
     iterator = EventEmitterAsyncIterator(emitter, "publish")
     assert emitter.listeners["publish"] == [iterator.queue.put]
     assert not iterator.closed
     for value in range(3):
         emitter.emit("publish", value)
     await sleep(0)
     assert iterator.queue.qsize() == 3
     await iterator.aclose()
     assert emitter.listeners["publish"] == []
     assert iterator.queue.empty()
     assert iterator.closed
예제 #7
0
    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__()
예제 #8
0
    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__()