public void GenerateContents_GivenValidPublishedProviderVersion_ReturnsValidJson()
        {
            //Arrange
            ILogger logger = CreateLogger();

            ITemplateMetadataGenerator templateMetaDataGenerator = CreateTemplateGenerator(logger);

            TemplateMetadataContents contents = templateMetaDataGenerator.GetMetadata(GetResourceString("CalculateFunding.Generators.Schema10.UnitTests.Resources.exampleProviderTemplate1.json"));

            PublishedProviderContentsGenerator publishedProviderContentsGenerator = new PublishedProviderContentsGenerator();

            //Act
            string publishedcontents = publishedProviderContentsGenerator.GenerateContents(GetProviderVersion(), contents, GetTemplateMapping());

            //Assert
            string expectedOutput = GetResourceString("CalculateFunding.Generators.Schema10.UnitTests.Resources.exampleProviderOutput1.json").Prettify();

            publishedcontents
            .Prettify()
            .Should()
            .Be(expectedOutput);
        }
 public void SetUp()
 {
     _generator = new PublishedProviderContentsGenerator();
 }
        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());
        }