public FundingTemplateService(
            ILogger logger,
            IFundingTemplateRepository fundingTemplateRepository,
            IPolicyResiliencePolicies policyResiliencePolicies,
            IFundingTemplateValidationService fundingTemplateValidationService,
            ICacheProvider cacheProvider,
            ITemplateMetadataResolver templateMetadataResolver,
            ITemplateBuilderService templateBuilderService,
            IMapper mapper)
        {
            Guard.ArgumentNotNull(logger, nameof(logger));
            Guard.ArgumentNotNull(fundingTemplateRepository, nameof(fundingTemplateRepository));
            Guard.ArgumentNotNull(policyResiliencePolicies?.CacheProvider, nameof(policyResiliencePolicies.CacheProvider));
            Guard.ArgumentNotNull(policyResiliencePolicies?.FundingTemplateRepository, nameof(policyResiliencePolicies.FundingTemplateRepository));
            Guard.ArgumentNotNull(fundingTemplateValidationService, nameof(fundingTemplateValidationService));
            Guard.ArgumentNotNull(cacheProvider, nameof(cacheProvider));
            Guard.ArgumentNotNull(templateMetadataResolver, nameof(templateMetadataResolver));
            Guard.ArgumentNotNull(templateBuilderService, nameof(templateBuilderService));
            Guard.ArgumentNotNull(mapper, nameof(mapper));

            _logger = logger;
            _fundingTemplateRepository        = fundingTemplateRepository;
            _fundingTemplateRepositoryPolicy  = policyResiliencePolicies.FundingTemplateRepository;
            _fundingTemplateValidationService = fundingTemplateValidationService;
            _cacheProvider            = cacheProvider;
            _cacheProviderPolicy      = policyResiliencePolicies.CacheProvider;
            _templateMetadataResolver = templateMetadataResolver;
            _templateBuilderService   = templateBuilderService;
            _mapper = mapper;
        }
        private static FundingTemplateService CreateFundingTemplateService(
            ILogger logger = null,
            IFundingTemplateRepository fundingTemplateRepository = null,
            IFundingTemplateValidationService fundingTemplateValidationService = null,
            ICacheProvider cacheProvider = null,
            ITemplateMetadataResolver templateMetadataResolver = null,
            ITemplateBuilderService templateBuilderService     = null,
            IMapper mapper = null)
        {
            if (mapper == null)
            {
                MapperConfiguration fundingConfMappingConfig = new MapperConfiguration(c =>
                {
                    c.AddProfile <FundingConfigurationMappingProfile>();
                });

                mapper = fundingConfMappingConfig.CreateMapper();
            }

            return(new FundingTemplateService(
                       logger ?? CreateLogger(),
                       fundingTemplateRepository ?? CreateFundingTemplateRepository(),
                       PolicyResiliencePoliciesTestHelper.GenerateTestPolicies(),
                       fundingTemplateValidationService ?? CreateFundingTemplateValidationService(),
                       cacheProvider ?? CreateCacheProvider(),
                       templateMetadataResolver ?? CreateMetadataResolver(),
                       templateBuilderService ?? CreateTemplateBuilderService(),
                       mapper
                       ));
        }
 public TemplateBuildController(
     ITemplateBuilderService templateBuilderService,
     IIoCValidatorFactory validatorFactory,
     TemplateSearchService templateSearchService)
 {
     _templateBuilderService = templateBuilderService;
     _validatorFactory       = validatorFactory;
     _templateSearchService  = templateSearchService;
 }
        public async Task GetFundingTemplates_GivenTemplateIsInBlob_ReturnsOkObjectResult()
        {
            //Arrange
            const string fundingStreamId = "PES";
            const string fundingPeriodId = "AY-2020";

            string blobNamePrefix = $"{fundingStreamId}/{ fundingPeriodId}/";

            IEnumerable <TemplateSummaryResponse> templateVersions = new[]
            {
                new TemplateSummaryResponse()
                {
                    FundingPeriodId = fundingPeriodId,
                    FundingStreamId = fundingStreamId,
                    MajorVersion    = 1,
                    MinorVersion    = 0,
                    Status          = TemplateStatus.Published
                }
            };
            IEnumerable <PublishedFundingTemplate> publishedFundingTemplate = new[]
            {
                new PublishedFundingTemplate()
                {
                    TemplateVersion = "1.0"
                }
            };

            IFundingTemplateRepository fundingTemplateRepository = CreateFundingTemplateRepository();

            fundingTemplateRepository
            .SearchTemplates(Arg.Is(blobNamePrefix))
            .Returns(publishedFundingTemplate);

            ITemplateBuilderService templateBuilderService = CreateTemplateBuilderService();

            templateBuilderService.FindVersionsByFundingStreamAndPeriod(Arg.Is <FindTemplateVersionQuery>(x => x.FundingStreamId == fundingStreamId && x.FundingPeriodId == fundingPeriodId))
            .Returns(templateVersions);


            ILogger logger = CreateLogger();

            FundingTemplateService fundingTemplateService = CreateFundingTemplateService(
                logger,
                fundingTemplateRepository: fundingTemplateRepository,
                templateBuilderService: templateBuilderService);

            //Act
            ActionResult <IEnumerable <PublishedFundingTemplate> > result = await fundingTemplateService.GetFundingTemplates(fundingStreamId, fundingPeriodId);

            //Assert
            result
            .Value
            .Should()
            .BeEquivalentTo(publishedFundingTemplate);
        }
        public async Task GetFundingTemplates_GivenTemplateIsInBlob_Metatdata_In_TemplateBuilder_Collection_ReturnsOkObjectResultWithAMetadata()
        {
            //Arrange
            const string fundingStreamId = "PES";
            const string fundingPeriodId = "AY-2020";

            string blobNamePrefix = $"{fundingStreamId}/{ fundingPeriodId}/";

            IEnumerable <TemplateSummaryResponse> templateVersions = new[]
            {
                new TemplateSummaryResponse()
                {
                    FundingPeriodId = fundingPeriodId,
                    FundingStreamId = fundingStreamId,
                    MajorVersion    = 1,
                    MinorVersion    = 1,
                    Status          = TemplateStatus.Published,
                    AuthorId        = "Auth-Id",
                    AuthorName      = "Auth-Name",
                    Comments        = "SomeComments",
                    SchemaVersion   = "1.1"
                },
                new TemplateSummaryResponse()
                {
                    FundingPeriodId = fundingPeriodId,
                    FundingStreamId = fundingStreamId,
                    MajorVersion    = 1,
                    MinorVersion    = 0,
                    Status          = TemplateStatus.Published,
                    AuthorId        = "Auth-Id2",
                    AuthorName      = "Auth-Name2",
                    Comments        = "SomeComments2",
                    SchemaVersion   = "1.2"
                }
            };

            IEnumerable <PublishedFundingTemplate> pubblishedFundingTempaltes = new[]
            {
                new PublishedFundingTemplate()
                {
                    TemplateVersion = "1.0",
                    PublishDate     = new DateTime(2020, 06, 15, 10, 30, 50)
                }
            };

            IFundingTemplateRepository fundingTemplateRepository = CreateFundingTemplateRepository();

            fundingTemplateRepository
            .SearchTemplates(Arg.Is(blobNamePrefix))
            .Returns(pubblishedFundingTempaltes);

            ITemplateBuilderService templateBuilderService = CreateTemplateBuilderService();

            templateBuilderService.FindVersionsByFundingStreamAndPeriod(Arg.Is <FindTemplateVersionQuery>(x => x.FundingStreamId == fundingStreamId && x.FundingPeriodId == fundingPeriodId))
            .Returns(templateVersions);


            ILogger logger = CreateLogger();

            FundingTemplateService fundingTemplateService = CreateFundingTemplateService(
                logger,
                fundingTemplateRepository: fundingTemplateRepository,
                templateBuilderService: templateBuilderService);

            //Act
            ActionResult <IEnumerable <PublishedFundingTemplate> > result = await fundingTemplateService.GetFundingTemplates(fundingStreamId, fundingPeriodId);

            //Assert
            PublishedFundingTemplate resultTemplate   = result.Value.FirstOrDefault();
            TemplateSummaryResponse  templateResponse = templateVersions.First(x => x.MajorVersion == 1 && x.MinorVersion == 0);

            resultTemplate.TemplateVersion.Should().Be(pubblishedFundingTempaltes.First().TemplateVersion);
            resultTemplate.PublishDate.Should().Be(pubblishedFundingTempaltes.First().PublishDate);
            resultTemplate.AuthorId.Should().Be(templateResponse.AuthorId);
            resultTemplate.AuthorName.Should().Be(templateResponse.AuthorName);
            resultTemplate.PublishNote.Should().Be(templateResponse.Comments);
            resultTemplate.SchemaVersion.Should().Be(templateResponse.SchemaVersion);
        }