public async Task GetDistinctFundingTemplateMetadataFundingLinesContents_GivenContentsInCache_ReturnsOkObjecWithResultsFromCache()
        {
            //Arrange
            const string fundingStreamId = "PES";
            const string fundingPeriodId = "AY-2020";
            const string templateVersion = "1.0";
            string       cacheKey        = $"{CacheKeys.FundingTemplateContentMetadataDistinct}{fundingStreamId}:{fundingPeriodId}:{templateVersion}".ToLowerInvariant();

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

            IFundingTemplateRepository fundingTemplateRepository = CreateFundingTemplateRepository();

            fundingTemplateRepository
            .TemplateVersionExists(Arg.Is <string>(_ => _.Contains(blobNamePrefix)))
            .Returns(true);
            fundingTemplateRepository.GetFundingTemplateVersion(Arg.Is <string>(_ => _.Contains(blobNamePrefix)))
            .Returns(string.Empty);

            ILogger        logger        = CreateLogger();
            ICacheProvider cacheProvider = CreateCacheProvider();

            cacheProvider.GetAsync <TemplateMetadataDistinctContents>(cacheKey)
            .Returns(new TemplateMetadataDistinctContents()
            {
                FundingStreamId = fundingStreamId,
                FundingPeriodId = fundingPeriodId,
                TemplateVersion = templateVersion
            });

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

            //Act
            ActionResult <TemplateMetadataDistinctContents> result = await fundingTemplateService.GetDistinctFundingTemplateMetadataContents(fundingStreamId, fundingPeriodId, templateVersion);

            //Assert

            TemplateMetadataDistinctContents contents = result.Value;

            contents.Should().NotBeNull();
            contents.FundingStreamId.Should().Be(fundingStreamId);
            contents.FundingPeriodId.Should().Be(fundingPeriodId);
            contents.TemplateVersion.Should().Be(templateVersion);

            await cacheProvider
            .Received(1).GetAsync <TemplateMetadataDistinctContents>(cacheKey);

            await fundingTemplateRepository
            .Received(0).GetFundingTemplateVersion(Arg.Is <string>(_ => _.Contains(blobNamePrefix)));

            await cacheProvider
            .Received(0)
            .SetAsync(cacheKey,
                      Arg.Is <TemplateMetadataDistinctContents>(_ => _.FundingStreamId == fundingStreamId && _.FundingPeriodId == fundingPeriodId && _.TemplateVersion == templateVersion),
                      TimeSpan.FromDays(365),
                      true,
                      null);
        }
Ejemplo n.º 2
0
 private void GivenTemplateMetadataDistinctContents(
     HttpStatusCode httpStatusCode,
     TemplateMetadataDistinctContents templateMetadataDistinctContents = null)
 {
     _policiesApiClient
     .Setup(_ => _.GetDistinctTemplateMetadataContents(_fundingStreamId,
                                                       _fundingPeriodId,
                                                       _templateVersion))
     .ReturnsAsync(new ApiResponse <TemplateMetadataDistinctContents>(httpStatusCode, templateMetadataDistinctContents));
 }
        public async Task GetDistinctFundingTemplateMetadataFundingLinesContents_GivenTemplateIsInBlob_ReturnsOkObjecResultstWithDistinctFundingLinesAndCalculations()
        {
            //Arrange
            const string fundingStreamId = "PES";
            const string fundingPeriodId = "AY-2020";
            const string templateVersion = "1.0";

            string template = CreateJsonFile("CalculateFunding.Services.Policy.Resources.LogicalModelTemplateForDistinctMetadataContents.json");

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

            IFundingTemplateRepository fundingTemplateRepository = CreateFundingTemplateRepository();

            fundingTemplateRepository
            .TemplateVersionExists(Arg.Is <string>(_ => _.Contains(blobNamePrefix)))
            .Returns(true);
            fundingTemplateRepository.GetFundingTemplateVersion(Arg.Is <string>(_ => _.Contains(blobNamePrefix)))
            .Returns(template);

            ILogger        logger        = CreateLogger();
            ICacheProvider cacheProvider = CreateCacheProvider();

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

            //Act
            ActionResult <TemplateMetadataDistinctContents> result = await fundingTemplateService.GetDistinctFundingTemplateMetadataContents(fundingStreamId, fundingPeriodId, templateVersion);

            //Assert
            TemplateMetadataDistinctContents contents = result.Value;

            contents.Should().NotBeNull();
            contents.FundingLines.Count().Should().Be(2);
            contents.Calculations.Count().Should().Be(2);
            contents.FundingStreamId.Should().Be(fundingStreamId);
            contents.FundingPeriodId.Should().Be(fundingPeriodId);
            contents.TemplateVersion.Should().Be(templateVersion);

            string cacheKey = $"{CacheKeys.FundingTemplateContentMetadataDistinct}{fundingStreamId}:{fundingPeriodId}:{templateVersion}".ToLowerInvariant();
            await cacheProvider
            .Received(1)
            .SetAsync(cacheKey,
                      Arg.Is <TemplateMetadataDistinctContents>(_ => _.FundingStreamId == fundingStreamId && _.FundingPeriodId == fundingPeriodId && _.TemplateVersion == templateVersion),
                      TimeSpan.FromDays(365),
                      true,
                      null);
        }
        public async Task <ActionResult <TemplateMetadataDistinctContents> > GetDistinctFundingTemplateMetadataContents(string fundingStreamId, string fundingPeriodId, string templateVersion)
        {
            string cacheKey = $"{CacheKeys.FundingTemplateContentMetadataDistinct}{fundingStreamId}:{fundingPeriodId}:{templateVersion}".ToLowerInvariant();
            TemplateMetadataDistinctContents templateMetadataDistinctContents = await _cacheProvider.GetAsync <TemplateMetadataDistinctContents>(cacheKey);

            if (templateMetadataDistinctContents == null)
            {
                ActionResult <TemplateMetadataContents> fundingTemplateContentMetadataResult = await GetFundingTemplateContentMetadata(fundingStreamId, fundingPeriodId, templateVersion);

                if (fundingTemplateContentMetadataResult.Result != null)
                {
                    return(fundingTemplateContentMetadataResult.Result);
                }

                TemplateMetadataContents templateMetadataContents      = fundingTemplateContentMetadataResult.Value;
                IEnumerable <TemplateMetadataCalculation> calculations = null;
                IEnumerable <TemplateMetadataFundingLine> fundingLines = null;
                if (templateMetadataContents.RootFundingLines != null)
                {
                    IEnumerable <FundingLine> flattenedFundingLines  = templateMetadataContents.RootFundingLines.Flatten(x => x.FundingLines);
                    IEnumerable <Calculation> flatternedCalculations = flattenedFundingLines.SelectMany(fl => fl.Calculations.Flatten(cal => cal.Calculations));

                    IEnumerable <FundingLine> uniqueFundingLines = flattenedFundingLines.DistinctBy(f => f.TemplateLineId);
                    IEnumerable <Calculation> uniqueCalculations = flatternedCalculations.DistinctBy(c => c.TemplateCalculationId);

                    fundingLines = _mapper.Map <IEnumerable <TemplateMetadataFundingLine> >(uniqueFundingLines);
                    calculations = _mapper.Map <IEnumerable <TemplateMetadataCalculation> >(uniqueCalculations);
                }

                templateMetadataDistinctContents = new TemplateMetadataDistinctContents()
                {
                    FundingStreamId = templateMetadataContents.FundingStreamId,
                    FundingPeriodId = templateMetadataContents.FundingPeriodId,
                    TemplateVersion = templateMetadataContents.TemplateVersion,
                    SchemaVersion   = templateMetadataContents.SchemaVersion,
                    FundingLines    = fundingLines,
                    Calculations    = calculations
                };

                // We need to cache as long as the data has not been changed
                await _cacheProvider.SetAsync(cacheKey, templateMetadataDistinctContents, TimeSpan.FromDays(365), true);
            }

            return(templateMetadataDistinctContents);
        }
        public async Task <ActionResult <TemplateMetadataDistinctCalculationsContents> > GetDistinctFundingTemplateMetadataCalculationsContents(string fundingStreamId, string fundingPeriodId, string templateVersion)
        {
            ActionResult <TemplateMetadataDistinctContents> templateMetadataDistinctContentsResult = await GetDistinctFundingTemplateMetadataContents(fundingStreamId, fundingPeriodId, templateVersion);

            if (templateMetadataDistinctContentsResult == null || templateMetadataDistinctContentsResult.Value == null)
            {
                return(templateMetadataDistinctContentsResult.Result);
            }

            TemplateMetadataDistinctContents templateMetadataDistinctContents = templateMetadataDistinctContentsResult.Value;

            return(new TemplateMetadataDistinctCalculationsContents()
            {
                FundingStreamId = templateMetadataDistinctContents.FundingStreamId,
                FundingPeriodId = templateMetadataDistinctContents.FundingPeriodId,
                TemplateVersion = templateMetadataDistinctContents.TemplateVersion,
                Calculations = templateMetadataDistinctContents.Calculations,
                SchemaVersion = templateMetadataDistinctContents.SchemaVersion
            });
        }