public async Task MergeSpecificationInformationMergesCreatesNewMissingProviderWithResultsForSpecificationsForSpecificProviderIdsWhenSupplied()
        {
            string jobId      = NewRandomString();
            string providerId = NewRandomString();

            SpecificationInformation             specificationInformation = NewSpecificationInformation();
            MergeSpecificationInformationRequest mergeRequest             = NewMergeSpecificationInformationRequest(_ => _.WithSpecificationInformation(specificationInformation)
                                                                                                                    .WithProviderIds(providerId));

            DateTimeOffset expectedFundingPeriodEndDate = NewRandomDateTime();

            GivenTheFundingPeriodEndDate(specificationInformation.FundingPeriodId, expectedFundingPeriodEndDate);

            Message message = NewMessage(_ => _.WithUserProperty(JobId, jobId)
                                         .WithUserProperty(ProviderId, providerId)
                                         .WithMessageBody(mergeRequest.AsJsonBytes()));

            await WhenTheSpecificationInformationIsMerged(message);

            ThenTheJobTrackingWasStarted(jobId);

            SpecificationInformation expectedSpecificationInformation = specificationInformation.DeepCopy();

            expectedSpecificationInformation.FundingPeriodEnd = expectedFundingPeriodEndDate;

            AndTheProviderWithResultsForSpecificationsWasUpserted(_ => _.Id == providerId &&
                                                                  HasEquivalentSpecificationInformation(_, expectedSpecificationInformation));
            AndTheJobTrackingWasCompleted(jobId);
        }
Beispiel #2
0
        public override async Task Process(Message message)
        {
            Guard.ArgumentNotNull(message, nameof(message));

            MergeSpecificationInformationRequest mergeRequest = message.GetPayloadAsInstanceOf <MergeSpecificationInformationRequest>();

            await MergeSpecificationInformation(mergeRequest);
        }
        public async Task MergeSpecificationInformationMergesForSpecificProviderIdsWhenSupplied()
        {
            string providerOneId = NewRandomString();
            string providerTwoId = NewRandomString();
            string jobId         = NewRandomString();

            string newFundingStreamIdOne = NewRandomString();
            string newFundingStreamIdTwo = NewRandomString();

            SpecificationInformation specificationInformation = NewSpecificationInformation(_ =>
                                                                                            _.WithFundingStreamIds(newFundingStreamIdOne, newFundingStreamIdTwo));
            MergeSpecificationInformationRequest mergeRequest = NewMergeSpecificationInformationRequest(_ => _.WithSpecificationInformation(specificationInformation)
                                                                                                        .WithProviderIds(providerOneId, providerTwoId));

            SpecificationInformation informationWithoutFundingStreams = specificationInformation.DeepCopy();

            informationWithoutFundingStreams.FundingStreamIds = null;

            ProviderWithResultsForSpecifications providerWithResultsForSpecificationsOne = NewProviderWithResultsForSpecifications(_ =>
                                                                                                                                   _.WithSpecifications(informationWithoutFundingStreams));
            ProviderWithResultsForSpecifications providerWithResultsForSpecificationsTwo = NewProviderWithResultsForSpecifications(_ =>
                                                                                                                                   _.WithSpecifications(informationWithoutFundingStreams));

            GivenTheProviderWithResultsForSpecificationsByProviderId(providerWithResultsForSpecificationsOne, providerOneId);
            GivenTheProviderWithResultsForSpecificationsByProviderId(providerWithResultsForSpecificationsTwo, providerTwoId);

            Message message = NewMessage(_ => _.WithUserProperty(JobId, jobId)
                                         .WithMessageBody(mergeRequest.AsJsonBytes()));

            await WhenTheSpecificationInformationIsMerged(message);

            ThenTheJobTrackingWasStarted(jobId);
            AndTheProviderWithResultsForSpecificationsWereUpserted(providerWithResultsForSpecificationsOne);
            AndTheProviderWithResultsForSpecificationsWereUpserted(providerWithResultsForSpecificationsTwo);

            specificationInformation.IsDirty = true;

            providerWithResultsForSpecificationsOne
            .Specifications
            .Should()
            .BeEquivalentTo(specificationInformation);

            providerWithResultsForSpecificationsTwo
            .Specifications
            .Should()
            .BeEquivalentTo(specificationInformation);

            AndTheJobTrackingWasCompleted(jobId);
        }
        public async Task QueueMergeSpecificationInformationForProviderJobForProvider()
        {
            MergeSpecificationInformationRequest mergeRequest = new MergeSpecificationInformationRequest
            {
                SpecificationInformation = new SpecificationInformation
                {
                    Id = NewRandomString()
                }
            };

            await AssertPutRequest("providers/specifications",
                                   mergeRequest,
                                   HttpStatusCode.OK,
                                   () => _client.QueueMergeSpecificationInformationJob(mergeRequest));
        }
 private void GivenTheJob(Job job,
                          MergeSpecificationInformationRequest mergeRequest,
                          Reference user,
                          string correlationId,
                          string providerId = null)
 {
     _jobs.Setup(_ => _.QueueJob(It.Is <JobCreateModel>(jb =>
                                                        (providerId == null || HasProviderIdInProperties(jb, providerId)) &&
                                                        jb.CorrelationId == correlationId &&
                                                        jb.InvokerUserId == user.Id &&
                                                        jb.InvokerUserDisplayName == user.Name &&
                                                        jb.MessageBody == mergeRequest.AsJson(true) &&
                                                        jb.JobDefinitionId == JobConstants.DefinitionNames.MergeSpecificationInformationForProviderJob)))
     .ReturnsAsync(job);
 }
Beispiel #6
0
        public async Task MergeSpecificationInformation(MergeSpecificationInformationRequest mergeRequest,
                                                        ConcurrentDictionary <string, FundingPeriod> fundingPeriods = null)
        {
            Guard.ArgumentNotNull(mergeRequest, nameof(mergeRequest));

            if (mergeRequest.IsForAllProviders)
            {
                await MergeSpecificationInformationForAllProviders(mergeRequest.SpecificationInformation);
            }
            else
            {
                await MergeSpecificationInformationForProviderBatch(mergeRequest.SpecificationInformation,
                                                                    mergeRequest.ProviderIds,
                                                                    fundingPeriods);
            }
        }
        public async Task QueueMergeSpecificationInformationJobCreatesNewJobWithSuppliedMergeRequest()
        {
            MergeSpecificationInformationRequest mergeRequest = NewMergeSpecificationInformationRequest(_ =>
                                                                                                        _.WithSpecificationInformation(NewSpecificationInformation(si =>
                                                                                                                                                                   si.WithName(NewRandomString())))
                                                                                                        .WithProviderIds(NewRandomString()));
            Job       expectedJob   = NewJob();
            Reference user          = NewUser();
            string    correlationId = NewRandomString();

            GivenTheJob(expectedJob, mergeRequest, user, correlationId);

            OkObjectResult okObjectResult = await WhenTheMergeSpecificationInformationJobIsQueued(mergeRequest, user, correlationId) as OkObjectResult;

            okObjectResult?.Value
            .Should()
            .BeSameAs(expectedJob);
        }
Beispiel #8
0
        public async Task <IActionResult> QueueMergeSpecificationInformationJob(MergeSpecificationInformationRequest mergeRequest,
                                                                                Reference user,
                                                                                string correlationId)
        {
            Guard.ArgumentNotNull(mergeRequest, nameof(mergeRequest));

            JobCreateModel job = new JobCreateModel
            {
                JobDefinitionId        = JobConstants.DefinitionNames.MergeSpecificationInformationForProviderJob,
                InvokerUserId          = user?.Id,
                InvokerUserDisplayName = user?.Name,
                CorrelationId          = correlationId,
                Trigger = new Trigger
                {
                    Message    = "Specification or Results change require merging specification information for providers with results",
                    EntityType = "Specification",
                    EntityId   = mergeRequest.SpecificationInformation.Id
                },
                MessageBody = mergeRequest.AsJson()
            };

            return(new OkObjectResult(await _jobsPolicy.ExecuteAsync(() => _jobs.QueueJob(job))));
        }
Beispiel #9
0
        public async Task <HttpStatusCode> QueueMergeSpecificationInformationJob(MergeSpecificationInformationRequest mergeRequest)
        {
            Guard.ArgumentNotNull(mergeRequest, nameof(mergeRequest));

            return(await PutAsync($"{UrlRoot}/providers/specifications", mergeRequest));
        }
 private async Task WhenTheSpecificationInformationIsMerged(MergeSpecificationInformationRequest mergeRequest,
                                                            ConcurrentDictionary <string, FundingPeriod> fundingPeriods = null)
 => await _service.MergeSpecificationInformation(mergeRequest, fundingPeriods);
 private async Task <IActionResult> WhenTheMergeSpecificationInformationJobIsQueued(MergeSpecificationInformationRequest mergeRequest,
                                                                                    Reference user,
                                                                                    string correlationId)
 => await _service.QueueMergeSpecificationInformationJob(mergeRequest, user, correlationId);
        public async Task MergeSpecificationInformationMergesForAllProviderWhenProviderIdNotSupplied()
        {
            string jobId           = NewRandomString();
            string specificationId = NewRandomString();

            SpecificationInformation             specificationInformation = NewSpecificationInformation(_ => _.WithId(specificationId));
            MergeSpecificationInformationRequest mergeRequest             = NewMergeSpecificationInformationRequest(_ => _.WithSpecificationInformation(specificationInformation));

            ProviderWithResultsForSpecifications providerOne   = NewProviderWithResultsForSpecifications();
            ProviderWithResultsForSpecifications providerTwo   = NewProviderWithResultsForSpecifications();
            ProviderWithResultsForSpecifications providerThree = NewProviderWithResultsForSpecifications();
            ProviderWithResultsForSpecifications providerFour  = NewProviderWithResultsForSpecifications();
            ProviderWithResultsForSpecifications providerFive  = NewProviderWithResultsForSpecifications();
            ProviderWithResultsForSpecifications providerSix   = NewProviderWithResultsForSpecifications();
            ProviderWithResultsForSpecifications providerSeven = NewProviderWithResultsForSpecifications();
            ProviderResult providerResultEight = NewProviderResult();
            ProviderWithResultsForSpecifications providerEight = NewProviderWithResultsForSpecifications(providerInformation: new ProviderInformation {
                Id = providerResultEight.Provider.Id
            });
            ProviderResult providerResultNine = NewProviderResult();
            ProviderWithResultsForSpecifications providerNine = NewProviderWithResultsForSpecifications(providerInformation: new ProviderInformation {
                Id = providerResultNine.Provider.Id
            });

            DateTimeOffset expectedFundingPeriodEndDate = NewRandomDateTime();

            GivenTheFundingPeriodEndDate(specificationInformation.FundingPeriodId, expectedFundingPeriodEndDate);
            AndTheProviderWithResultsForSpecifications(specificationId,
                                                       NewFeedIterator(AsArray(providerOne, providerTwo),
                                                                       AsArray(providerThree, providerFour),
                                                                       AsArray(providerFive, providerSix),
                                                                       AsArray(providerSeven, providerEight)));

            AndTheProviderResultsForSpecification(specificationId, new[] { providerResultEight, providerResultNine });

            Message message = NewMessage(_ => _.WithUserProperty(JobId, jobId)
                                         .WithMessageBody(mergeRequest.AsJsonBytes()));

            await WhenTheSpecificationInformationIsMerged(message);

            ThenTheJobTrackingWasStarted(jobId);

            SpecificationInformation expectedSpecificationInformation = specificationInformation.DeepCopy();

            expectedSpecificationInformation.FundingPeriodEnd = expectedFundingPeriodEndDate;

            AndTheProviderWithResultsForSpecificationsWereUpserted(providerOne,
                                                                   providerTwo);
            AndTheProviderWithResultsForSpecificationsWereUpserted(providerThree,
                                                                   providerFour);
            AndTheProviderWithResultsForSpecificationsWereUpserted(providerFive,
                                                                   providerSix);
            AndTheProviderWithResultsForSpecificationsWereUpserted(providerSeven,
                                                                   providerEight);

            //only upserts dirty records
            AndTheProviderWithResultsForSpecificationsWereNotUpserted(providerNine);

            expectedSpecificationInformation.IsDirty = true;

            AndTheProviderWithResultsForSpecificationsHaveTheEquivalentSpecificationInformation(expectedSpecificationInformation,
                                                                                                providerOne,
                                                                                                providerTwo,
                                                                                                providerThree,
                                                                                                providerFour,
                                                                                                providerFive,
                                                                                                providerSix,
                                                                                                providerSeven);

            AndTheJobTrackingWasCompleted(jobId);
        }