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>()); }
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); }
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); }
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); }
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); }
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); }
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()); }