示例#1
0
        private async Task <IActionResult> IsSpecificationReadyForPublish(string specificationId, ApprovalMode expectedApprovalMode)
        {
            ApiResponse <ApiSpecificationSummary> specificationIdResponse = await Specifications.GetSpecificationSummaryById(specificationId);

            ApiSpecificationSummary specificationSummary = specificationIdResponse.Content;

            if (specificationSummary == null)
            {
                return(new NotFoundResult());
            }

            if (!specificationSummary.IsSelectedForFunding)
            {
                return(new PreconditionFailedResult($"Specification with id : {specificationId} has not been selected for funding"));
            }

            IDictionary <string, FundingConfiguration> fundingConfigurations = await _fundingConfigurationService.GetFundingConfigurations(specificationSummary);

            if (fundingConfigurations.Values.Any(_ => _.ApprovalMode != expectedApprovalMode))
            {
                return(new PreconditionFailedResult($"Specification with id : {specificationId} has funding configurations which does not match required approval mode={expectedApprovalMode}"));
            }

            return(new OkObjectResult(null));
        }
示例#2
0
        public async Task Returns400IfPrereqChecksFailsForGetRefreshFundingJobPrereqErrors()
        {
            string errorMessage = "calc error";

            ApiSpecificationSummary specificationSummary = NewApiSpecificationSummary(_ => _.WithId(SpecificationId));

            GivenTheApiResponseDetailsForTheSuppliedId(specificationSummary);

            AndGetPreReqCheckerLocatorReturnsRefreshPreReqChecker();
            AndPrereqChecksFails(specificationSummary, errors: new[] { errorMessage });

            await WhenGetRefreshFundingJobPrereqErrors();

            ThenTheResponseShouldBe <BadRequestObjectResult>();

            BadRequestObjectResult objectResult = ActionResult as BadRequestObjectResult;

            objectResult.Should().NotBeNull();
            objectResult.Value.Should().BeOfType <SerializableError>();

            SerializableError errors = objectResult.Value as SerializableError;

            errors.Should().NotBeNull();
            errors.Count.Should().Be(1);

            errors.FirstOrDefault().Value.Should().BeOfType <string[]>();

            string[] errorArray = errors.FirstOrDefault().Value as string[];

            errorArray.Should().NotBeNull();
            errorArray.Length.Should().Be(1);

            errorArray.FirstOrDefault().Should().Be(errorMessage);
        }
示例#3
0
        public async Task Returns400IfPrereqChecksFails()
        {
            string fundingPeriodId               = NewRandomString();
            string exceptionErrorMessage         = "Error in the application.";
            string preReqCheckFailedErrorMessage = $"Prerequisite check for refresh failed {exceptionErrorMessage}";

            ApiSpecificationSummary specificationSummary =
                NewApiSpecificationSummary(_ => _
                                           .WithIsSelectedForFunding(true)
                                           .WithFundingPeriodId(fundingPeriodId)
                                           .WithFundingStreamIds(NewRandomString(),
                                                                 NewRandomString(),
                                                                 NewRandomString()));

            GivenTheApiResponseDetailsForTheSuppliedId(specificationSummary);
            AndTheApiResponseDetailsForTheFundingPeriodId(fundingPeriodId);
            AndGetPreReqCheckerLocatorReturnsRefreshPreReqChecker();
            AndPrereqChecksFails(specificationSummary, message: exceptionErrorMessage);

            await WhenTheSpecificationIsPublished();

            var result = ActionResult
                         .Should()
                         .BeOfType <BadRequestObjectResult>()
                         .Which
                         .Value;

            ((result as ICollection <KeyValuePair <string, object> >).First().Value as string[]).First()
            .Should()
            .Be(preReqCheckFailedErrorMessage);
        }
示例#4
0
 private void AndTheSpecificationHasTheStatus(ApiSpecificationSummary specificationSummary,
                                              SpecificationFundingStatus status)
 {
     _specificationFundingStatusService
     .CheckChooseForFundingStatus(specificationSummary)
     .Returns(status);
 }
示例#5
0
        public async Task ApproveProvidersFundingJobForSuppliedSpecificationId()
        {
            ApiSpecificationSummary specificationSummary = NewApiSpecificationSummary(_ =>
                                                                                      _.WithIsSelectedForFunding(true));

            string approveFundingJobId = NewRandomString();
            ApiJob approveFundingJob   = NewJob(_ => _.WithId(approveFundingJobId));

            string filterIdOne = NewRandomString();
            string filterIdTwo = NewRandomString();

            GivenTheApiResponseDetailsForTheSuppliedId(specificationSummary);
            AndTheFilteredListOfPublishedProviderIds(filterIdOne, filterIdTwo);
            AndTheApiResponseDetailsForApproveProviderJob(approveFundingJob, JsonExtensions.AsJson(new PublishedProviderIdsRequest
            {
                PublishedProviderIds = new[]
                {
                    filterIdOne,
                    filterIdTwo
                }
            }));

            await WhenBatchProvidersAreApproved();

            JobCreationResponse expectedJobCreationResponse = NewJobCreationResponse(_ => _.WithJobId(approveFundingJobId));

            ActionResult
            .Should()
            .BeOfType <OkObjectResult>()
            .Which
            .Value
            .Should()
            .BeEquivalentTo(expectedJobCreationResponse);
        }
示例#6
0
        public async Task CreatesPublishSpecificationJobForSuppliedSpecificationId()
        {
            string fundingPeriodId = NewRandomString();

            ApiSpecificationSummary specificationSummary = NewApiSpecificationSummary(_ =>
                                                                                      _.WithFundingStreamIds(NewRandomString(),
                                                                                                             NewRandomString(),
                                                                                                             NewRandomString())
                                                                                      .WithFundingPeriodId(fundingPeriodId));

            string refreshFundingJobId = NewRandomString();
            ApiJob refreshFundingJob   = NewJob(_ => _.WithId(refreshFundingJobId));

            GivenTheApiResponseDetailsForTheSuppliedId(specificationSummary);
            AndTheApiResponseDetailsForTheFundingPeriodId(fundingPeriodId);
            AndGetPreReqCheckerLocatorReturnsRefreshPreReqChecker();
            AndTheApiResponseDetailsForSpecificationsJob(refreshFundingJob);

            JobCreationResponse expectedJobCreationResponse = NewJobCreationResponse(_ => _.WithJobId(refreshFundingJobId));

            await WhenTheSpecificationIsPublished();

            ActionResult
            .Should()
            .BeOfType <OkObjectResult>()
            .Which
            .Value
            .Should()
            .BeEquivalentTo(expectedJobCreationResponse);
        }
        public async Task <IActionResult> CreateRefreshFundingJob(string specificationId,
                                                                  Reference user,
                                                                  string correlationId)
        {
            ValidationResult validationResult = SpecificationIdValidator.Validate(specificationId);

            if (!validationResult.IsValid)
            {
                return(validationResult.AsBadRequest());
            }

            ApiResponse <ApiSpecificationSummary> specificationIdResponse =
                await ResiliencePolicy.ExecuteAsync(() => Specifications.GetSpecificationSummaryById(specificationId));

            ApiSpecificationSummary specificationSummary = specificationIdResponse.Content;

            if (specificationSummary == null)
            {
                return(new NotFoundResult());
            }

            SpecificationFundingStatus chooseCheck = await _specificationFundingStatusService.CheckChooseForFundingStatus(specificationSummary);

            if (chooseCheck == SpecificationFundingStatus.SharesAlreadyChosenFundingStream)
            {
                return(new ConflictResult());
            }

            IDictionary <string, Provider> scopedProviders = await _providerService.GetScopedProvidersForSpecification(specificationSummary.Id, specificationSummary.ProviderVersionId);

            // Check prerequisites for this specification to be chosen/refreshed
            IPrerequisiteChecker prerequisiteChecker = _prerequisiteCheckerLocator.GetPreReqChecker(PrerequisiteCheckerType.Refresh);

            try
            {
                await prerequisiteChecker.PerformChecks(
                    specificationSummary,
                    null,
                    Array.Empty <PublishedProvider>(),
                    scopedProviders?.Values);
            }
            catch (JobPrereqFailedException ex)
            {
                return(new BadRequestObjectResult(new [] { $"Prerequisite check for refresh failed {ex.Message}" }.ToModelStateDictionary()));
            }

            ApiJob refreshFundingJob = await _refreshFundingJobs.CreateJob(specificationId, user, correlationId);

            Guard.ArgumentNotNull(refreshFundingJob, nameof(refreshFundingJob), "Failed to create RefreshFundingJob");

            JobCreationResponse jobCreationResponse = new JobCreationResponse()
            {
                JobId = refreshFundingJob.Id,
            };

            return(new OkObjectResult(jobCreationResponse));
        }
示例#8
0
 private void AndPrereqChecksFails(
     ApiSpecificationSummary specificationSummary,
     string message = null,
     IEnumerable <string> errors = null)
 {
     _prerequisiteChecker
     .PerformChecks(
         Arg.Is(specificationSummary),
         null,
         Arg.Is <IEnumerable <PublishedProvider> >(_ => !_.Any()),
         Arg.Is <IEnumerable <Provider> >(_ => !_.Any()))
     .Throws(new JobPrereqFailedException(message, errors));
 }
示例#9
0
        public async Task ReturnsInternalServerErrorResultIfJobNotCreatedForSuppliedSpecificationIdForProvidersApproval()
        {
            ApiSpecificationSummary specificationSummary = NewApiSpecificationSummary(_ =>
                                                                                      _.WithIsSelectedForFunding(true));

            string approveFundingJobId = NewRandomString();

            GivenTheApiResponseDetailsForTheSuppliedId(specificationSummary);

            await WhenBatchProvidersAreApproved();

            ThenTheResponseShouldBe <InternalServerErrorResult>();
        }
示例#10
0
        public async Task ReturnsPreConditionFailedResultIfNotSelectedForFundingForSuppliedSpecificationIdForProvidersApproval()
        {
            ApiSpecificationSummary specificationSummary = NewApiSpecificationSummary(_ =>
                                                                                      _.WithIsSelectedForFunding(false));

            string approveFundingJobId = NewRandomString();
            ApiJob approveFundingJob   = NewJob(_ => _.WithId(approveFundingJobId));

            GivenTheApiResponseDetailsForTheSuppliedId(specificationSummary);
            AndTheApiResponseDetailsForApproveSpecificationJob(approveFundingJob);

            await WhenBatchProvidersAreApproved();

            ThenTheResponseShouldBe <PreconditionFailedResult>();
        }
示例#11
0
        public async Task CanChooseForFunding_SpecificationSummaryStatus_ReturnsOKWithCorrectStatus(SpecificationFundingStatus status)
        {
            ApiSpecificationSummary specificationSummary = NewApiSpecificationSummary();

            GivenTheApiResponseDetailsForTheSuppliedId(specificationSummary, HttpStatusCode.OK);
            AndTheSpecificationHasTheStatus(specificationSummary, status);

            await WhenCanChooseFundingIsQueried();

            ActionResult
            .Should()
            .BeAssignableTo <OkObjectResult>()
            .Which
            .Value
            .Should()
            .BeEquivalentTo(new SpecificationCheckChooseForFundingResult {
                Status = status
            });
        }
        public async Task <IActionResult> CanChooseForFunding(string specificationId)
        {
            Guard.IsNullOrWhiteSpace(specificationId, nameof(specificationId));

            ApiResponse <ApiSpecificationSummary> specificationResponse =
                await ResiliencePolicy.ExecuteAsync(() => Specifications.GetSpecificationSummaryById(specificationId));

            ApiSpecificationSummary specificationSummary = specificationResponse?.Content;

            if (specificationSummary == null)
            {
                return(new NotFoundResult());
            }

            SpecificationFundingStatus specificationFundingStatus = await _specificationFundingStatusService.CheckChooseForFundingStatus(specificationSummary);

            return(new OkObjectResult(new SpecificationCheckChooseForFundingResult {
                Status = specificationFundingStatus
            }));
        }
        public async Task <IActionResult> ValidateSpecificationForRefresh(string specificationId)
        {
            List <string> prereqErrors = new List <string>();

            ValidationResult validationResult = SpecificationIdValidator.Validate(specificationId);

            if (!validationResult.IsValid)
            {
                return(validationResult.AsBadRequest());
            }

            ApiResponse <ApiSpecificationSummary> specificationIdResponse =
                await ResiliencePolicy.ExecuteAsync(() => Specifications.GetSpecificationSummaryById(specificationId));

            ApiSpecificationSummary specificationSummary = specificationIdResponse.Content;

            if (specificationSummary == null)
            {
                return(new NotFoundResult());
            }

            IDictionary <string, Provider> scopedProviders = await _providerService.GetScopedProvidersForSpecification(specificationSummary.Id, specificationSummary.ProviderVersionId);

            IPrerequisiteChecker prerequisiteChecker = _prerequisiteCheckerLocator.GetPreReqChecker(PrerequisiteCheckerType.Refresh);

            try
            {
                await prerequisiteChecker.PerformChecks(
                    specificationSummary,
                    null,
                    Array.Empty <PublishedProvider>(),
                    scopedProviders?.Values);
            }
            catch (JobPrereqFailedException ex)
            {
                return(new BadRequestObjectResult(ex.Errors.ToArray().ToModelStateDictionary()));
            }

            return(new NoContentResult());
        }
示例#14
0
        public async Task ApproveAllProvidersFundingJobForSuppliedSpecificationId()
        {
            ApiSpecificationSummary specificationSummary = NewApiSpecificationSummary(_ =>
                                                                                      _.WithIsSelectedForFunding(true));

            string approveFundingJobId = NewRandomString();
            ApiJob approveFundingJob   = NewJob(_ => _.WithId(approveFundingJobId));

            GivenTheApiResponseDetailsForTheSuppliedId(specificationSummary);
            AndTheApiResponseDetailsForApproveSpecificationJob(approveFundingJob);

            await WhenAllProvidersAreApproved();

            JobCreationResponse expectedJobCreationResponse = NewJobCreationResponse(_ => _.WithJobId(approveFundingJobId));

            ActionResult
            .Should()
            .BeOfType <OkObjectResult>()
            .Which
            .Value
            .Should()
            .BeEquivalentTo(expectedJobCreationResponse);
        }
示例#15
0
        public async Task ReturnsStatusCode409IfAnotherSpecificationIsPublishedForTheSameFundingStreamAndPeriod()
        {
            string commonFundingStreamId = NewRandomString();
            string fundingPeriodId       = NewRandomString();

            ApiSpecificationSummary specificationSummary = NewApiSpecificationSummary(_ =>
                                                                                      _.WithFundingStreamIds(commonFundingStreamId,
                                                                                                             NewRandomString(),
                                                                                                             NewRandomString())
                                                                                      .WithFundingPeriodId(fundingPeriodId));

            GivenTheApiResponseDetailsForTheSuppliedId(specificationSummary);
            AndTheApiResponseDetailsForTheFundingPeriodId(fundingPeriodId,
                                                          NewApiSpecificationSummary(_ => _.WithFundingStreamIds(NewRandomString(), commonFundingStreamId)),
                                                          NewApiSpecificationSummary(_ => _.WithFundingStreamIds(NewRandomString())));

            AndTheSpecificationSummaryConflictsWithAnotherForThatFundingPeriod(specificationSummary);


            await WhenTheSpecificationIsPublished();

            ThenTheResponseShouldBe <ConflictResult>();
        }
示例#16
0
 private void AndTheSpecificationSummaryConflictsWithAnotherForThatFundingPeriod(ApiSpecificationSummary specificationSummary)
 {
     _specificationFundingStatusService
     .CheckChooseForFundingStatus(Arg.Is(specificationSummary))
     .Returns(SpecificationFundingStatus.SharesAlreadyChosenFundingStream);
 }