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>(); } } }
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; } }
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(); }