public async Task CreatesPublishBatchFundingJobForSpecificationWithSuppliedId()
        {
            string publishFundingJobId = NewRandomString();
            ApiJob publishFundingJob   = NewJob(_ => _.WithId(publishFundingJobId));

            string filteredIdOne = NewRandomString();
            string filteredIdTwo = NewRandomString();

            GivenTheApiResponseDetailsForTheSuppliedId(NewApiSpecificationSummary(_ =>
                                                                                  _.WithIsSelectedForFunding(true)));
            AndTheFilteredListOfPublishedProviderIds(filteredIdOne, filteredIdTwo);

            AndTheApiResponseDetailsForSpecificationsBatchProvidersJob(publishFundingJob, Core.Extensions.JsonExtensions.AsJson(new PublishedProviderIdsRequest
            {
                PublishedProviderIds = new []
                {
                    filteredIdOne,
                    filteredIdTwo
                }
            }));

            await WhenBatchProvidersFundingIsPublished();

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

            ActionResult
            .Should()
            .BeOfType <OkObjectResult>()
            .Which
            .Value
            .Should()
            .BeEquivalentTo(expectedJobCreationResponse);
        }
Beispiel #2
0
        public async Task <IActionResult> PublishBatchProvidersFunding(string specificationId,
                                                                       PublishedProviderIdsRequest publishedProviderIdsRequest,
                                                                       Reference user,
                                                                       string correlationId)
        {
            ValidationResult specificationIdValidationResult = SpecificationIdValidator.Validate(specificationId);

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

            ValidationResult publishedProviderIdsValidationResult = PublishedProviderIdsValidator.Validate(publishedProviderIdsRequest.PublishedProviderIds.ToArray());

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

            IActionResult actionResult = await IsSpecificationReadyForPublish(specificationId, ApprovalMode.Batches);

            if (!actionResult.IsOk())
            {
                return(actionResult);
            }

            await FilterOutPublishedProvidersInError(publishedProviderIdsRequest);

            ApiJob job = await _createBatchPublishProviderFundingJobs.CreateJob(specificationId, user, correlationId, messageBody : JsonExtensions.AsJson(publishedProviderIdsRequest), compress : true);

            return(ProcessJobResponse(job, specificationId, JobConstants.DefinitionNames.PublishBatchProviderFundingJob));
        }
Beispiel #3
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));
        }
Beispiel #5
0
        private void SetupDeleteSpecificationJob(string expectedParentJobId, string specificationId)
        {
            Job createSpecificationJob = NewJob(jobBuilder => jobBuilder.WithId(expectedParentJobId));

            WhenJobIsCreateForARequestModelMatching(
                CreateJobModelMatching(jobCreateModel =>
                                       jobCreateModel.JobDefinitionId == DeleteSpecificationJob &&
                                       HasProperty(jobCreateModel, SpecificationId, specificationId) &&
                                       jobCreateModel.ParentJobId == null),
                createSpecificationJob);
        }
        private void GuardAgainstNullJob(Job job, JobCreateModel createModel)
        {
            if (job != null)
            {
                return;
            }

            var errorMessage = $"Creating job of type {createModel.JobDefinitionId} on specification {createModel.SpecificationId} returned no result";

            _logger.Error(errorMessage);

            throw new Exception(errorMessage);
        }
Beispiel #7
0
        private void SetupDeleteSpecificationChildJobs(string specificationId, string parentJobId)
        {
            foreach (var specificationChildJobDefinition in _specificationChildJobDefinitions)
            {
                Job job = NewJob(jobBuilder => jobBuilder.WithId(NewRandomString()));
                job.ParentJobId = parentJobId;

                WhenJobIsCreateForARequestModelMatching(
                    CreateJobModelMatching(jobCreateModel =>
                                           jobCreateModel.JobDefinitionId == specificationChildJobDefinition.Key &&
                                           jobCreateModel.ParentJobId == parentJobId &&
                                           HasProperty(jobCreateModel, SpecificationId, specificationId)),
                    job);
            }
        }
Beispiel #8
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>();
        }
Beispiel #9
0
        private IActionResult ProcessJobResponse(ApiJob job, string specificationId, string jobType)
        {
            if (job != null)
            {
                JobCreationResponse jobCreationResponse = new JobCreationResponse()
                {
                    JobId = job.Id,
                };

                return(new OkObjectResult(jobCreationResponse));
            }
            else
            {
                string errorMessage = $"Failed to create job of type '{jobType}' on specification '{specificationId}'";

                return(new InternalServerErrorResult(errorMessage));
            }
        }
        public async Task CreatesPublishAllFundingJobForSpecificationWithSuppliedId()
        {
            string publishFundingJobId = NewRandomString();
            ApiJob publishFundingJob   = NewJob(_ => _.WithId(publishFundingJobId));

            GivenTheApiResponseDetailsForTheSuppliedId(NewApiSpecificationSummary(_ =>
                                                                                  _.WithIsSelectedForFunding(true)));
            AndTheApiResponseDetailsForSpecificationsJob(publishFundingJob);

            await WhenAllProvidersFundingIsPublished();

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

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

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

            IActionResult actionResult = await IsSpecificationReadyForPublish(specificationId, ApprovalMode.All);

            if (!actionResult.IsOk())
            {
                return(actionResult);
            }

            ApiJob job = await _createAllPublishProviderFundingJobs.CreateJob(specificationId, user, correlationId);

            return(ProcessJobResponse(job, specificationId, JobConstants.DefinitionNames.PublishAllProviderFundingJob));
        }
Beispiel #12
0
        public async Task <IActionResult> PublishIntegrityCheck(string specificationId,
                                                                Reference user,
                                                                string correlationId,
                                                                bool publishAll = false)
        {
            ValidationResult validationResult = SpecificationIdValidator.Validate(specificationId);

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

            ApiJob job = await _createPublishIntegrityJob.CreateJob(specificationId,
                                                                    user,
                                                                    correlationId,
                                                                    publishAll?new Dictionary <string, string>
            {
                { "publish-all", "True" }
            } :
                                                                    null);

            return(ProcessJobResponse(job, specificationId, JobConstants.DefinitionNames.PublishIntegrityCheckJob));
        }
Beispiel #13
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);
        }
 protected void AndTheApiResponseDetailsForSpecificationsBatchProvidersJob(ApiJob job,
                                                                           string body)
 {
     _createBatchPublishProviderFundingJobs.CreateJob(SpecificationId, User, CorrelationId, null, body, null, true)
     .Returns(job);
 }
Beispiel #15
0
 private void AndTheApiResponseDetailsForApproveSpecificationJob(ApiJob job)
 {
     _approveSpecificationFundingJobs.CreateJob(SpecificationId, User, CorrelationId, null, null)
     .Returns(job);
 }
Beispiel #16
0
 private void WhenJobIsCreateForARequestModelMatching(Expression <Predicate <JobCreateModel> > jobCreateModelMatching, Job job)
 {
     _jobs.QueueJob(Arg.Is(jobCreateModelMatching))
     .Returns(job);
 }
Beispiel #17
0
 private void AndTheApiResponseDetailsForApproveProviderJob(ApiJob job, string body)
 {
     _ = _approveProviderFundingJobs.CreateJob(SpecificationId, User, CorrelationId, null, body, null, true)
         .Returns(job);
 }