protected async override Task <IEnumerable <string> > PerformChecks <TSpecification>(TSpecification prereqObject, IEnumerable <PublishedProvider> publishedProviders = null, IEnumerable <Provider> providers = null) { Guard.ArgumentNotNull(publishedProviders, nameof(publishedProviders)); SpecificationSummary specification = prereqObject as SpecificationSummary; Guard.ArgumentNotNull(specification, nameof(specification)); SpecificationFundingStatus specificationFundingStatus = await _specificationFundingStatusService.CheckChooseForFundingStatus(specification); if (specificationFundingStatus != SpecificationFundingStatus.AlreadyChosen) { string errorMessage = $"Specification with id: '{specification.Id}' is not chosen for funding"; _logger.Error(errorMessage); return(new string[] { errorMessage }); } List <string> results = new List <string>(); if (publishedProviders?.Any(_ => _.Current.Status == PublishedProviderStatus.Draft || _.Current.Status == PublishedProviderStatus.Updated) ?? false) { results.AddRange(publishedProviders.Where(_ => _.Current.Status == PublishedProviderStatus.Draft || _.Current.Status == PublishedProviderStatus.Updated).Select(_ => $"Provider with id:{_.Id} has current status:{_.Current.Status} so cannot be published.")); _logger.Error(string.Join(Environment.NewLine, results)); return(results); } return(results); }
private void AndTheSpecificationHasTheStatus(ApiSpecificationSummary specificationSummary, SpecificationFundingStatus status) { _specificationFundingStatusService .CheckChooseForFundingStatus(specificationSummary) .Returns(status); }
public async Task CheckChooseForFundingStatus_GivenNoSpecSummariesFoundForFundingPeriodId_ReturnsCanChoose() { //Arrange SpecificationSummary specificationSummary = new SpecificationSummary { FundingPeriod = new Reference { Id = fundingPeriodId } }; ISpecificationService specificationService = CreateSpecificationService(); specificationService .GetSpecificationSummaryById(Arg.Is(specificationId)) .Returns(specificationSummary); specificationService .GetSpecificationsSelectedForFundingByPeriod(Arg.Is(fundingPeriodId)) .Returns((IEnumerable <SpecificationSummary>)null); SpecificationFundingStatusService specificationFundingStatusService = CreateSpecificationFundingStatusService(specificationService: specificationService); //Act SpecificationFundingStatus status = await specificationFundingStatusService.CheckChooseForFundingStatus(specificationId); //Assert status .Should() .Be(SpecificationFundingStatus.CanChoose); }
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)); }
protected override async Task <IEnumerable <string> > PerformChecks <T>( T prereqObject, IEnumerable <PublishedProvider> publishedProviders, IEnumerable <Provider> providers) { SpecificationSummary specification = prereqObject as SpecificationSummary; Guard.ArgumentNotNull(specification, nameof(specification)); if (specification.ApprovalStatus != Common.ApiClient.Models.PublishStatus.Approved) { _logger.Error("Specification failed refresh prerequisite check. Reason: must be approved"); return(new string[] { "Specification must be approved." }); } if (providers.IsNullOrEmpty()) { _logger.Error("Specification failed refresh prerequisite check. Reason: no scoped providers"); return(new string[] { "Specification must have providers in scope." }); } SpecificationFundingStatus specificationFundingStatus = await _specificationFundingStatusService.CheckChooseForFundingStatus(specification); if (specificationFundingStatus == SpecificationFundingStatus.SharesAlreadyChosenFundingStream) { string errorMessage = $"Specification with id: '{specification.Id} already shares chosen funding streams"; _logger.Error(errorMessage); return(new string[] { errorMessage }); } if (specificationFundingStatus == SpecificationFundingStatus.CanChoose) { try { await _specificationService.SelectSpecificationForFunding(specification.Id); } catch (Exception ex) { _logger.Error(ex.Message); return(new string[] { ex.Message }); } } List <string> results = new List <string>(); IEnumerable <string> calculationPrereqValidationErrors = await _calculationApprovalCheckerService.VerifyCalculationPrerequisites(specification); if (calculationPrereqValidationErrors.AnyWithNullCheck()) { results.Add("All template calculations for this specification must be approved."); _logger.Error(string.Join(Environment.NewLine, calculationPrereqValidationErrors)); } return(results); }
public async Task CheckChooseForFundingStatus_GivenSpecWIthMultipleFundingStreamsAndSpecsReturnedForFundingPeriodWithSameFundingStream_ReturnsSharesAlreadyChoseFundingStream() { //Arrange SpecificationSummary specificationSummary = new SpecificationSummary { FundingPeriod = new Reference { Id = fundingPeriodId }, FundingStreams = new[] { new Reference("fs-2", "fs2"), new Reference("fs-4", "fs4") } }; IEnumerable <SpecificationSummary> specificationSummaries = new[] { new SpecificationSummary { FundingStreams = new[] { new Reference("fs-1", "fs1"), new Reference("fs-5", "fs5"), } }, new SpecificationSummary { FundingStreams = new[] { new Reference("fs-3", "fs3"), new Reference("fs-4", "fs4"), } } }; ISpecificationService specificationService = CreateSpecificationService(); specificationService .GetSpecificationSummaryById(Arg.Is(specificationId)) .Returns(specificationSummary); specificationService .GetSpecificationsSelectedForFundingByPeriod(Arg.Is(fundingPeriodId)) .Returns(specificationSummaries); SpecificationFundingStatusService specificationFundingStatusService = CreateSpecificationFundingStatusService(specificationService: specificationService); //Act SpecificationFundingStatus status = await specificationFundingStatusService.CheckChooseForFundingStatus(specificationId); //Assert status .Should() .Be(SpecificationFundingStatus.SharesAlreadyChosenFundingStream); }
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 CheckChooseForFundingStatus_GivenSpecificationSummaryButAlreadyChosen_ReturnsAlreadyChosen() { //Arrange SpecificationSummary specificationSummary = new SpecificationSummary { IsSelectedForFunding = true }; ISpecificationService specificationService = CreateSpecificationService(); specificationService .GetSpecificationSummaryById(Arg.Is(specificationId)) .Returns(specificationSummary); SpecificationFundingStatusService specificationFundingStatusService = CreateSpecificationFundingStatusService(specificationService: specificationService); //Act SpecificationFundingStatus status = await specificationFundingStatusService.CheckChooseForFundingStatus(specificationId); //Assert status .Should() .Be(SpecificationFundingStatus.AlreadyChosen); }
private void GivenTheSpecificationFundingStatusForTheSpecification(SpecificationSummary specification, SpecificationFundingStatus specificationFundingStatus) { _specificationFundingStatusService.CheckChooseForFundingStatus(specification) .Returns(specificationFundingStatus); }
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 }); }