public EventProcessingLoopTests()
        {
            fixture     = new Fixture();
            mediator    = Substitute.For <IMediator>();
            eventStream = new InMemoryEventStream();
            tokenSource = new CancellationTokenSource();

            loop = new EventProcessingLoop(tokenSource.Token, mediator, eventStream);
        }
 public EventProcessingLoop(
     CancellationToken stoppingToken,
     IMediator mediator,
     InMemoryEventStream eventStream
     )
 {
     StoppingToken = stoppingToken;
     Mediator      = mediator;
     EventStream   = eventStream;
 }
        public async Task Events_added_to_the_in_memory_context_but_failing_on_concurrency_cannot_be_queried_back()
        {
            var eventStream = new InMemoryEventStream();
            var aggregateId = Any.Guid();

            Func <EventStoreDbContext> createDbContext = () =>
            {
                //                return TestDatabases.EventStoreDbContext();
                return(new InMemoryEventStoreDbContext(eventStream));
            };

            using (var db = createDbContext())
            {
                db.Events.Add(new Order.Created
                {
                    AggregateId    = aggregateId,
                    SequenceNumber = 1,
                    OrderNumber    = "one"
                }.ToStorableEvent());

                db.SaveChanges();
            }

            using (var db = createDbContext())
            {
                db.Events.Add(new Order.Created
                {
                    AggregateId    = aggregateId,
                    SequenceNumber = 1,
                    OrderNumber    = "two"
                }.ToStorableEvent());

                Action save = () => db.SaveChanges();

                save.ShouldThrow <DbUpdateException>()
                .Which
                .IsConcurrencyException()
                .Should()
                .BeTrue();
            }

            using (var db = createDbContext())
            {
                var created = db.Events.Single(e => e.AggregateId == aggregateId && e.SequenceNumber == 1)
                              .ToDomainEvent() as Order.Created;

                created.Should().NotBeNull();
                created.OrderNumber.Should().Be("one");
            }
        }
Beispiel #4
0
        protected override IEventSourcedRepository <TAggregate> CreateRepository <TAggregate>(
            Action onSave = null)
        {
            if (onSave != null)
            {
                var eventStream = new InMemoryEventStream();

                Configuration.Current.UseDependency(_ => eventStream);

                eventStream.BeforeSave += (sender, @event) => onSave();
            }

            return(Configuration.Current.Repository <TAggregate>());
        }
        public async Task Trigger_Message_IsDelivered()
        {
            // arrange
            var sent        = new EventMessage("foo", "bar");
            var eventStream = new InMemoryEventStream();

            // act
            eventStream.Trigger(sent);

            // assert
            IEventMessage received = await eventStream.ReadAsync();

            Assert.Equal(sent, received);
        }
        public async Task Trigger_Message_IsDelivered()
        {
            // arrange
            using var cts = new CancellationTokenSource(30000);
            var sent        = new EventMessage("foo", "bar");
            var eventStream = new InMemoryEventStream();
            IAsyncEnumerator <IEventMessage> enumerator = eventStream.GetAsyncEnumerator(cts.Token);

            // act
            await eventStream.TriggerAsync(sent, cts.Token);

            // assert
            Assert.True(await enumerator.MoveNextAsync());
            Assert.Equal(sent, enumerator.Current);
        }
        public async Task HandlesMultipleEventsOK()
        {
            // SETUP
            var es       = new InMemoryEventStream();
            var eStorage = new InMemoryEventStorage();
            var sStorage = new InMemorySnapShotStorage();
            var buildup  = BuildUp.Initialize(t =>
            {
                t.SetEventStream(es);
                t.SetEventProvider(eStorage);
                t.SetEventStorage(eStorage);
                t.SetSnapshotProvider(sStorage);
                t.SetSnapshotStorage(sStorage);
            });
            var @event = new BuildUpEvent <RandomEvent>
            {
                StreamId = Guid.NewGuid(),
                Data     = new RandomEvent {
                    I = 5
                },
                EventDate = DateTime.UtcNow,
                Version   = 1
            };
            var eventTwo = new BuildUpEvent <RandomEvent>
            {
                StreamId = @event.StreamId,
                Data     = new RandomEvent {
                    I = 72
                },
                EventDate = DateTime.UtcNow,
                Version   = 2
            };

            //ACT
            es.PublishEvent(@event);
            es.PublishEvent(eventTwo);
            es.EndStream();
            Thread.Sleep(25);
            //ASSERT
            var projections = await sStorage.GetSnapshots(@event.StreamId);

            var buildUpSnapshots = projections as IBuildUpSnapshot[] ?? projections.ToArray();

            Assert.Single(buildUpSnapshots);
            var projection = (RandomProjection)buildUpSnapshots.First().Snapshot;

            Assert.Equal(72, projection.I);
        }
        public void Dispose_CompletedEventIsRaised()
        {
            // arrange
            var  sent        = new EventMessage("foo", "bar");
            var  eventStream = new InMemoryEventStream();
            bool eventRaised = false;

            eventStream.Completed += (s, e) => eventRaised = true;

            // act
            eventStream.Dispose();

            // assert
            Assert.True(eventRaised);
            Assert.True(eventStream.IsCompleted);
        }
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            using (IServiceScope scope = ServiceScopeFactory.CreateScope())
            {
                IServiceProvider serviceProvider = scope.ServiceProvider;

                IMediator           mediator    = serviceProvider.GetRequiredService <IMediator>();
                InMemoryEventStream eventStream = serviceProvider.GetRequiredService <InMemoryEventStream>();

                EventProcessingLoop eventProcessingLoop = new EventProcessingLoop(
                    stoppingToken,
                    mediator,
                    eventStream
                    );

                await eventProcessingLoop.Run();
            }
        }
        public async Task Dispose_CompletedEventIsRaised()
        {
            // arrange
            using var cts = new CancellationTokenSource(30000);
            var sent        = new EventMessage("foo", "bar");
            var eventStream = new InMemoryEventStream();
            IAsyncEnumerator <IEventMessage> enumerator = eventStream.GetAsyncEnumerator(cts.Token);
            bool eventRaised = false;

            eventStream.Completed += (s, e) => eventRaised = true;

            // act
            await enumerator.DisposeAsync();

            // assert
            Assert.True(eventRaised);
            Assert.False(await enumerator.MoveNextAsync());
        }
        public async Task Events_saved_to_the_in_memory_context_have_their_id_set()
        {
            var eventStream = new InMemoryEventStream();

            using (var db = new InMemoryEventStoreDbContext(eventStream))
            {
                Events.Write(5, createEventStore: () => db);

                await db.SaveChangesAsync();

                Console.WriteLine(db.Events.Count());
            }

            using (var db = new InMemoryEventStoreDbContext(eventStream))
            {
                db.Events
                .Select(e => e.Id)
                .Should()
                .BeEquivalentTo(1L, 2L, 3L, 4L, 5L);
            }
        }
        public async Task Events_in_the_currently_configured_event_stream_can_be_queried_from_the_In_memory_context()
        {
            var aggregateId = Any.Guid();

            var storableEvent = new Order.Created
            {
                CustomerName = Any.FullName(),
                AggregateId = aggregateId
            }.ToStorableEvent();

            var eventStream = new InMemoryEventStream();
            await eventStream.Append(new[] { storableEvent.ToInMemoryStoredEvent() });

            Configuration.Current.UseDependency(_ => eventStream);

            using (var db = new InMemoryEventStoreDbContext())
            {
                var orderCreated = db.Events.Single(e => e.AggregateId == aggregateId);

                orderCreated.Should().NotBeNull();
            }
        }
        public async Task Events_in_the_currently_configured_event_stream_can_be_queried_from_the_In_memory_context()
        {
            var aggregateId = Any.Guid();

            var storableEvent = new Order.Created
            {
                CustomerName = Any.FullName(),
                AggregateId  = aggregateId
            }.ToStorableEvent();

            var eventStream = new InMemoryEventStream();
            await eventStream.Append(new[] { storableEvent.ToInMemoryStoredEvent() });

            Configuration.Current.UseDependency(_ => eventStream);

            using (var db = new InMemoryEventStoreDbContext())
            {
                var orderCreated = db.Events.Single(e => e.AggregateId == aggregateId);

                orderCreated.Should().NotBeNull();
            }
        }
        public async Task Events_can_be_added_to_the_context_and_queried_back()
        {
            var aggregateId = Any.Guid();

            var storableEvent = new Order.Created
            {
                CustomerName = Any.FullName(),
                AggregateId = aggregateId
            }.ToStorableEvent();

            var eventStream = new InMemoryEventStream();

            using (var db = new InMemoryEventStoreDbContext(eventStream))
            {
                db.Events.Add(storableEvent);

                await db.SaveChangesAsync();

                var orderCreated = db.Events.Single(e => e.AggregateId == aggregateId);

                orderCreated.Should().NotBeNull();
            }
        }
        public async Task Events_can_be_added_to_the_context_and_queried_back()
        {
            var aggregateId = Any.Guid();

            var storableEvent = new Order.Created
            {
                CustomerName = Any.FullName(),
                AggregateId  = aggregateId
            }.ToStorableEvent();

            var eventStream = new InMemoryEventStream();

            using (var db = new InMemoryEventStoreDbContext(eventStream))
            {
                db.Events.Add(storableEvent);

                await db.SaveChangesAsync();

                var orderCreated = db.Events.Single(e => e.AggregateId == aggregateId);

                orderCreated.Should().NotBeNull();
            }
        }
        public async Task Events_saved_to_the_in_memory_context_have_their_id_set()
        {
            var eventStream = new InMemoryEventStream();

            using (var db = new InMemoryEventStoreDbContext(eventStream))
            {
                Events.Write(5, createEventStore: () => db);

                await db.SaveChangesAsync();

                Console.WriteLine(db.Events.Count());
            }

            using (var db = new InMemoryEventStoreDbContext(eventStream))
            {
                Console.WriteLine(db.Events.Count());

                db.Events
                  .Select(e => e.Id)
                  .Should()
                  .BeEquivalentTo(1L, 2L, 3L, 4L, 5L);
            }
        }
 public override void SetUp()
 {
     eventStream = new InMemoryEventStream();
     base.SetUp();
 }
 public override void SetUp()
 {
     eventStream = new InMemoryEventStream(AggregateType <Order> .EventStreamName);
     base.SetUp();
 }
Beispiel #19
0
 public InMemoryEventPublisher(InMemoryEventStream eventStream)
 {
     EventStream = eventStream;
 }
 public InMemoryEventPublisherTests()
 {
     fixture        = new Fixture();
     eventStream    = new InMemoryEventStream();
     eventPublisher = new InMemoryEventPublisher(eventStream);
 }