Example #1
0
        public async Task When_exception_throw_by_subscription_message_received_then_should_drop_subscription()
        {
            using (var store = new InMemoryStreamStore())
            {
                var eventReceivedException            = new TaskCompletionSource <Exception>();
                StreamMessageReceived messageReceived = _ =>
                {
                    throw new Exception();
                };
                SubscriptionDropped subscriptionDropped = (reason, exception) =>
                {
                    eventReceivedException.SetResult(exception);
                };
                string streamId = "stream-1";
                using (await store.SubscribeToStream("stream-1", StreamVersion.Start, messageReceived, subscriptionDropped))
                {
                    await store.AppendToStream(streamId,
                                               ExpectedVersion.NoStream,
                                               new NewStreamMessage(Guid.NewGuid(), "type", "{}"));

                    var dropException = await eventReceivedException.Task.WithTimeout();

                    dropException.ShouldBeOfType <Exception>();
                }
            }
        }
Example #2
0
        public async Task CanSubscribeToStream()
        {
            var streamMessageReceived = false;
            var subscriptionDropped   = false;

            var streamStore = new InMemoryStreamStore();
            var streamId    = new StreamId("test");

            streamStore.SubscribeToStream(streamId, null, StreamMessageReceived, SubscriptionDropped);

            var message = new NewStreamMessage(Guid.NewGuid(), "Test", @"{ 'Hello': 'World' }");
            await streamStore.AppendToStream(streamId, ExpectedVersion.Any, message);

            Thread.Sleep(100);

            Assert.True(streamMessageReceived);
            Assert.False(subscriptionDropped);

            async Task StreamMessageReceived(IStreamSubscription subscription, StreamMessage streamMessage, CancellationToken cancellationToken)
            {
                streamMessageReceived = true;
                Assert.Equal("Test", streamMessage.Type);
            }

            void SubscriptionDropped(IStreamSubscription subscription, SubscriptionDroppedReason reason, Exception exception = null)
            {
                subscriptionDropped = true;
            }
        }
Example #3
0
        public async Task ShowWithCatchupSubscription()
        {
            //setup a projection schema (one of many ways)
            var projector = new SqlProjector(
                Resolve.WhenEqualToHandlerMessageType(new PortfolioProjection()),
                new TransactionalSqlCommandExecutor(
                    new ConnectionStringSettings(
                        "projac",
                        @"Data Source=(localdb)\ProjectsV12;Initial Catalog=ProjacUsage;Integrated Security=SSPI;",
                        "System.Data.SqlClient"),
                    IsolationLevel.ReadCommitted));

            projector.Project(new object[] { new DropSchema(), new CreateSchema() });

            //setup a memory eventstore
            var store = new InMemoryStreamStore();

            //setup a sample stream (using some sample events)
            var portfolioId = Guid.NewGuid();
            var events      = new object[]
            {
                new PortfolioAdded {
                    Id = portfolioId, Name = "My Portfolio"
                },
                new PortfolioRenamed {
                    Id = portfolioId, Name = "Your Portfolio"
                },
                new PortfolioRemoved {
                    Id = portfolioId
                }
            };
            var stream = string.Format("portfolio-{0}", portfolioId.ToString("N"));
            await store.AppendToStream(
                stream,
                ExpectedVersion.Any,
                events
                .Select(@event => new NewStreamMessage(
                            Guid.NewGuid(),
                            @event.GetType().FullName,
                            JsonConvert.SerializeObject(@event)))
                .ToArray());

            //project the sample stream (until end of stream)
            var subscription = store.SubscribeToStream(stream, null, async(_, rawMessage) =>
            {
                var @event = JsonConvert.DeserializeObject(
                    await rawMessage.GetJsonData(),
                    Type.GetType(rawMessage.Type, true));

                projector.Project(@event);
            });
            //should complete within 5 seconds.
            await Task.Delay(TimeSpan.FromSeconds(5));

            subscription.Dispose();
        }