public void ShouldComposeSnapshotOfExactNumberOfEvents()
        {
            // ARRANGE
            var eventRepository    = new SqliteEventRepository(_connectionString);
            var snapshotRepository = new SqliteSnapshotEventRepository(_connectionString);

            var factory        = new DefaultAggregateFactory();
            var aggregateStore = new AggregateRepository(eventRepository, factory, snapshotRepository);

            // Create a test aggregate.
            var aggregateId = CombGuid.Generate();
            var aggregate   = aggregateStore.GetById <IncrementingAggregate>(aggregateId);

            var snapshotSize       = aggregate.SnapshotSize;
            var numberOfTestEvents = 2 * snapshotSize + 1;

            // Send test events to the aggregate.
            Enumerable.Range(1, numberOfTestEvents)
            .ToList()
            .ForEach(x => aggregate.Tell(new IncrementingAggregate.Increment()));

            // ACT
            var orderedEvents   = aggregateStore.Save(aggregate);
            var snapshotVersion = snapshotRepository.GetVersionByAggregateId(aggregateId);
            var snapshotOffer   = (SnapshotOffer)snapshotRepository
                                  .GetSnapshotEventByAggregateIdAndVersion(aggregateId, snapshotVersion ?? 0);
            var newAggregate = aggregateStore.GetById <IncrementingAggregate>(aggregateId);
            var newState     = newAggregate.Ask <int>(new IncrementingAggregate.GetValue());

            // ASSERT
            Assert.AreEqual(numberOfTestEvents, orderedEvents.Length);
            Assert.AreEqual(numberOfTestEvents - 1, snapshotOffer.Version);
            Assert.AreEqual(numberOfTestEvents - 1, snapshotOffer.State);
            Assert.AreEqual(numberOfTestEvents, newState);
        }
        public void ShouldGetEvents()
        {
            // ARRANGE
            var repository = new SqliteEventRepository(_connectionString);

            // ACT
            var orderedEvents = repository.GetEventsByAggregateId(_aggregateId);

            // ASSERT
        }
        public void ShouldClearEvents()
        {
            // ARRANGE
            var repository = new SqliteEventRepository(_connectionString);

            // ACT
            repository.ClearEvents();

            // ASSERT
        }
        public void ShouldSaveEvents()
        {
            // ARRANGE
            var repository = new SqliteEventRepository(_connectionString);

            var testEvent = new SqliteTestEvent
            {
                DummyPayload = "Hello, World!",
            };

            var e = testEvent.ToEventData("TestAggregate", _aggregateId, 1);

            // ACT
            var events = repository.SaveEvents(new[] { e });

            // ASSERT
            Assert.AreEqual(1, events.Length);
            Assert.AreNotEqual(0, events.First().Ordering);
        }
        public void ShouldSaveMultipleEvents()
        {
            // ARRANGE
            var repository = new SqliteEventRepository(_connectionString);

            var testEvent = new SqliteTestEvent
            {
                DummyPayload = "Hello, World!",
            };

            const int numberOfEvents = 100;

            var eventsToSave = Enumerable.Range(1, numberOfEvents)
                               .Select(x => testEvent.ToEventData("TestAggregate", _aggregateId, x))
                               .ToArray();

            // ACT
            var events = repository.SaveEvents(eventsToSave);

            // ASSERT
            Assert.AreEqual(numberOfEvents, events.Length);
            Assert.IsFalse(events.Any(x => x.Ordering == 0));
            Assert.AreEqual(numberOfEvents, events.Select(x => x.Ordering).Distinct().Count());
        }