public void SaveFundingTotals_GivenPublishedProfilingRequestsButProfilingAPICausesException_LogsAndThrows()
        {
            //Arrange
            IEnumerable <FundingLine> fundingLines = SetUpInput();

            ILogger logger = CreateLogger();

            IProfilingApiClient providerProfilingRepository = Substitute.For <IProfilingApiClient>();
            ValidatedApiResponse <ProviderProfilingResponseModel> providerProfilingResponseModel =
                new ValidatedApiResponse <ProviderProfilingResponseModel>(HttpStatusCode.InternalServerError);

            providerProfilingRepository
            .GetProviderProfilePeriods(Arg.Any <ProviderProfilingRequestModel>())
            .Returns(providerProfilingResponseModel);

            ProfilingService service = CreateProfilingService(
                logger: logger,
                profilingApiClient: providerProfilingRepository);

            //Act
            Func <Task> test = async() => await service.ProfileFundingLines(fundingLines, "PSG", "AY-1819");

            //Assert
            test
            .Should()
            .ThrowExactly <NonRetriableException>()
            .Which
            .Message
            .Should()
            .Be("Failed to Get Profile Periods for updating for Requested FundingPeriodId: 'AY-1819' and FundingStreamId: 'PSG'");

            logger
            .Received(1)
            .Error(Arg.Is("Failed to Get Profile Periods for updating for Requested FundingPeriodId: 'AY-1819' and FundingStreamId: 'PSG'"));
        }
        public void SaveFundingTotals_GivenPublishedProfilingRequestsButProfilingAPIReturnNoResults_LogsAndThrows()
        {
            //Arrange
            IEnumerable <FundingLine> fundingLines = SetUpInput();

            ILogger logger = CreateLogger();

            SetUpProviderProfilingResponse();

            IProfilingApiClient providerProfilingRepository = Substitute.For <IProfilingApiClient>();

            providerProfilingRepository
            .GetProviderProfilePeriods(Arg.Any <ProviderProfilingRequestModel>())
            .Returns(Task.FromResult <ValidatedApiResponse <ProviderProfilingResponseModel> >(null));

            ProfilingService serviceapi = CreateProfilingService(
                logger: logger,
                profilingApiClient: providerProfilingRepository);

            //Act
            Func <Task> test = async() => await serviceapi.ProfileFundingLines(fundingLines, "PSG", "AY-1819");

            //Assert
            logger
            .Received(0)
            .Error(Arg.Is("Failed to Get Profile Periods for updating  for Requested FundingPeriodId"));
        }
        public async Task SaveMultipleFundinglines_GivenPublishedProfilingRequests()
        {
            //Arrange
            List <FundingLine> fundingLines = new List <FundingLine>
            {
                new FundingLine {
                    Name = "Abc", FundingLineCode = "FL1", Type = FundingLineType.Payment, Value = 500, TemplateLineId = 123, DistributionPeriods = null
                },
                new FundingLine {
                    Name = "Xyz", FundingLineCode = "AB1", Type = FundingLineType.Payment, Value = 600, TemplateLineId = 123, DistributionPeriods = null
                }
            };

            ILogger logger = CreateLogger();
            ValidatedApiResponse <ProviderProfilingResponseModel> profileResponse = SetUpProviderProfilingResponse();

            IProfilingApiClient providerProfilingRepository = Substitute.For <IProfilingApiClient>();

            providerProfilingRepository
            .GetProviderProfilePeriods(Arg.Any <ProviderProfilingRequestModel>())
            .Returns(Task.FromResult(profileResponse));

            ProfilingService serviceapi = CreateProfilingService(
                logger: logger,
                profilingApiClient: providerProfilingRepository);

            //Act
            await serviceapi.ProfileFundingLines(fundingLines, "PSG", "AY-1819");

            //Assert
            fundingLines.Where(y => y.Value == 500)
            .Select(r => r.DistributionPeriods)
            .Should()
            .NotBeNullOrEmpty();

            fundingLines.Where(y => y.Value == 600)
            .Select(r => r.DistributionPeriods)
            .Should()
            .NotBeNullOrEmpty();

            await providerProfilingRepository
            .Received(1)
            .GetProviderProfilePeriods(Arg.Is <ProviderProfilingRequestModel>(m =>
                                                                              m.FundingValue == 500));

            await providerProfilingRepository
            .Received(1)
            .GetProviderProfilePeriods(Arg.Is <ProviderProfilingRequestModel>(m =>
                                                                              m.FundingValue == 600));
        }
        public void SaveFundingTotals_GivenNullPublishedProfilingFundlingTotalsRequests_ThrowsArgumentException()
        {
            //Arrange
            List <FundingLine> fundingLines = new List <FundingLine>();

            ProfilingService service = CreateProfilingService();

            //Act
            Func <Task> test = async() => await service.ProfileFundingLines(fundingLines, "PSG", "AY-1819");

            //Assert
            test
            .Should()
            .ThrowExactly <ArgumentNullException>();
        }
        public async Task SaveFundingTotals_GivenPublishedProfilingRequestsReturnProfilePatternKey()
        {
            //Arrange
            IEnumerable <FundingLine>       fundingLines       = SetUpInput();
            IEnumerable <ProfilePatternKey> profilePatternKeys = SetUpProfilePatternKeyt();

            ILogger logger = CreateLogger();

            ValidatedApiResponse <ProviderProfilingResponseModel> profileResponse = SetUpProviderProfilingResponse();

            IProfilingApiClient providerProfilingRepository = Substitute.For <IProfilingApiClient>();

            providerProfilingRepository
            .GetProviderProfilePeriods(Arg.Any <ProviderProfilingRequestModel>())
            .Returns(Task.FromResult(profileResponse));

            ProfilingService serviceapi = CreateProfilingService(
                logger: logger,
                profilingApiClient: providerProfilingRepository);

            //Act
            IEnumerable <ProfilePatternKey> result = await serviceapi.ProfileFundingLines(fundingLines, "PSG", "AY-1819",
                                                                                          profilePatternKeys, "productType", "productSubType");

            //Assert
            fundingLines.Where(y => y.Type == FundingLineType.Payment)
            .Select(r => r.DistributionPeriods)
            .Should()
            .NotBeNullOrEmpty();

            IEnumerable <FundingLine> expectedFundingLines;

            expectedFundingLines = ExpectedOutput();
            JsonConvert
            .SerializeObject(expectedFundingLines)
            .Should()
            .BeEquivalentTo(JsonConvert.SerializeObject(fundingLines));

            await providerProfilingRepository
            .Received(1)
            .GetProviderProfilePeriods(Arg.Is <ProviderProfilingRequestModel>(m =>
                                                                              m.FundingValue == 500));

            result.Select(m => m.Key)
            .Should()
            .BeEquivalentTo("ProfilePatthernKey1");
        }
        public void SaveFundingTotals_GivenPublishedProfilingRequestsButNoPaymentTypeinFundingTotals_LogsAndThrows()
        {
            //Arrange
            List <FundingLine> fundingLines = new List <FundingLine>
            {
                new FundingLine {
                    Name = "Abc", FundingLineCode = "FL1", Type = FundingLineType.Information, Value = 500, TemplateLineId = 123, DistributionPeriods = null
                }
            };

            ILogger logger = CreateLogger();

            ProfilingService service = CreateProfilingService(logger: logger);

            //Act
            Func <Task> test = async() => await service.ProfileFundingLines(fundingLines, "PSG", "AY-1819");

            //Assert

            logger
            .Received(0)
            .Error(Arg.Is("No Funding Values of Type Payment in the Funding Totals for updating."));
        }