Exemplo n.º 1
0
        public void PerformPrerequisiteChecks_GivenASpecificationAndPublishedProvidersNotAllApproved_ReturnsPreReqs()
        {
            // Arrange
            _publishedProvider = NewPublishedProvider(_ => _.WithCurrent(NewPublishedProviderVersion(version => version.WithFundingPeriodId(_publishedFundingPeriod.Id)
                                                                                                     .WithFundingStreamId("stream")
                                                                                                     .WithProviderId("provider"))));

            _specificationFundingStatusService.CheckChooseForFundingStatus(_specification)
            .Returns(SpecificationFundingStatus.AlreadyChosen);

            _publishedProvider.Current.Status = PublishedProviderStatus.Draft;

            // Act
            Func <Task> invocation
                = () => _publishPrerequisiteChecker.PerformChecks(_specification, null, new List <PublishedProvider> {
                _publishedProvider
            });

            invocation
            .Should()
            .Throw <JobPrereqFailedException>()
            .Where(_ =>
                   _.Message == $"Specification with id: '{_specification.Id} has prerequisites which aren't complete.");

            // Assert
            _logger
            .Received(1)
            .Error($"Provider with id:{_publishedProvider.Id} has current status:{_publishedProvider.Current.Status} so cannot be published.");
        }
        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 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);
        }
        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);
        }
 private void GivenTheSpecificationFundingStatusForTheSpecification(SpecificationSummary specification, SpecificationFundingStatus specificationFundingStatus)
 {
     _specificationFundingStatusService.CheckChooseForFundingStatus(specification)
     .Returns(specificationFundingStatus);
 }
Exemplo n.º 6
0
 private void AndTheSpecificationSummaryConflictsWithAnotherForThatFundingPeriod(ApiSpecificationSummary specificationSummary)
 {
     _specificationFundingStatusService
     .CheckChooseForFundingStatus(Arg.Is(specificationSummary))
     .Returns(SpecificationFundingStatus.SharesAlreadyChosenFundingStream);
 }