public async Task GetJobDetails_ReturnsJobViewModel()
        {
            IJobsApiClient jobsApiClient             = Substitute.For <IJobsApiClient>();
            JobManagementResiliencePolicies policies = new JobManagementResiliencePolicies
            {
                JobsApiClient = Policy.NoOpAsync()
            };
            IMessengerService messengerService = Substitute.For <IMessengerService>();
            ILogger           logger           = Substitute.For <ILogger>();

            JobViewModel jvm = new JobViewModel
            {
                CompletionStatus = null
            };

            ApiResponse <JobViewModel> jobApiResponse = new ApiResponse <JobViewModel>(HttpStatusCode.OK, jvm);

            jobsApiClient
            .GetJobById(Arg.Any <string>())
            .Returns(jobApiResponse);

            JobManagement jobManagement = new JobManagement(jobsApiClient, logger, policies, messengerService);

            string jobId = "3456";

            //Act
            JobViewModel viewModel = await jobManagement.GetJobById(jobId);

            //Assert
            viewModel
            .Should()
            .Be(jvm);
        }
        public async Task AddJobLog_Called_ReturnsJobLog()
        {
            string jobId = "5678";

            IJobsApiClient jobsApiClient             = Substitute.For <IJobsApiClient>();
            JobManagementResiliencePolicies policies = new JobManagementResiliencePolicies
            {
                JobsApiClient = Policy.NoOpAsync()
            };
            IMessengerService messengerService = Substitute.For <IMessengerService>();
            ILogger           logger           = Substitute.For <ILogger>();

            JobLog jobLog = new JobLog
            {
                JobId = jobId
            };
            ApiResponse <JobLog> jobLogApiResponse = new ApiResponse <JobLog>(HttpStatusCode.OK, jobLog);

            JobLogUpdateModel jobLogUpdateModel = new JobLogUpdateModel();

            jobsApiClient
            .AddJobLog(jobId, jobLogUpdateModel)
            .Returns(jobLogApiResponse);

            JobManagement jobManagement = new JobManagement(jobsApiClient, logger, policies, messengerService);

            //Act
            JobLog result = await jobManagement.AddJobLog(jobId, jobLogUpdateModel);

            Assert.AreEqual(result, jobLog);

            await jobsApiClient
            .Received(1)
            .AddJobLog(jobId, jobLogUpdateModel);
        }
        public async Task UpdateJobStatusInternal_ApiResponseFailure_Logs(ApiResponse <JobLog> jobLogApiResponse)
        {
            //Arrange
            IJobsApiClient jobsApiClient             = Substitute.For <IJobsApiClient>();
            JobManagementResiliencePolicies policies = new JobManagementResiliencePolicies
            {
                JobsApiClient = Policy.NoOpAsync()
            };
            IMessengerService messengerService = Substitute.For <IMessengerService>();
            ILogger           logger           = Substitute.For <ILogger>();

            jobsApiClient
            .AddJobLog(Arg.Any <string>(), Arg.Any <JobLogUpdateModel>())
            .Returns(jobLogApiResponse);

            JobLogUpdateModel updateModel = new JobLogUpdateModel();

            JobManagement jobManagement = new JobManagement(jobsApiClient, logger, policies, messengerService);

            string jobId = "3456";

            //Act
            await jobManagement.UpdateJobStatus(jobId, updateModel);

            //Assert
            await jobsApiClient
            .Received(1)
            .AddJobLog(jobId, updateModel);

            logger
            .Received(1)
            .Write(LogEventLevel.Error, $"Failed to add a job log for job id '{jobId}'");
        }
        public async Task UpdateJobStatus_ApiResponseSuccess_Runs()
        {
            //Arrange
            IJobsApiClient jobsApiClient             = Substitute.For <IJobsApiClient>();
            JobManagementResiliencePolicies policies = new JobManagementResiliencePolicies
            {
                JobsApiClient = Policy.NoOpAsync()
            };
            IMessengerService messengerService = Substitute.For <IMessengerService>();
            ILogger           logger           = Substitute.For <ILogger>();

            ApiResponse <JobLog> jobLogApiResponse = new ApiResponse <JobLog>(HttpStatusCode.OK, new JobLog());

            jobsApiClient
            .AddJobLog(Arg.Any <string>(), Arg.Any <JobLogUpdateModel>())
            .Returns(jobLogApiResponse);

            JobLogUpdateModel updateModel = new JobLogUpdateModel();

            JobManagement jobManagement = new JobManagement(jobsApiClient, logger, policies, messengerService);

            string jobId = "3456";

            //Act
            await jobManagement.UpdateJobStatus(jobId, updateModel);

            //Assert
            await jobsApiClient
            .Received(1)
            .AddJobLog(jobId, updateModel);

            logger
            .Received(0)
            .Write(Arg.Any <LogEventLevel>(), Arg.Any <string>());
        }
コード例 #5
0
        public async Task RetrieveJobAndCheckCanBeProcessed_ApiReturnsIncomplete_ReturnsCorrectly()
        {
            //Arrange
            var jobsApiClient = Substitute.For <IJobsApiClient>();
            var policies      = new JobManagementResiliencePolicies {
                JobsApiClient = Policy.NoOpAsync()
            };
            var logger = Substitute.For <ILogger>();

            var jvm = new JobViewModel {
                CompletionStatus = null
            };

            var jobApiResponse = new ApiResponse <JobViewModel>(HttpStatusCode.OK, jvm);

            jobsApiClient
            .GetJobById(Arg.Any <string>())
            .Returns(jobApiResponse);

            var jobManagement = new JobManagement(jobsApiClient, logger, policies);

            var jobId = "3456";

            //Act
            var viewModel = await jobManagement.RetrieveJobAndCheckCanBeProcessed(jobId);

            //Assert
            await jobsApiClient
            .Received(1)
            .GetJobById(jobId);

            viewModel
            .Should()
            .Be(jvm);
        }
コード例 #6
0
        public async Task RetrieveJobAndCheckCanBeProcessed_Fails_LogsAndErrors(ApiResponse <JobViewModel> jobApiResponse,
                                                                                string jobId,
                                                                                string errorMessage,
                                                                                LogEventLevel logEventLevel)
        {
            //Arrange
            var jobsApiClient = Substitute.For <IJobsApiClient>();
            var policies      = new JobManagementResiliencePolicies {
                JobsApiClient = Policy.NoOpAsync()
            };
            var logger = Substitute.For <ILogger>();

            jobsApiClient
            .GetJobById(Arg.Any <string>())
            .Returns(jobApiResponse);

            var jobManagement = new JobManagement(jobsApiClient, logger, policies);

            Func <Task> test = async() => await jobManagement.RetrieveJobAndCheckCanBeProcessed(jobId);

            test
            .Should().Throw <Exception>()
            .Which
            .Message
            .Should().Be(errorMessage);

            await jobsApiClient
            .Received(1)
            .GetJobById(jobId);

            logger
            .Received(1)
            .Write(logEventLevel, errorMessage);
        }
        public async Task WaitForJobsToCompleteWithJobsFailed_ReturnsFalse(bool useServiceBus)
        {
            IJobsApiClient jobsApiClient             = Substitute.For <IJobsApiClient>();
            JobManagementResiliencePolicies policies = new JobManagementResiliencePolicies
            {
                JobsApiClient = Policy.NoOpAsync()
            };

            IMessengerService messengerService = null;

            if (useServiceBus)
            {
                messengerService = Substitute.For <IMessengerService, IServiceBusService>();
            }
            else
            {
                messengerService = Substitute.For <IMessengerService, IQueueService>();
            }

            ILogger logger = Substitute.For <ILogger>();

            JobManagement jobManagement = new JobManagement(jobsApiClient, logger, policies, messengerService);

            string jobId = "3456";

            jobsApiClient
            .GetLatestJobsForSpecification("specificationId", Arg.Is <string[]>(_ => _.Single() == "PopulateScopedProviders"))
            .Returns(new ApiResponse <IDictionary <string, JobSummary> >(HttpStatusCode.OK, new Dictionary <string, JobSummary> {
                { string.Empty, new JobSummary {
                      RunningStatus = RunningStatus.Completed, CompletionStatus = CompletionStatus.Failed, JobId = jobId
                  } }
            }));

            messengerService
            .ReceiveMessage("topic/Subscriptions/correlationId", Arg.Any <Predicate <JobSummary> >(), TimeSpan.FromMilliseconds(600000))
            .Returns(new JobSummary
            {
                CompletionStatus = CompletionStatus.Failed
            });

            //Act
            bool jobsComplete = await jobManagement.QueueJobAndWait(async() => await Task.Run(() => { return(true); }), "PopulateScopedProviders", "specificationId", "correlationId", "topic");

            //Assert
            if (useServiceBus)
            {
                await((IServiceBusService)messengerService)
                .Received(1)
                .CreateSubscription("topic", "correlationId", Arg.Is <TimeSpan>(_ => _.Days == 1));

                await messengerService
                .Received(1)
                .ReceiveMessage("topic/Subscriptions/correlationId", Arg.Any <Predicate <JobSummary> >(), TimeSpan.FromMilliseconds(600000));
            }

            jobsComplete
            .Should()
            .BeFalse();
        }
        public async Task TryQueueJobs_Called_ReturnsJobCreateResults()
        {
            IJobsApiClient jobsApiClient             = Substitute.For <IJobsApiClient>();
            JobManagementResiliencePolicies policies = new JobManagementResiliencePolicies
            {
                JobsApiClient = Policy.NoOpAsync()
            };
            IMessengerService messengerService = Substitute.For <IMessengerService>();
            ILogger           logger           = Substitute.For <ILogger>();

            JobCreateModel createModelOne = new JobCreateModel();
            JobCreateModel createModelTwo = new JobCreateModel();

            JobCreateResult expectedCreateResultOne = new JobCreateResult();
            JobCreateResult expectedCreateResultTwo = new JobCreateResult();

            IEnumerable <JobCreateModel> createModels =
                new []
            {
                createModelOne,
                createModelTwo
            };

            jobsApiClient
            .TryCreateJobs(Arg.Is <IEnumerable <JobCreateModel> >(_ => _.SequenceEqual(createModels)))
            .Returns(new ApiResponse <IEnumerable <JobCreateResult> >(HttpStatusCode.OK, new[]
            {
                expectedCreateResultOne,
                expectedCreateResultTwo
            }));

            JobManagement jobManagement = new JobManagement(jobsApiClient, logger, policies, messengerService);

            //Act
            IEnumerable <JobCreateResult> actualResult = await jobManagement.TryQueueJobs(createModels);

            actualResult
            .Should()
            .BeEquivalentTo <JobCreateResult>(new []
            {
                expectedCreateResultOne,
                expectedCreateResultTwo
            });
        }
        public async Task QueueJobs_Called_ReturnsJobs()
        {
            string specificationId = "1234";
            string jobId           = "3456";

            IJobsApiClient jobsApiClient             = Substitute.For <IJobsApiClient>();
            JobManagementResiliencePolicies policies = new JobManagementResiliencePolicies
            {
                JobsApiClient = Policy.NoOpAsync()
            };
            IMessengerService messengerService = Substitute.For <IMessengerService>();
            ILogger           logger           = Substitute.For <ILogger>();

            IEnumerable <Job> jobApiResponse = new List <Job>
            {
                new Job
                {
                    Id = jobId
                }
            };

            IEnumerable <JobCreateModel> jobCreateModel =
                new List <JobCreateModel>
            {
                new JobCreateModel
                {
                    SpecificationId = specificationId
                }
            };

            jobsApiClient
            .CreateJobs(jobCreateModel)
            .Returns(jobApiResponse);

            JobManagement jobManagement = new JobManagement(jobsApiClient, logger, policies, messengerService);

            //Act
            await jobManagement.QueueJobs(jobCreateModel);

            await jobsApiClient
            .Received(1)
            .CreateJobs(jobCreateModel);
        }
コード例 #10
0
        public async Task GetNonCompletedJobsWithinTimeFrame_Called_ReturnsJobSummaries()
        {
            string jobId = "5678";

            DateTimeOffset from = DateTimeOffset.UtcNow.AddDays(-2);
            DateTimeOffset to   = DateTimeOffset.UtcNow.AddDays(-1);

            IJobsApiClient jobsApiClient             = Substitute.For <IJobsApiClient>();
            JobManagementResiliencePolicies policies = new JobManagementResiliencePolicies
            {
                JobsApiClient = Policy.NoOpAsync()
            };
            IMessengerService messengerService = Substitute.For <IMessengerService>();
            ILogger           logger           = Substitute.For <ILogger>();


            JobSummary jobSummary = new JobSummary
            {
                JobId = jobId
            };
            IEnumerable <JobSummary> jobSummaries = new List <JobSummary>
            {
                jobSummary
            };
            ApiResponse <IEnumerable <JobSummary> > jobSummariesApiResponse
                = new ApiResponse <IEnumerable <JobSummary> >(HttpStatusCode.OK, jobSummaries);

            jobsApiClient
            .GetNonCompletedJobsWithinTimeFrame(from, to)
            .Returns(jobSummariesApiResponse);

            JobManagement jobManagement = new JobManagement(jobsApiClient, logger, policies, messengerService);

            //Act
            IEnumerable <JobSummary> result = await jobManagement.GetNonCompletedJobsWithinTimeFrame(from, to);

            Assert.AreEqual(result, jobSummaries);

            await jobsApiClient
            .Received(1)
            .GetNonCompletedJobsWithinTimeFrame(from, to);
        }
コード例 #11
0
        public async Task GetLatestJobForSpecification_Called_ReturnsJobSummary()
        {
            string specificationId = "1234";
            string jobType         = "3456";
            string jobId           = "5678";

            IJobsApiClient jobsApiClient             = Substitute.For <IJobsApiClient>();
            JobManagementResiliencePolicies policies = new JobManagementResiliencePolicies
            {
                JobsApiClient = Policy.NoOpAsync()
            };
            IMessengerService messengerService = Substitute.For <IMessengerService>();
            ILogger           logger           = Substitute.For <ILogger>();

            string[] jobTypes = new string[]
            {
                jobType
            };

            IDictionary <string, JobSummary> jobSummary = new Dictionary <string, JobSummary> {
                { string.Empty, new JobSummary {
                      JobId = jobId
                  } }
            };
            ApiResponse <IDictionary <string, JobSummary> > jobSummaryApiResponse = new ApiResponse <IDictionary <string, JobSummary> >(HttpStatusCode.OK, jobSummary);

            jobsApiClient
            .GetLatestJobsForSpecification(specificationId, jobTypes)
            .Returns(jobSummaryApiResponse);

            JobManagement jobManagement = new JobManagement(jobsApiClient, logger, policies, messengerService);

            //Act
            IDictionary <string, JobSummary> result = await jobManagement.GetLatestJobsForSpecification(specificationId, jobTypes);

            Assert.AreEqual(result, jobSummary);

            await jobsApiClient
            .Received(1)
            .GetLatestJobsForSpecification(specificationId, jobTypes);
        }
コード例 #12
0
        public void GetLatestJobForSpecification_UnsuccessfulApiResponse_ThrowsJobsNotRetrievedException()
        {
            string specificationId = "1234";
            string jobType         = "3456";

            IJobsApiClient jobsApiClient             = Substitute.For <IJobsApiClient>();
            JobManagementResiliencePolicies policies = new JobManagementResiliencePolicies
            {
                JobsApiClient = Policy.NoOpAsync()
            };
            IMessengerService messengerService = Substitute.For <IMessengerService>();
            ILogger           logger           = Substitute.For <ILogger>();

            string[] jobTypes = new string[]
            {
                jobType
            };

            string message = $"Error while retrieving latest jobs for Specifiation: {specificationId} and JobTypes: {string.Join(',', jobTypes)}";

            ApiResponse <IDictionary <string, JobSummary> > jobSummaryApiResponse = new ApiResponse <IDictionary <string, JobSummary> >(HttpStatusCode.BadRequest);

            jobsApiClient
            .GetLatestJobsForSpecification(specificationId, jobTypes)
            .Returns(jobSummaryApiResponse);

            JobManagement jobManagement = new JobManagement(jobsApiClient, logger, policies, messengerService);

            //Act
            Func <Task> invocation = async() => await jobManagement.GetLatestJobsForSpecification(specificationId, jobTypes);

            //Arrange
            invocation.Should()
            .Throw <JobsNotRetrievedException>()
            .WithMessage(message);
        }
コード例 #13
0
        public async Task WaitForJobsToCompleteWithNoJobsRunning_ReturnsTrue()
        {
            IJobsApiClient jobsApiClient             = Substitute.For <IJobsApiClient>();
            JobManagementResiliencePolicies policies = new JobManagementResiliencePolicies
            {
                JobsApiClient = Policy.NoOpAsync()
            };
            IMessengerService messengerService = Substitute.For <IMessengerService>();
            ILogger           logger           = Substitute.For <ILogger>();

            JobManagement jobManagement = new JobManagement(jobsApiClient, logger, policies, messengerService);

            jobsApiClient
            .GetLatestJobsForSpecification("specificationId", Arg.Is <string[]>(_ => _.Single() == "PopulateScopedProviders"))
            .Returns(new ApiResponse <IDictionary <string, JobSummary> >(HttpStatusCode.NoContent));

            //Act
            bool jobsComplete = await jobManagement.QueueJobAndWait(async() => await Task.Run(() => { return(true); }), "PopulateScopedProviders", "specificationId", "correlationId", "topic");

            //Assert
            jobsComplete
            .Should()
            .BeTrue();
        }
        public void SetupStepContexts()
        {
            PublishingResiliencePolicies publishingResiliencePolicies = new PublishingResiliencePolicies()
            {
                BlobClient                           = Policy.NoOpAsync(),
                CalculationsApiClient                = Policy.NoOpAsync(),
                FundingFeedSearchRepository          = Policy.NoOpAsync(),
                JobsApiClient                        = Policy.NoOpAsync(),
                PoliciesApiClient                    = Policy.NoOpAsync(),
                ProfilingApiClient                   = Policy.NoOpAsync(),
                ProvidersApiClient                   = Policy.NoOpAsync(),
                PublishedFundingBlobRepository       = Policy.NoOpAsync(),
                PublishedFundingRepository           = Policy.NoOpAsync(),
                PublishedProviderVersionRepository   = Policy.NoOpAsync(),
                CalculationResultsRepository         = Policy.NoOpAsync(),
                SpecificationsRepositoryPolicy       = Policy.NoOpAsync(),
                SpecificationsApiClient              = Policy.NoOpAsync(),
                PublishedProviderSearchRepository    = Policy.NoOpAsync(),
                PublishedIndexSearchResiliencePolicy = Policy.NoOpAsync(),
                CacheProvider                        = Policy.NoOpAsync()
            };

            RegisterInstanceAs <ILogger>(new LoggerConfiguration().CreateLogger());
            RegisterInstanceAs <IPublishingResiliencePolicies>(publishingResiliencePolicies);
            RegisterInstanceAs <IConfiguration>(new ConfigurationBuilder().Build());

            RegisterTypeAs <InMemoryBlobClient, IBlobClient>();
            RegisterTypeAs <InMemoryAzureBlobClient, Services.Core.Interfaces.AzureStorage.IBlobClient>();
            RegisterTypeAs <InMemoryCosmosRepository, ICosmosRepository>();
            RegisterTypeAs <SpecificationInMemoryRepository, ISpecificationService>();
            RegisterTypeAs <JobsInMemoryRepository, IJobsApiClient>();
            RegisterTypeAs <InMemoryFeatureManagerSnapshot, IFeatureManagerSnapshot>();
            RegisterTypeAs <PublishedProviderInMemorySearchRepository, ISearchRepository <PublishedProviderIndex> >();
            RegisterTypeAs <ReApplyCustomProfiles, IReApplyCustomProfiles>();
            RegisterTypeAs <ReProfilingResponseMapper, IReProfilingResponseMapper>();
            RegisterTypeAs <ReProfilingRequestBuilder, IReProfilingRequestBuilder>();

            IMapper mapper = new MapperConfiguration(c =>
            {
                c.AddProfile <PublishingServiceMappingProfile>();
            }).CreateMapper();

            RegisterInstanceAs(mapper);

            JobManagementResiliencePolicies jobManagementResiliencePolicies = new JobManagementResiliencePolicies()
            {
                JobsApiClient = Policy.NoOpAsync(),
            };

            RegisterInstanceAs <IJobManagementResiliencePolicies>(jobManagementResiliencePolicies);
            RegisterTypeAs <JobTracker, IJobTracker>();
            RegisterTypeAs <JobManagement, IJobManagement>();
            RegisterTypeAs <InMemoryPublishedFundingRepository, IPublishedFundingRepository>();
            RegisterTypeAs <InMemoryPublishedFundingBulkRepository, IPublishedFundingBulkRepository>();
            RegisterTypeAs <PoliciesInMemoryRepository, IPoliciesApiClient>();
            RegisterTypeAs <InMemoryCacheProvider, ICacheProvider>();
            RegisterTypeAs <InMemoryMessengerService, IMessengerService>();

            ProvidersInMemoryClient providersInMemoryClient = new ProvidersInMemoryClient(mapper);

            RegisterInstanceAs <IProvidersApiClient>(providersInMemoryClient);
            RegisterTypeAs <ProviderService, IProviderService>();
            RegisterTypeAs <PublishedFundingService, IPublishedFundingService>();
            RegisterTypeAs <PoliciesService, IPoliciesService>();
            RegisterTypeAs <VariationService, IVariationService>();
            RegisterTypeAs <PublishedFundingDateService, IPublishedFundingDateService>();
            RegisterTypeAs <PublishServiceAcceptanceStepContext, IPublishFundingStepContext>();
            RegisterTypeAs <CurrentSpecificationStepContext, ICurrentSpecificationStepContext>();
            RegisterTypeAs <JobStepContext, IJobStepContext>();
            RegisterTypeAs <CurrentJobStepContext, ICurrentJobStepContext>();
            RegisterTypeAs <PublishedFundingRepositoryStepContext, IPublishedFundingRepositoryStepContext>();
            RegisterTypeAs <PoliciesStepContext, IPoliciesStepContext>();
            RegisterTypeAs <LoggerStepContext, ILoggerStepContext>();
            RegisterTypeAs <ProvidersStepContext, IProvidersStepContext>();
            RegisterTypeAs <PublishingDatesStepContext, IPublishingDatesStepContext>();
            RegisterTypeAs <PublishedFundingResultStepContext, IPublishedFundingResultStepContext>();
            RegisterTypeAs <PublishedProviderStepContext, IPublishedProviderStepContext>();
            RegisterTypeAs <ProfilingService, IProfilingService>();
            RegisterTypeAs <ProfilingInMemoryClient, IProfilingApiClient>();
            RegisterTypeAs <FDZInMemoryClient, IFundingDataZoneApiClient>();
            RegisterTypeAs <PublishedFundingDataService, IPublishedFundingDataService>();
            RegisterTypeAs <PublishedFundingVersionDataService, IPublishedFundingVersionDataService>();
            RegisterTypeAs <CalculationResultsService, ICalculationResultsService>();
            RegisterTypeAs <PublishingEngineOptions, IPublishingEngineOptions>();
            RegisterTypeAs <PublishedProviderVersionInMemoryRepository, IVersionRepository <PublishedProviderVersion> >();
            RegisterTypeAs <PublishedProviderVersionBulkInMemoryRepository, IVersionBulkRepository <PublishedProviderVersion> >();
            RegisterTypeAs <PublishedFundingVersionInMemoryRepository, IVersionRepository <PublishedFundingVersion> >();
            RegisterTypeAs <PublishedFundingVersionBulkInMemoryRepository, IVersionBulkRepository <PublishedFundingVersion> >();
            RegisterTypeAs <PublishedProviderDataGenerator, IPublishedProviderDataGenerator>();
            RegisterTypeAs <PublishedFundingStatusUpdateService, IPublishedFundingStatusUpdateService>();
            RegisterTypeAs <SpecificationFundingStatusService, ISpecificationFundingStatusService>();

            RegisterTypeAs <OrganisationGroupGenerator, IOrganisationGroupGenerator>();
            RegisterTypeAs <PublishedFundingChangeDetectorService, IPublishedFundingChangeDetectorService>();
            RegisterTypeAs <PublishedProviderVersionService, IPublishedProviderVersionService>();
            RegisterTypeAs <PublishedFundingInMemorySearchRepository, ISearchRepository <PublishedFundingIndex> >();

            RegisterTypeAs <GeneratePublishedFundingCsvJobCreation, ICreateGeneratePublishedFundingCsvJobs>();
            RegisterTypeAs <CreateGeneratePublishedProviderEstateCsvJobs, ICreateGeneratePublishedProviderEstateCsvJobs>();
            RegisterTypeAs <PublishIntegrityCheckJobCreation, ICreatePublishIntegrityJob>();
            RegisterTypeAs <CurrentCorrelationStepContext, ICurrentCorrelationStepContext>();

            IGeneratePublishedFundingCsvJobsCreation[] generatePublishedFundingCsvJobsCreations =
                typeof(IGeneratePublishedFundingCsvJobsCreation).Assembly.GetTypes()
                .Where(_ => _.Implements(typeof(IGeneratePublishedFundingCsvJobsCreation)) &&
                       !_.IsAbstract)
                .Select(_ => (IGeneratePublishedFundingCsvJobsCreation)Activator.CreateInstance(_,
                                                                                                ResolveInstance <ICreateGeneratePublishedFundingCsvJobs>(),
                                                                                                ResolveInstance <ICreateGeneratePublishedProviderEstateCsvJobs>()))
                .ToArray();
            RegisterInstanceAs <IGeneratePublishedFundingCsvJobsCreationLocator>(new GeneratePublishedFundingCsvJobsCreationLocator(generatePublishedFundingCsvJobsCreations));


            RegisterInstanceAs <IOrganisationGroupResiliencePolicies>(new OrganisationGroupResiliencePolicies
            {
                ProvidersApiClient = Policy.NoOpAsync()
            });

            RegisterTypeAs <OrganisationGroupTargetProviderLookup, IOrganisationGroupTargetProviderLookup>();

            IDetectPublishedProviderErrors[] detectorStrategies = typeof(PublishedProviderErrorDetector).Assembly.GetTypes()
                                                                  .Where(_ => _.Implements(typeof(PublishedProviderErrorDetector)))
                                                                  .Select(_ => (PublishedProviderErrorDetector)_objectContainer.Resolve(_))
                                                                  .ToArray();

            RegisterInstanceAs <IErrorDetectionStrategyLocator>(new ErrorDetectionStrategyLocator(detectorStrategies));
            RegisterTypeAs <PublishedProviderErrorDetection, IPublishedProviderErrorDetection>();

            PublishedProviderContentsGeneratorResolver providerContentsGeneratorResolver = new PublishedProviderContentsGeneratorResolver();

            providerContentsGeneratorResolver.Register("1.0", new PublishedProviderContentsGenerator());
            RegisterInstanceAs <IPublishedProviderContentsGeneratorResolver>(providerContentsGeneratorResolver);

            RegisterTypeAs <FundingLineTotalAggregator, IFundingLineTotalAggregator>();
            RegisterTypeAs <CalculationInMemoryRepository, ICalculationResultsRepository>();
            RegisterTypeAs <PublishedProviderStatusUpdateService, IPublishedProviderStatusUpdateService>();
            RegisterTypeAs <PublishedProviderStatusUpdateSettings, IPublishedProviderStatusUpdateSettings>();

            IVariationStrategy[] variationStrategies = typeof(IVariationStrategy).Assembly.GetTypes()
                                                       .Where(_ => _.Implements(typeof(IVariationStrategy)))
                                                       .Select(_ => (IVariationStrategy)_objectContainer.Resolve(_))
                                                       .ToArray();

            RegisterInstanceAs <IVariationStrategyServiceLocator>(new VariationStrategyServiceLocator(variationStrategies));

            RegisterTypeAs <ProviderVariationsDetection, IDetectProviderVariations>();
            RegisterTypeAs <SpecificationsInMemoryClient, ISpecificationsApiClient>();
            RegisterTypeAs <ProviderVariationsApplication, IApplyProviderVariations>();
            RegisterTypeAs <VariationServiceStepContext, IVariationServiceStepContext>();
            RegisterTypeAs <CalculationsInMemoryClient, ICalculationsApiClient>();
            RegisterTypeAs <CalculationPrerequisiteCheckerService, ICalculationPrerequisiteCheckerService>();
            RegisterTypeAs <JobsRunning, IJobsRunning>();
            RegisterTypeAs <SpecificationFundingStatusService, ISpecificationFundingStatusService>();
            RegisterTypeAs <CalculationPrerequisiteCheckerService, ICalculationPrerequisiteCheckerService>();
            RegisterTypeAs <RefreshPrerequisiteChecker, IPrerequisiteChecker>();
            RegisterTypeAs <PublishAllPrerequisiteChecker, IPrerequisiteChecker>();
            RegisterTypeAs <PublishBatchPrerequisiteChecker, IPrerequisiteChecker>();
            RegisterTypeAs <ApproveAllProvidersPrerequisiteChecker, IPrerequisiteChecker>();
            RegisterTypeAs <ApproveBatchProvidersPrerequisiteChecker, IPrerequisiteChecker>();

            IPrerequisiteChecker[] prerequisiteCheckers = typeof(IPrerequisiteChecker).Assembly.GetTypes()
                                                          .Where(_ => _.Implements(typeof(IPrerequisiteChecker)))
                                                          .Select(_ => (IPrerequisiteChecker)_objectContainer.Resolve(_))
                                                          .ToArray();

            RegisterInstanceAs <IPrerequisiteCheckerLocator>(new PrerequisiteCheckerLocator(prerequisiteCheckers));

            RegisterTypeAs <GenerateCsvJobsInMemoryClient, IGeneratePublishedFundingCsvJobsCreation>();

            PublishedFundingIdGeneratorResolver idGeneratorResolver = new PublishedFundingIdGeneratorResolver();

            idGeneratorResolver.Register("1.0", new PublishedFundingIdGenerator());
            RegisterTypeAs <PublishedFundingGenerator, IPublishedFundingGenerator>();

            RegisterInstanceAs <IPublishedFundingIdGeneratorResolver>(idGeneratorResolver);

            PublishedProviderContentsGeneratorResolver publishedProviderContentsGeneratorResolver = new PublishedProviderContentsGeneratorResolver();
            IPublishedProviderContentsGenerator        v10ProviderGenerator = new PublishedProviderContentsGenerator();

            publishedProviderContentsGeneratorResolver.Register("1.0", v10ProviderGenerator);

            RegisterInstanceAs <IPublishedProviderContentsGeneratorResolver>(publishedProviderContentsGeneratorResolver);

            PublishedFundingContentsGeneratorResolver publishedFundingContentsGeneratorResolver = new PublishedFundingContentsGeneratorResolver();
            IPublishedFundingContentsGenerator        v10Generator = new PublishedFundingContentsGenerator();

            publishedFundingContentsGeneratorResolver.Register("1.0", v10Generator);

            RegisterInstanceAs <IPublishedFundingContentsGeneratorResolver>(publishedFundingContentsGeneratorResolver);

            RegisterTypeAs <TransactionFactory, ITransactionFactory>();

            RegisterInstanceAs <ITransactionResiliencePolicies>(new TransactionResiliencePolicies
            {
                TransactionPolicy = Policy.NoOpAsync()
            });

            RegisterTypeAs <PublishedProviderIndexerService, IPublishedProviderIndexerService>();
            RegisterTypeAs <FundingLineValueOverride, IFundingLineValueOverride>();
            RegisterTypeAs <PublishedProviderDataPopulator, IPublishedProviderDataPopulator>();
            RegisterTypeAs <PublishedProviderExclusionCheck, IPublishProviderExclusionCheck>();
            RegisterTypeAs <PublishedProviderVersioningService, IPublishedProviderVersioningService>();
            RegisterTypeAs <PublishedProviderContentPersistanceService, IPublishedProviderContentPersistanceService>();
            RegisterTypeAs <PublishedFundingContentsPersistanceService, IPublishedFundingContentsPersistanceService>();

            RegisterTypeAs <VariationErrorRecorder, IRecordVariationErrors>();
            RegisterTypeAs <RefreshService, IRefreshService>();

            RegisterTypeAs <ApproveService, IApproveService>();

            RegisterTypeAs <PublishService, IPublishService>();

            RegisterInstanceAs <IBatchProfilingOptions>(new BatchProfilingOptions(new ConfigurationStub()));
            RegisterTypeAs <BatchProfilingService, IBatchProfilingService>();
            RegisterTypeAs <ProducerConsumerFactory, IProducerConsumerFactory>();

            RegisterInstanceAs <IFundingLineRoundingSettings>(new RoundingSettingsStub());
        }