Пример #1
0
        public Task SubscribeTwoConsumer_SendOneMessage_BothConsumerReceivesMessage()
        {
            return(TryTest(async() =>
            {
                // arrange
                var cts = new CancellationTokenSource(30000);
                var eventDescription = new EventDescription(
                    Guid.NewGuid().ToString());

                // act
                IEventStream consumerOne = await _registry
                                           .SubscribeAsync(eventDescription);
                IEventStream consumerTwo = await _registry
                                           .SubscribeAsync(eventDescription);
                var outgoing = new EventMessage(eventDescription, "bar");
                await _sender.SendAsync(outgoing);

                // assert
                IEventMessage incomingOne =
                    await consumerOne.ReadAsync(cts.Token);
                IEventMessage incomingTwo =
                    await consumerTwo.ReadAsync(cts.Token);
                Assert.Equal(outgoing.Payload, incomingOne.Payload);
                Assert.Equal(outgoing.Payload, incomingTwo.Payload);
            }));
        }
Пример #2
0
        public Task SubscribeTwoConsumer_SendTwoMessage_BothConsumerReceivesIndependentMessage()
        {
            return(TryTest(async() =>
            {
                // arrange
                var cts = new CancellationTokenSource(30000);
                string name = Guid.NewGuid().ToString();
                var eventDescriptionOne = new EventDescription(
                    name, new ArgumentNode("b", "x"));
                var eventDescriptionTwo = new EventDescription(
                    name, new ArgumentNode("b", "y"));

                // act
                IEventStream consumerOne = await _registry
                                           .SubscribeAsync(eventDescriptionOne);
                var outgoingOne = new EventMessage(eventDescriptionOne, "foo");
                await _sender.SendAsync(outgoingOne);

                IEventStream consumerTwo = await _registry
                                           .SubscribeAsync(eventDescriptionTwo);
                var outgoingTwo = new EventMessage(eventDescriptionTwo, "bar");
                await _sender.SendAsync(outgoingTwo);

                // assert
                IEventMessage incomingOne =
                    await consumerOne.ReadAsync(cts.Token);
                IEventMessage incomingTwo =
                    await consumerTwo.ReadAsync(cts.Token);
                Assert.Equal(outgoingOne.Payload, incomingOne.Payload);
                Assert.Equal(outgoingTwo.Payload, incomingTwo.Payload);
                Assert.NotEqual(incomingOne.Event, incomingTwo.Event);
            }));
        }
        public async Task Subscribe_ObjectValueArgument_Send_MessageReceived()
        {
            // arrange
            var eventRegistry = new InMemoryEventRegistry();

            var a = new EventDescription("event",
                                         new ArgumentNode("foo", new ObjectValueNode(
                                                              new ObjectFieldNode("a", 123),
                                                              new ObjectFieldNode("b", true),
                                                              new ObjectFieldNode("c", "abc"))));

            var b = new EventDescription("event",
                                         new ArgumentNode("foo", new ObjectValueNode(
                                                              new ObjectFieldNode("b", true),
                                                              new ObjectFieldNode("a", 123),
                                                              new ObjectFieldNode("c", "abc"))));

            // act
            IEventStream stream =
                await eventRegistry.SubscribeAsync(a);

            // assert
            var incoming = new EventMessage(b, "foo");
            await eventRegistry.SendAsync(incoming);

            IEventMessage outgoing = await stream.ReadAsync();

            Assert.Equal(incoming, outgoing);
        }
Пример #4
0
        public async Task <IQueryExecutionResult> ReadAsync(
            CancellationToken cancellationToken)
        {
            if (IsCompleted)
            {
                throw new InvalidOperationException(
                          "The response stream has already been completed.");
            }

            using (var ct = CancellationTokenSource.CreateLinkedTokenSource(
                       _cancellationTokenSource.Token, cancellationToken))
            {
                IEventMessage message = await _eventStream.ReadAsync(ct.Token);

                return(await ExecuteQueryAsync(message, ct.Token));
            }
        }
Пример #5
0
        public async Task Subscribe_Send_MessageReveived()
        {
            // arrange
            var eventDescription = new EventDescription("foo");
            var eventRegistry    = new InMemoryEventRegistry();

            // act
            IEventStream stream =
                await eventRegistry.SubscribeAsync(eventDescription);

            // assert
            var incoming = new EventMessage("foo");
            await eventRegistry.SendAsync(incoming);

            IEventMessage outgoing = await stream.ReadAsync();

            Assert.Equal(incoming, outgoing);
        }
Пример #6
0
        public async Task <TAggregate> GetAsync(string aggregateId, CancellationToken cancellationToken = default)
        {
            if (string.IsNullOrWhiteSpace(aggregateId))
            {
                throw new ArgumentException("AggregateId must not be null or empty");
            }

            var aggregate          = new TAggregate();
            var eventStreamContext = await _eventStream.ReadAsync(aggregateId, cancellationToken);

            if (eventStreamContext.Events != null)
            {
                aggregate.Rehydrate(eventStreamContext.Events);
            }

            aggregate.ConcurrencyKey = eventStreamContext.ConcurrencyKey;

            return(aggregate);
        }