public async Task CreatedActivitiesShouldAppearInBothElasticAndCosmos(int activitiesToCreate)
        {
            var fixtures = new IntegrityCheckTestFixtures();

            await fixtures.CreateActivities(activitiesToCreate);

            var tasks = new []
            {
                fixtures.AssertAllCreatedActivitiesAppearInCosmos(),
                fixtures.AssertAllCreatedActivitiesAppearInElastic()
            };

            await Task.WhenAll(tasks);
        }
        public void RequiredServicesAreRegisteredInTheRelevantIoCCorrectly()
        {
            var fixtures = new IntegrityCheckTestFixtures();

            fixtures.AssertServiceCanBeConstructed <IElasticClient>(true, true);
            fixtures.AssertServiceCanBeConstructed <ICosmosClient>(true, true);
            fixtures.AssertServiceCanBeConstructed <ICosmosActivityDocumentRepository>(true, true);
            fixtures.AssertServiceCanBeConstructed <IElasticActivityDocumentRepository>(true, true);
            fixtures.AssertServiceCanBeConstructed <IActivitySaver>(true, false);
            fixtures.AssertServiceCanBeConstructed <IActivitiesScan>(false, true);
            fixtures.AssertServiceCanBeConstructed <IActivitiesFix>(false, true);
            fixtures.AssertServiceCanBeConstructed <IDocumentCollectionConfigurator>(true, true);
            fixtures.AssertServiceCanBeConstructed <IActivityDiscrepancyFinder>(false, true);
            fixtures.AssertServiceCanBeConstructed <IntegrityChecker.IntegrityCheck>(false, true);
        }
        public async Task ActivitiesMissingInBothSidesShouldEchoBothWays(int totalActivitiesRequired, int activitiesToRemoveFromCosmos, int activitiesToRemoveFromElastic)
        {
            // arrange
            var fixtures = new IntegrityCheckTestFixtures();

            await fixtures.DeleteAllExistingActivitiesFromElasticAndCosmos();

            await fixtures.CreateActivities(totalActivitiesRequired);

            var randomActivities =
                fixtures.GetRandomPostedActivities(activitiesToRemoveFromCosmos + activitiesToRemoveFromElastic);
            var cosmosDeleted  = randomActivities.Take(activitiesToRemoveFromCosmos).ToArray();
            var elasticDeleted = randomActivities.Skip(activitiesToRemoveFromCosmos).Take(activitiesToRemoveFromElastic).ToArray();

            var deleteTasks = new Task[]
            {
                fixtures.DeleteActivitiesFromCosmos(cosmosDeleted),
                fixtures.DeleteActivitiesFromElastic(elasticDeleted)
            };

            Task.WaitAll(deleteTasks);

            // Action
            var logger = await fixtures.RunIntegrityCheck($"_{totalActivitiesRequired}.{activitiesToRemoveFromCosmos}");

            fixtures.CancellationTokenSource.Cancel();

            // Assert
            await fixtures.AssertAllCreatedActivitiesAppearInCosmos();

            await fixtures.AssertAllCreatedActivitiesAppearInElastic();

            int expectedNumberOfFixes = activitiesToRemoveFromCosmos + activitiesToRemoveFromElastic;
            int actualNumberOfFixes   = logger.FixesApplied;

            Assert.AreEqual(expectedNumberOfFixes, actualNumberOfFixes, "Incorrect number of fixes applied");
        }
        public async Task ActivitiesMissingInCosmosShouldBeRecreatedFromElastic(int totalActivitiesRequired, int activitiesToRemoveFromCosmos)
        {
            // arrange
            var fixtures = new IntegrityCheckTestFixtures();

            await fixtures.DeleteAllExistingActivitiesFromElasticAndCosmos();

            await fixtures.CreateActivities(totalActivitiesRequired);

            await fixtures.DeleteActivitiesFromCosmos(activitiesToRemoveFromCosmos);

            // Act
            var logger = await fixtures.RunIntegrityCheck($"_{totalActivitiesRequired}.{activitiesToRemoveFromCosmos}");

            fixtures.CancellationTokenSource.Cancel();

            // Assert
            await fixtures.AssertAllCreatedActivitiesAppearInCosmos();

            int expectedNumberOfFixes = activitiesToRemoveFromCosmos;
            int actualNumberOfFixes   = logger.FixesApplied;

            Assert.AreEqual(expectedNumberOfFixes, actualNumberOfFixes, "Incorrect number of fixes applied");
        }
        public async Task ActivitiesMissingInElasticShouldNotCauseThoseActivitiesToBeRemovedFromCosmos()
        {
            // arrange
            var fixtures = new IntegrityCheckTestFixtures();

            var deleteTasks = new Task[]
            {
                fixtures.DeleteAllActivitiesFromCosmos(),
                fixtures.DeleteAllActivitiesFromElastic()
            };

            await Task.WhenAll(deleteTasks);

            await fixtures.CreateActivities(50);

            var randomActivities = fixtures.GetRandomPostedActivities(10);
            await fixtures.DeleteActivitiesFromCosmos(randomActivities);

            // Act
            await fixtures.RunIntegrityCheck(null);

            // Assert
            await fixtures.AssertAllCreatedActivitiesAppearInElastic();
        }