private Task ConsumeSpecificationInformation(CancellationToken cancellationToken,
                                                     dynamic context,
                                                     IEnumerable <MergeSpecificationRequest> items)
        {
            ConcurrentDictionary <string, FundingPeriod> fundingPeriods = ((MergeContext)context).FundingPeriods;

            foreach (MergeSpecificationRequest mergeSpecificationRequest in items)
            {
                SpecificationInformation requestSpecificationInformation = mergeSpecificationRequest.SpecificationInformation;

                _logger.Information($"Merging specification information {requestSpecificationInformation.Name} for provider id {mergeSpecificationRequest.ProviderId}");

                ProviderWithResultsForSpecifications providerWithResultsForSpecifications = GetProviderWithResultsForSpecificationsForProviderId(mergeSpecificationRequest.ProviderId);

                SpecificationInformation specificationInformation = new SpecificationInformation
                {
                    Id               = requestSpecificationInformation.Id,
                    Name             = requestSpecificationInformation.Name,
                    LastEditDate     = requestSpecificationInformation.LastEditDate,
                    FundingPeriodId  = requestSpecificationInformation.FundingPeriodId,
                    FundingPeriodEnd = fundingPeriods.TryGetValue(requestSpecificationInformation.FundingPeriodId, out FundingPeriod fundingPeriod) ? fundingPeriod.EndDate : (DateTimeOffset?)null
                };

                providerWithResultsForSpecifications.MergeSpecificationInformation(specificationInformation);
            }

            return(Task.CompletedTask);
        }
Example #2
0
        private async Task MergeSpecificationInformationForProviderBatch(SpecificationInformation specificationInformation,
                                                                         IEnumerable <string> providerIds,
                                                                         ConcurrentDictionary <string, FundingPeriod> fundingPeriods)
        {
            LogInformation($"Merging specification information for specification {specificationInformation.Id} into summary for provider batch with length {providerIds.Count()}");

            foreach (string providerId in providerIds)
            {
                LogInformation($"Merging specification information for specification {specificationInformation.Id} into summary for provider {providerId}");

                ProviderWithResultsForSpecifications providerWithResultsForSpecifications = await GetProviderWithResultsByProviderId(providerId);

                providerWithResultsForSpecifications ??= new ProviderWithResultsForSpecifications
                {
                    Provider = new ProviderInformation
                    {
                        Id = providerId
                    }
                };

                await EnsureFundingPeriodEndDateQueried(specificationInformation, fundingPeriods);

                providerWithResultsForSpecifications.MergeSpecificationInformation(specificationInformation);

                if (providerWithResultsForSpecifications.GetIsDirty())
                {
                    await _results.UpsertSpecificationWithProviderResults(providerWithResultsForSpecifications);
                }
            }

            LogInformation($"Completed merging specification information for specification {specificationInformation.Id} into summary for provider batch with length {providerIds.Count()}");
        }
Example #3
0
        public async Task <IActionResult> GetSpecificationsWithProviderResultsForProviderId(string providerId)
        {
            Guard.IsNullOrWhiteSpace(providerId, nameof(providerId));

            ProviderWithResultsForSpecifications providerWithResultsForSpecifications = await GetProviderWithResultsByProviderId(providerId);

            if (providerWithResultsForSpecifications == null)
            {
                return(new NotFoundResult());
            }

            return(new OkObjectResult(providerWithResultsForSpecifications.Specifications?.ToArray() ?? new SpecificationInformation[0]));
        }
        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);
        }
        private bool HasEquivalentSpecificationInformation(ProviderWithResultsForSpecifications providerWithResultsForSpecifications,
                                                           params SpecificationInformation[] specifications)
        {
            foreach (SpecificationInformation specificationInformation in specifications)
            {
                if (providerWithResultsForSpecifications.Specifications.Count(_ => _.Id == specificationInformation.Id &&
                                                                              _.Name == specificationInformation.Name &&
                                                                              _.FundingPeriodId == specificationInformation.FundingPeriodId &&
                                                                              _.FundingPeriodEnd == specificationInformation.FundingPeriodEnd &&
                                                                              _.LastEditDate == specificationInformation.LastEditDate) != 1)
                {
                    return(false);
                }
            }

            return(providerWithResultsForSpecifications.Specifications.Count() == specifications.Length);
        }
 private void GivenTheProviderWithResultsForSpecificationsByProviderId(ProviderWithResultsForSpecifications providerWithResultsForSpecifications,
                                                                       string providerId)
 {
     _calculationResults.Setup(_ => _.GetProviderWithResultsForSpecificationsByProviderId(providerId))
     .ReturnsAsync(providerWithResultsForSpecifications);
 }
 private void AndTheProviderWithResultsForSpecificationsWereUpserted(ProviderWithResultsForSpecifications providerWithResultsForSpecification)
 {
     _calculationResults.Verify(_ => _.UpsertSpecificationWithProviderResults(It.Is <ProviderWithResultsForSpecifications[]>(results =>
                                                                                                                             results.First().Provider.Id == providerWithResultsForSpecification.Provider.Id)),
                                Times.Once);
 }
        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);
        }