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)); }
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); }
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); }
private void AndTheSpecificationHasTheStatus(ApiSpecificationSummary specificationSummary, SpecificationFundingStatus status) { _specificationFundingStatusService .CheckChooseForFundingStatus(specificationSummary) .Returns(status); }
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); }
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)); }
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)); }
public async Task ReturnsInternalServerErrorResultIfJobNotCreatedForSuppliedSpecificationIdForProvidersApproval() { ApiSpecificationSummary specificationSummary = NewApiSpecificationSummary(_ => _.WithIsSelectedForFunding(true)); string approveFundingJobId = NewRandomString(); GivenTheApiResponseDetailsForTheSuppliedId(specificationSummary); await WhenBatchProvidersAreApproved(); ThenTheResponseShouldBe <InternalServerErrorResult>(); }
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>(); }
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()); }
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); }
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>(); }
private void AndTheSpecificationSummaryConflictsWithAnotherForThatFundingPeriod(ApiSpecificationSummary specificationSummary) { _specificationFundingStatusService .CheckChooseForFundingStatus(Arg.Is(specificationSummary)) .Returns(SpecificationFundingStatus.SharesAlreadyChosenFundingStream); }