示例#1
0
        public async Task QueueCsvGenerationMessages_GivenSpecificationSummariesFoundAndHasNewResults_CreatesNewMessage()
        {
            //Arrange
            IEnumerable <SpecModel.SpecificationSummary> specificationSummaries = new[]
            {
                new SpecModel.SpecificationSummary {
                    Id = specificationId
                }
            };

            ISpecificationsApiClient specificationsApiClient = CreateSpecificationsApiClient();

            specificationsApiClient
            .GetSpecificationSummaries()
            .Returns(new ApiResponse <IEnumerable <SpecModel.SpecificationSummary> >(HttpStatusCode.OK, specificationSummaries));

            ICalculationResultsRepository calculationResultsRepository = CreateResultsRepository();

            calculationResultsRepository
            .CheckHasNewResultsForSpecificationIdAndTime(
                Arg.Is(specificationId),
                Arg.Any <DateTimeOffset>())
            .Returns(true);

            ILogger logger = CreateLogger();

            IJobManagement jobManagement = CreateJobManagement();

            IBlobClient blobClient = CreateBlobClient();

            blobClient
            .DoesBlobExistAsync($"{CalculationResultsReportFilePrefix}-{specificationId}", CalcsResultsContainerName)
            .Returns(true);

            ResultsService resultsService = CreateResultsService(
                logger,
                specificationsApiClient: specificationsApiClient,
                resultsRepository: calculationResultsRepository,
                jobManagement: jobManagement,
                blobClient: blobClient);

            //Act
            await resultsService.QueueCsvGenerationMessages();

            //Assert
            await
            jobManagement
            .Received(1)
            .QueueJob(
                Arg.Is <JobCreateModel>(_ =>
                                        _.JobDefinitionId == JobConstants.DefinitionNames.GenerateCalcCsvResultsJob &&
                                        _.Properties["specification-id"] == specificationId));

            logger
            .Received()
            .Information($"Found new calculation results for specification id '{specificationId}'");
        }
        public async Task <Job> QueueCsvGenerationMessageIfNewCalculationResults(string specificationId, string specificationName)
        {
            bool hasNewResults = false;

            bool blobExists = await _blobClientPolicy.ExecuteAsync(() =>
                                                                   _blobClient.DoesBlobExistAsync($"{CalculationResultsReportFilePrefix}-{specificationId}", CalcsResultsContainerName));

            if (blobExists)
            {
                ICloudBlob cloudBlob = await _blobClientPolicy.ExecuteAsync(() =>
                                                                            _blobClient.GetBlobReferenceFromServerAsync(
                                                                                $"{CalculationResultsReportFilePrefix}-{specificationId}",
                                                                                CalcsResultsContainerName));

                DateTimeOffset?lastModified = cloudBlob.Properties?.LastModified;

                hasNewResults = await _resultsRepositoryPolicy.ExecuteAsync(
                    () => _resultsRepository.CheckHasNewResultsForSpecificationIdAndTime(specificationId,
                                                                                         lastModified.GetValueOrDefault()));
            }
            else
            {
                // only queue the csv report job if there are calculation results for the specification
                hasNewResults = await _resultsRepositoryPolicy.ExecuteAsync(
                    () => _resultsRepository.ProviderHasResultsBySpecificationId(specificationId));
            }

            if (!hasNewResults)
            {
                _logger.Information(
                    $"No new calculation results for specification id '{specificationId}'. Not queueing report job");

                return(null);
            }

            _logger.Information($"Found new calculation results for specification id '{specificationId}'");

            return(await QueueCsvGenerationMessage(specificationId, specificationName));
        }