public async Task EventStore_GetByIdObjectAsyncShouldReturnNullIfEvenContainsAndInvalidAggregateType()
        {
            var event1 = new AggregateEvent() { EventType = typeof(TestEvent).AssemblyQualifiedName, AggregateId = Guid.Empty, AggregateIdType = typeof(Guid).ToString(), AggregateType = "SomeRandomAggregateRoot", CreatedOn = DateTime.UtcNow.AddMinutes(-5), Id = Guid.Empty, SerializedEvent = "{}" };
            var event2 = new AggregateEvent() { EventType = typeof(TestEvent).AssemblyQualifiedName, AggregateId = Guid.Empty, AggregateIdType = typeof(Guid).ToString(), AggregateType = "SomeRandomAggregateRoot", CreatedOn = DateTime.UtcNow.AddMinutes(-4), Id = Guid.Empty, SerializedEvent = "{}" };
            var event3 = new AggregateEvent() { EventType = typeof(TestEvent).AssemblyQualifiedName, AggregateId = Guid.Empty, AggregateIdType = typeof(Guid).ToString(), AggregateType = "SomeRandomAggregateRoot", CreatedOn = DateTime.UtcNow.AddMinutes(-3), Id = Guid.Empty, SerializedEvent = "{}" };

            var repo = new Mock<IRepository<AggregateEvent>>();
            repo.Setup(x => x.GetAsync())
                .Returns(Task.FromResult<IQueryable<AggregateEvent>>(
                new List<AggregateEvent>()
                {
                    event1, event2, event3
                }.AsQueryable()))
                .Verifiable();

            var serializationStrategy = new Mock<ISerializationStrategy>();
            serializationStrategy.Setup(x => x.Deserialize("{}", typeof(TestEvent)))
                .Returns(new TestEvent()).Verifiable();
            var aggregateBus = new Mock<IAggregateBus>();

            EventStore.Instance.Configure(repo.Object, serializationStrategy.Object, aggregateBus.Object);

            var result = await EventStore.Instance.GetByIdAsync(Guid.Empty);

            result.Should().BeNull();

            repo.Verify(x => x.GetAsync(), Times.Exactly(1));
            serializationStrategy.Verify(x => x.Deserialize("{}", typeof(TestEvent)), Times.Never);

        }
        public void EventStore_GetByIdObjectAsyncShouldThrowExceptionIfNoAcceptableApplyEventMethodIsFound()
        {
            var event1 = new AggregateEvent() { EventType = typeof(TestEvent).AssemblyQualifiedName, AggregateId = Guid.Empty, AggregateIdType = typeof(Guid).ToString(), AggregateType = typeof(TestAggregateRoot).AssemblyQualifiedName, CreatedOn = DateTime.UtcNow.AddMinutes(-5), Id = Guid.Empty, SerializedEvent = "{}" };
            var event2 = new AggregateEvent() { EventType = typeof(TestEvent2).AssemblyQualifiedName, AggregateId = Guid.Empty, AggregateIdType = typeof(Guid).ToString(), AggregateType = typeof(TestAggregateRoot).AssemblyQualifiedName, CreatedOn = DateTime.UtcNow.AddMinutes(-4), Id = Guid.Empty, SerializedEvent = "{}" };

            var repo = new Mock<IRepository<AggregateEvent>>();
            repo.Setup(x => x.GetAsync())
                .Returns(Task.FromResult<IQueryable<AggregateEvent>>(
                new List<AggregateEvent>()
                {
                    event1, event2
                }.AsQueryable()))
                .Verifiable();

            var serializationStrategy = new Mock<ISerializationStrategy>();
            serializationStrategy.Setup(x => x.Deserialize("{}", typeof(TestEvent)))
                .Returns(new TestEvent()).Verifiable();
            serializationStrategy.Setup(x => x.Deserialize("{}", typeof(TestEvent2)))
                .Returns(new TestEvent2()).Verifiable();
            var aggregateBus = new Mock<IAggregateBus>();

            EventStore.Instance.Configure(repo.Object, serializationStrategy.Object, aggregateBus.Object);

            EventStore.Instance.Awaiting(x => x.GetByIdAsync(Guid.Empty))
                .ShouldThrow<NotImplementedException>();


            repo.Verify(x => x.GetAsync(), Times.Exactly(2));
            serializationStrategy.Verify(x => x.Deserialize("{}", typeof(TestEvent)), Times.Once);
            serializationStrategy.Verify(x => x.Deserialize("{}", typeof(TestEvent2)), Times.Once);

        }
        public async Task EventStore_LatestEventTimestampAsyncShouldUseTheRepoAndReturnDateTimeMinIfNoEventsAreFound()
        {
            var event1 = new AggregateEvent() { EventType = typeof(TestEvent).AssemblyQualifiedName, AggregateId = Guid.Empty, AggregateIdType = typeof(Guid).ToString(), AggregateType = typeof(TestAggregate).AssemblyQualifiedName, CreatedOn = DateTime.UtcNow.AddMinutes(-5), Id = Guid.Empty, SerializedEvent = "{}" };
            var event2 = new AggregateEvent() { EventType = typeof(TestEvent2).AssemblyQualifiedName, AggregateId = Guid.Empty, AggregateIdType = typeof(Guid).ToString(), AggregateType = typeof(TestAggregate).AssemblyQualifiedName, CreatedOn = DateTime.UtcNow.AddMinutes(-4), Id = Guid.Empty, SerializedEvent = "{}" };
            var event3 = new AggregateEvent() { EventType = typeof(TestEvent).AssemblyQualifiedName, AggregateId = Guid.Empty, AggregateIdType = typeof(Guid).ToString(), AggregateType = typeof(TestAggregate).AssemblyQualifiedName, CreatedOn = DateTime.UtcNow.AddMinutes(-3), Id = Guid.Empty, SerializedEvent = "{}" };

            var repo = new Mock<IRepository<AggregateEvent>>();
            repo.Setup(x => x.GetAsync())
                .Returns(Task.FromResult<IQueryable<AggregateEvent>>(
                new List<AggregateEvent>()
                {
                    event1, event2, event3
                }.AsQueryable()))
                .Verifiable();

            var serializationStrategy = new Mock<ISerializationStrategy>();
            var aggregateBus = new Mock<IAggregateBus>();

            EventStore.Instance.Configure(repo.Object, serializationStrategy.Object, aggregateBus.Object);

            var result = await EventStore.Instance.LatestEventTimestampAsync(Guid.NewGuid());

            result.Should().Be(DateTime.MinValue);

            repo.Verify(x => x.GetAsync(), Times.Once);
        }
        public async Task EventStore_GetByIdObjectAsyncShouldReturnDefaultTForNoEvents()
        {
            var event1 = new AggregateEvent() { EventType = typeof(TestEvent).AssemblyQualifiedName, AggregateId = Guid.Empty, AggregateIdType = typeof(Guid).ToString(), AggregateType = typeof(TestAggregateRoot).AssemblyQualifiedName, CreatedOn = DateTime.UtcNow.AddMinutes(-5), Id = Guid.Empty, SerializedEvent = "{}" };
            var event2 = new AggregateEvent() { EventType = typeof(TestEvent).AssemblyQualifiedName, AggregateId = Guid.Empty, AggregateIdType = typeof(Guid).ToString(), AggregateType = typeof(TestAggregateRoot).AssemblyQualifiedName, CreatedOn = DateTime.UtcNow.AddMinutes(-4), Id = Guid.Empty, SerializedEvent = "{}" };
            var event3 = new AggregateEvent() { EventType = typeof(TestEvent).AssemblyQualifiedName, AggregateId = Guid.Empty, AggregateIdType = typeof(Guid).ToString(), AggregateType = typeof(TestAggregateRoot).AssemblyQualifiedName, CreatedOn = DateTime.UtcNow.AddMinutes(-3), Id = Guid.Empty, SerializedEvent = "{}" };

            var repo = new Mock<IRepository<AggregateEvent>>();
            repo.Setup(x => x.GetAsync())
                .Returns(Task.FromResult<IQueryable<AggregateEvent>>(
                new List<AggregateEvent>()
                {
                    event1, event2, event3
                }.AsQueryable()))
                .Verifiable();

            var serializationStrategy = new Mock<ISerializationStrategy>();
            serializationStrategy.Setup(x => x.Deserialize("{}", typeof(TestEvent)))
                .Returns(new TestEvent()).Verifiable();
            var aggregateBus = new Mock<IAggregateBus>();

            EventStore.Instance.Configure(repo.Object, serializationStrategy.Object, aggregateBus.Object);

            var result = await EventStore.Instance.GetByIdAsync(Guid.Empty);

            result.Should().NotBeNull();
            result.Should().BeOfType(typeof(TestAggregateRoot));
            var aggregateRoot = result as TestAggregateRoot;
            aggregateRoot.Should().NotBeNull();
            aggregateRoot.WasApplyEventCalled.Should().BeTrue();

            repo.Verify(x => x.GetAsync(), Times.Exactly(2));
            serializationStrategy.Verify(x => x.Deserialize("{}", typeof(TestEvent)), Times.Exactly(3));

        }
        public async Task EventStore_SaveAsyncShouldUseTheRepo()
        {
            var @event = new AggregateEvent();
            var repo = new Mock<IRepository<AggregateEvent>>();
            repo.Setup(x => x.SaveAsync(@event)).Returns(Task.FromResult<object>(null)).Verifiable();
            var serializationStrategy = new Mock<ISerializationStrategy>();
            var aggregateBus = new Mock<IAggregateBus>();

            EventStore.Instance.Configure(repo.Object, serializationStrategy.Object, aggregateBus.Object);

            await EventStore.Instance.SaveAsync(@event);

            repo.Verify(x => x.SaveAsync(@event), Times.Once);
        }