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); }
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()}"); }
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); }