public async Task Should_update_specific_projections()
        {
            // Arrange

            var activeUser = new User(Guid.NewGuid(), "Bryan", "Cranston", new DateTime(1956, 3, 7));

            activeUser.ChangeFirstName("Walter");
            activeUser.ChangeLastName("White");
            activeUser.ChangeFirstName("Walt");
            activeUser.ChangeLastName("Heisenberg");

            var strategy = new MongoProjectionStrategy();

            var documentStore = new MongoProjectionStore(strategy, _fixture.Database);

            var allUserProjection        = new AllUserProjections(documentStore);
            var onlyActiveUserProjection = new OnlyActiveUserProjections(documentStore);

            var projectionProcessor = new ProjectionRebuilder(documentStore, new object[] { allUserProjection, onlyActiveUserProjection });
            var eventStreamReader   = new MongoEventStreamReader(_fixture.Database);
            var stores = new MongoStores(_fixture.Database, projectionProcessor, eventStreamReader);

            var session = SessionHelper.Create(stores, stores);

            await session.AddAsync(activeUser).ConfigureAwait(false);

            await session.SaveChangesAsync().ConfigureAwait(false);

            var reader1 = documentStore.GetReader <Guid, AllUserView>();

            reader1.TryGet(activeUser.Id, out AllUserView view1).Should().BeTrue();

            if (view1 != null)
            {
                view1.Id.Should().Be(activeUser.Id);
                view1.BirthMonth.Should().Be(3);
                view1.BirthYear.Should().Be(1956);
                view1.Fullname.Should().Be("Heisenberg, Walt");
                view1.DeactivatedAt.Should().BeNull();
                view1.Lifetime.Should().BeNull();
            }

            var reader2 = documentStore.GetReader <Guid, ActiveUserView>();

            reader2.TryGet(activeUser.Id, out ActiveUserView view2).Should().BeTrue();

            if (view2 != null)
            {
                view2.Id.Should().Be(activeUser.Id);
            }
        }
        public async Task Should_project_multiples_views()
        {
            // Arrange

            var activeUser = new User(Guid.NewGuid(), "Bryan", "Cranston", new DateTime(1956, 3, 7));

            activeUser.ChangeFirstName("Walter");
            activeUser.ChangeLastName("White");
            activeUser.ChangeFirstName("Walt");
            activeUser.ChangeLastName("Heisenberg");

            var inactiveUser = new User(Guid.NewGuid(), "Aaron Paul", "Sturtevant", new DateTime(1979, 8, 27));

            inactiveUser.ChangeLastName("Bruce Pinkman");
            inactiveUser.ChangeFirstName("Jesse");
            inactiveUser.Deactivate();

            var stores  = new MongoStores(_fixture.Database);
            var session = SessionHelper.Create(stores, stores);

            await session.AddAsync(activeUser).ConfigureAwait(false);

            await session.AddAsync(inactiveUser).ConfigureAwait(false);

            await session.SaveChangesAsync().ConfigureAwait(false);

            var eventStreamReader = new MongoEventStreamReader(_fixture.Database);

            var strategy = new MongoProjectionStrategy();

            var documentStore = new MongoProjectionStore(strategy, _fixture.Database);

            var allUserProjection        = new AllUserProjections(documentStore);
            var onlyActiveUserProjection = new OnlyActiveUserProjections(documentStore);

            // Act

            var projectionProcessor = new ProjectionRebuilder(documentStore, new object[] { allUserProjection, onlyActiveUserProjection });

            await projectionProcessor.RebuildAsync(eventStreamReader).ConfigureAwait(false);

            // Assert

            var tempCollection = _fixture.Database.GetCollection <BsonDocument>(_fixture.Settings.TempProjectionsCollectionName);
            var collection     = _fixture.Database.GetCollection <BsonDocument>(_fixture.Settings.ProjectionsCollectionName);

            var filterBuilder = new FilterDefinitionBuilder <BsonDocument>();
            var filter        = filterBuilder.In("_t", new[] { nameof(AllUserView), nameof(ActiveUserView) });

            tempCollection.Count(filter).Should().Be(3);
            collection.Count(filter).Should().Be(3);

            var reader1 = documentStore.GetReader <Guid, AllUserView>();

            reader1.TryGet(activeUser.Id, out AllUserView view1).Should().BeTrue();

            if (view1 != null)
            {
                view1.Id.Should().Be(activeUser.Id);
                view1.BirthMonth.Should().Be(3);
                view1.BirthYear.Should().Be(1956);
                view1.Fullname.Should().Be("Heisenberg, Walt");
                view1.DeactivatedAt.Should().BeNull();
                view1.Lifetime.Should().BeNull();
            }

            reader1.TryGet(inactiveUser.Id, out view1).Should().BeTrue();

            if (view1 != null)
            {
                view1.Id.Should().Be(inactiveUser.Id);
                view1.BirthMonth.Should().Be(8);
                view1.BirthYear.Should().Be(1979);
                view1.Fullname.Should().Be("Bruce Pinkman, Jesse");
                view1.DeactivatedAt.Should().NotBeNull();
                view1.Lifetime.Should().NotBeNull();
            }

            var reader2 = documentStore.GetReader <Guid, ActiveUserView>();

            reader2.TryGet(activeUser.Id, out ActiveUserView view2).Should().BeTrue();

            if (view2 != null)
            {
                view2.Id.Should().Be(activeUser.Id);
            }

            reader2.TryGet(inactiveUser.Id, out view2).Should().BeFalse();
        }