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 ShouldSuccesfullyPersistAndHydrateEventsFromAggregate()
        {
            // ARRANGE
            var testAggregate = new TestAggregate(Guid.NewGuid());

            var connectionString    = "Data Source=localhost;Initial Catalog=vanda-db-dev;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
            var sqlEventsRepository = new SqlServerEventRepository(connectionString);

            var aggregateFactory = new DefaultAggregateFactory();

            var repository = new AggregateRepository(sqlEventsRepository, aggregateFactory);

            // ACT
            testAggregate.PublishTestEvent();
            repository.Save(testAggregate);

            var hydratedTestAggregate = repository.GetById <TestAggregate>(testAggregate.Id);

            // ASSERT
            Assert.AreEqual(testAggregate.Id, hydratedTestAggregate.Id);
            Assert.AreEqual(testAggregate.Version, hydratedTestAggregate.Version);
            Assert.AreEqual(testAggregate.State, hydratedTestAggregate.State);
        }