public PublishIntegrityCheckService(IJobManagement jobManagement,
                                            ILogger logger,
                                            ISpecificationService specificationService,
                                            IProviderService providerService,
                                            IPublishedFundingContentsPersistanceService publishedFundingContentsPersistanceService,
                                            IPublishedProviderContentPersistanceService publishedProviderContentsPersistanceService,
                                            IPublishingResiliencePolicies publishingResiliencePolicies,
                                            IPublishedFundingDataService publishedFundingDataService,
                                            IPoliciesService policiesService,
                                            ICalculationsApiClient calculationsApiClient,
                                            IPublishedFundingService publishedFundingService,
                                            IPublishedProviderContentsGeneratorResolver publishedProviderContentsGeneratorResolver,
                                            IPublishedFundingVersionDataService publishedFundingVersionDataService) : base(jobManagement, logger)
        {
            Guard.ArgumentNotNull(logger, nameof(logger));
            Guard.ArgumentNotNull(specificationService, nameof(specificationService));
            Guard.ArgumentNotNull(publishedFundingContentsPersistanceService, nameof(publishedFundingContentsPersistanceService));
            Guard.ArgumentNotNull(publishedProviderContentsPersistanceService, nameof(publishedProviderContentsPersistanceService));
            Guard.ArgumentNotNull(providerService, nameof(providerService));
            Guard.ArgumentNotNull(publishedFundingDataService, nameof(publishedFundingDataService));
            Guard.ArgumentNotNull(publishingResiliencePolicies.PublishedFundingRepository, nameof(publishingResiliencePolicies.PublishedFundingRepository));
            Guard.ArgumentNotNull(policiesService, nameof(policiesService));
            Guard.ArgumentNotNull(calculationsApiClient, nameof(calculationsApiClient));
            Guard.ArgumentNotNull(publishingResiliencePolicies.CalculationsApiClient, nameof(publishingResiliencePolicies.CalculationsApiClient));
            Guard.ArgumentNotNull(publishedFundingService, nameof(publishedFundingService));
            Guard.ArgumentNotNull(publishedProviderContentsGeneratorResolver, nameof(publishedProviderContentsGeneratorResolver));
            Guard.ArgumentNotNull(publishedFundingVersionDataService, nameof(publishedFundingVersionDataService));

            _logger = logger;
            _calculationsApiClient       = calculationsApiClient;
            _calculationsApiClientPolicy = publishingResiliencePolicies.CalculationsApiClient;
            _specificationService        = specificationService;
            _publishedFundingContentsPersistanceService  = publishedFundingContentsPersistanceService;
            _publishedProviderContentsPersistanceService = publishedProviderContentsPersistanceService;
            _providerService             = providerService;
            _publishedFundingDataService = publishedFundingDataService;
            _publishingResiliencePolicy  = publishingResiliencePolicies.PublishedFundingRepository;
            _policiesService             = policiesService;
            _publishedProviderContentsGeneratorResolver = publishedProviderContentsGeneratorResolver;
            _publishedFundingVersionDataService         = publishedFundingVersionDataService;
        }
        public void Setup()
        {
            _publishedProviderId          = NewRandomString();
            _publishedProviderIds         = new[] { _publishedProviderId };
            _publishingResiliencePolicies = new ResiliencePolicies
            {
                PublishedFundingRepository           = Policy.NoOpAsync(),
                CalculationsApiClient                = Policy.NoOpAsync(),
                SpecificationsApiClient              = Policy.NoOpAsync(),
                SpecificationsRepositoryPolicy       = Policy.NoOpAsync(),
                PublishedIndexSearchResiliencePolicy = Policy.NoOpAsync()
            };
            _specificationsApiClient           = Substitute.For <ISpecificationsApiClient>();
            _specificationService              = new SpecificationService(_specificationsApiClient, _publishingResiliencePolicies);
            _specificationFundingStatusService = Substitute.For <ISpecificationFundingStatusService>();
            _jobsRunning = Substitute.For <IJobsRunning>();
            _logger      = Substitute.For <ILogger>();
            _publishedFundingChangeDetectorService       = Substitute.For <IPublishedFundingChangeDetectorService>();
            _publishedFundingGenerator                   = Substitute.For <IPublishedFundingGenerator>();
            _publishedProviderContentsGeneratorResolver  = Substitute.For <IPublishedProviderContentsGeneratorResolver>();
            _publishedFundingContentsPersistanceService  = Substitute.For <IPublishedFundingContentsPersistanceService>();
            _publishedProviderContentsPersistanceService = Substitute.For <IPublishedProviderContentPersistanceService>();
            _calculationsApiClient      = Substitute.For <ICalculationsApiClient>();
            _providerService            = Substitute.For <IProviderService>();
            _jobManagement              = Substitute.For <IJobManagement>();
            _prerequisiteCheckerLocator = Substitute.For <IPrerequisiteCheckerLocator>();
            _prerequisiteCheckerLocator.GetPreReqChecker(PrerequisiteCheckerType.ReleaseAllProviders)
            .Returns(new PublishAllPrerequisiteChecker(_specificationFundingStatusService, _jobsRunning, _jobManagement, _logger));
            _prerequisiteCheckerLocator.GetPreReqChecker(PrerequisiteCheckerType.ReleaseBatchProviders)
            .Returns(new PublishBatchPrerequisiteChecker(_specificationFundingStatusService, _jobsRunning, _jobManagement, _logger));
            _mapper = Substitute.For <IMapper>();
            _publishedFundingDataService           = Substitute.For <IPublishedFundingDataService>();
            _policiesService                       = Substitute.For <IPoliciesService>();
            _organisationGroupGenerator            = Substitute.For <IOrganisationGroupGenerator>();
            _publishedFundingChangeDetectorService = Substitute.For <IPublishedFundingChangeDetectorService>();
            _publishedFundingDateService           = Substitute.For <IPublishedFundingDateService>();
            _publishedFundingDataService           = Substitute.For <IPublishedFundingDataService>();
            _publishedFundingVersionDataService    = Substitute.For <IPublishedFundingVersionDataService>();

            _publishedFundingService = new PublishedFundingService(_publishedFundingDataService,
                                                                   _publishingResiliencePolicies,
                                                                   _policiesService,
                                                                   _organisationGroupGenerator,
                                                                   _publishedFundingChangeDetectorService,
                                                                   _publishedFundingDateService,
                                                                   _mapper,
                                                                   _logger);

            _publishIntegrityService = new PublishIntegrityCheckService(_jobManagement,
                                                                        _logger,
                                                                        _specificationService,
                                                                        _providerService,
                                                                        _publishedFundingContentsPersistanceService,
                                                                        _publishedProviderContentsPersistanceService,
                                                                        _publishingResiliencePolicies,
                                                                        _publishedFundingDataService,
                                                                        _policiesService,
                                                                        _calculationsApiClient,
                                                                        _publishedFundingService,
                                                                        _publishedProviderContentsGeneratorResolver,
                                                                        _publishedFundingVersionDataService
                                                                        );
        }