Esempio n. 1
0
        private async Task <IEnumerable <FundingLine> > RemoveFundingLines(IEnumerable <FundingLineCalculationRelationship> fundingLineCalculationRelationships, IEnumerable <FundingLine> allFundingLines)
        {
            IEnumerable <FundingLine> fundingLines = new FundingLine[0];

            // there are no cash funding lines
            if (Common.Extensions.IEnumerableExtensions.IsNullOrEmpty(allFundingLines))
            {
                return(null);
            }

            foreach (FundingLine fundLine in allFundingLines)
            {
                ApiResponse <IEnumerable <ApiEntityFundingLine> > apiResponse = await _resilience.ExecuteAsync(() =>
                                                                                                               _graphApiClient.GetAllEntitiesRelatedToFundingLine(fundLine.FundingLineId));

                IEnumerable <ApiEntityFundingLine> entities = apiResponse?.Content;

                if (Common.Extensions.IEnumerableExtensions.AnyWithNullCheck(entities))
                {
                    fundingLines = fundingLines.Concat(entities.Select(_ => _mapper.Map <FundingLine>(_.Node)));
                }
            }

            // no funding lines exist in the current graph
            if (Common.Extensions.IEnumerableExtensions.IsNullOrEmpty(fundingLines))
            {
                return(null);
            }

            // there are no funding lines in the new set of funding lines so need to delete all current funding lines
            if (Common.Extensions.IEnumerableExtensions.IsNullOrEmpty(fundingLineCalculationRelationships))
            {
                return(fundingLines);
            }

            return(fundingLines.Where(_ => !fundingLineCalculationRelationships.Any(rel => rel.FundingLine.FundingLineId == _.FundingLineId)));
        }
        public async Task DeletesThenInsertsGraphForSpecification(bool withCallsCalculation, bool withBelongsToSpecification, bool withFundingLineRemoval)
        {
            string specificationId = NewRandomString();

            string fundingLineIdOne   = NewRandomString();
            string fundingLineIdTwo   = NewRandomString();
            string fundingLineIdThree = NewRandomString();
            string fundingLineIdFour  = NewRandomString();
            string fundingLineIdFive  = NewRandomString();

            string calculationIdOne   = NewRandomString();
            string calculationIdTwo   = NewRandomString();
            string calculationIdThree = NewRandomString();
            string calculationIdFour  = NewRandomString();
            string calculationIdFive  = NewRandomString();
            string datafieldId        = NewRandomString();

            Specification specification = NewGraphSpecification(_ => _.WithId(specificationId));

            IEnumerable <ApiEntitySpecification> existingEntities = new[] {
                new ApiEntitySpecification {
                    Node = new ApiSpecification {
                        SpecificationId = specificationId
                    },
                    Relationships = withBelongsToSpecification ? new[] {
                        new ApiRelationship {
                            One = NewGraphCalculation(_ => _.WithId(calculationIdFive)), Type = "BelongsToSpecification", Two = specification
                        }
                    } : null
                }
            };

            IEnumerable <ApiEntityCalculation> existingCalculationEntities = new[] { new ApiEntityCalculation
                                                                                     {
                                                                                         Node = new ApiCalculation {
                                                                                             CalculationId = calculationIdFive
                                                                                         },
                                                                                         Relationships = new[] { new ApiRelationship {
                                                                                                                     One = NewGraphCalculation(_ => _.WithId(calculationIdOne)), Type = "ReferencesDataField", Two = NewDataField(_ => _.WithCalculationId(calculationIdOne).WithDataFieldId(datafieldId))
                                                                                                                 } }
                                                                                     } };

            if (withCallsCalculation)
            {
                existingCalculationEntities = existingCalculationEntities.Concat(new[] {
                    new ApiEntityCalculation
                    {
                        Node = new ApiCalculation {
                            SpecificationId = specificationId, CalculationId = calculationIdFour
                        },
                        Relationships = new[] { new ApiRelationship {
                                                    One = NewGraphCalculation(_ => _.WithId(calculationIdFour)), Type = "CallsCalculation", Two = NewGraphCalculation(_ => _.WithId(calculationIdFive))
                                                } }
                    }
                });
            }

            IEnumerable <ApiEntityFundingLine> existingFundingLines = (new[] {
                new ApiEntityFundingLine
                {
                    Node = new ApiFundingLine {
                        FundingLineId = fundingLineIdFive
                    }
                }
            });

            FundingLine[] fundingLines = new[]
            {
                NewGraphFundingLine(_ => _.WithId(fundingLineIdOne)),
                NewGraphFundingLine(_ => _.WithId(fundingLineIdTwo)),
                NewGraphFundingLine(_ => _.WithId(fundingLineIdThree)),
                NewGraphFundingLine(_ => _.WithId(fundingLineIdFour)),
                NewGraphFundingLine(_ => _.WithId(fundingLineIdFive))
            };

            FundingLineCalculationRelationship[] fundingLineRelationships = new[]
            {
                NewFundingLineRelationship(_ => _.WithCalculationOneId(calculationIdOne)
                                           .WithCalculationTwoId(calculationIdOne)
                                           .WithFundingLine(fundingLines[0])),
                NewFundingLineRelationship(_ => _.WithCalculationOneId(calculationIdOne)
                                           .WithCalculationTwoId(calculationIdTwo)
                                           .WithFundingLine(fundingLines[1])),
                NewFundingLineRelationship(_ => _.WithCalculationOneId(calculationIdOne)
                                           .WithCalculationTwoId(calculationIdThree)
                                           .WithFundingLine(fundingLines[2])),
                NewFundingLineRelationship(_ => _.WithCalculationOneId(calculationIdOne)
                                           .WithCalculationTwoId(calculationIdFour)
                                           .WithFundingLine(fundingLines[3]))
            };
            IEnumerable <FundingLine> unusedFundingLines = new FundingLine[0];

            unusedFundingLines = unusedFundingLines.Concat(new[]
            {
                NewGraphFundingLine(_ => _.WithId(fundingLineIdFive))
            });

            Calculation[] calculations = new[]
            {
                NewGraphCalculation(_ => _.WithId(calculationIdOne)),
                NewGraphCalculation(_ => _.WithId(calculationIdTwo)),
                NewGraphCalculation(_ => _.WithId(calculationIdThree)),
                NewGraphCalculation(_ => _.WithId(calculationIdFour)),
            };
            CalculationRelationship[] calculationRelationships = new[]
            {
                NewCalculationRelationship(_ => _.WithCalculationOneId(calculationIdTwo)
                                           .WithCalculationTwoId(calculationIdOne)),
                NewCalculationRelationship(_ => _.WithCalculationOneId(calculationIdThree)
                                           .WithCalculationTwoId(calculationIdTwo)),
                NewCalculationRelationship(_ => _.WithCalculationOneId(calculationIdFour)
                                           .WithCalculationTwoId(calculationIdThree))
            };
            IEnumerable <CalculationRelationship> unusedCalculationRelationships = new CalculationRelationship[0];

            if (withCallsCalculation)
            {
                unusedCalculationRelationships = unusedCalculationRelationships.Concat(new[]
                {
                    NewCalculationRelationship(_ => _.WithCalculationOneId(calculationIdFour)
                                               .WithCalculationTwoId(calculationIdFive))
                });
            }

            CalculationDataFieldRelationship[] dataFieldRelationships = calculations.Select(_ => new CalculationDataFieldRelationship
            {
                Calculation = _,
                DataField   = NewDataField(datafieldBuilder =>
                                           datafieldBuilder.WithCalculationId(_.CalculationId))
            }).ToArray();

            Dataset newDataset = NewDataset();

            DatasetDataFieldRelationship[] datasetDataFieldRelationships = dataFieldRelationships.Select(_ => new DatasetDataFieldRelationship
            {
                DataField = _.DataField,
                Dataset   = newDataset
            }).ToArray();

            DatasetDefinition newDatasetDefinition = NewDatasetDefinition();

            DatasetDatasetDefinitionRelationship[] datasetDatasetDefinitionRelationships = datasetDataFieldRelationships.Select(_ => new DatasetDatasetDefinitionRelationship
            {
                Dataset           = _.Dataset,
                DatasetDefinition = newDatasetDefinition
            }).ToArray();

            CalculationDataFieldRelationship[] unusedDataFieldRelationships = new[] { new CalculationDataFieldRelationship
                                                                                      {
                                                                                          Calculation = NewGraphCalculation(_ => _.WithId(calculationIdOne)),
                                                                                          DataField   = NewDataField(datasetBuilder =>
                                                                                                                     datasetBuilder.WithCalculationId(calculationIdOne).WithDataFieldId(datafieldId))
                                                                                      } };

            SpecificationCalculationRelationships specificationCalculationRelationships = NewSpecificationCalculationRelationships(_ =>
                                                                                                                                   _.WithSpecification(specification)
                                                                                                                                   .WithCalculations(calculations)
                                                                                                                                   .WithFundingLines(fundingLines)
                                                                                                                                   .WithFundingLineCalculationRelationships(fundingLineRelationships)
                                                                                                                                   .WithCalculationRelationships(calculationRelationships)
                                                                                                                                   .WithCalculationDataFieldRelationships(dataFieldRelationships)
                                                                                                                                   .WithDatasetDataFieldRelationships(datasetDataFieldRelationships)
                                                                                                                                   .WithDatasetDatasetDefinitionRelationships(datasetDatasetDefinitionRelationships));

            ApiSpecification apiSpecification = NewApiSpecification();

            ApiCalculation[] apiCalculations = new[]
            {
                NewApiCalculation(),
                NewApiCalculation(),
                NewApiCalculation()
            };

            ApiFundingLine[] apiFundingLines = new[]
            {
                NewApiFundingLine(_ => _.WithId(fundingLineIdOne)),
                NewApiFundingLine(_ => _.WithId(fundingLineIdTwo)),
                NewApiFundingLine(_ => _.WithId(fundingLineIdThree)),
                NewApiFundingLine(_ => _.WithId(fundingLineIdFour)),
                NewApiFundingLine(_ => _.WithId(fundingLineIdFive))
            };

            GivenTheMapping(specification, apiSpecification);

            foreach (CalculationDataFieldRelationship datFieldRelationship in dataFieldRelationships)
            {
                AndTheMapping(datFieldRelationship.DataField, new ApiDataField
                {
                    CalculationId = datFieldRelationship.DataField.CalculationId,
                    DataFieldId   = datFieldRelationship.DataField.DataFieldId,
                    DataFieldName = datFieldRelationship.DataField.DataFieldName
                });
            }

            AndTheMapping(newDataset, new ApiDataSet
            {
                DatasetId = newDataset.DatasetId,
                Name      = newDataset.Name
            });

            AndTheMapping(newDatasetDefinition, new ApiDatasetDefinition
            {
                DatasetDefinitionId = newDatasetDefinition.DatasetDefinitionId,
                Name = newDatasetDefinition.Name
            });

            if (withFundingLineRemoval)
            {
                AndTheMapping(existingFundingLines.Select(_ => _.Node).First(), unusedFundingLines.First());
            }

            foreach (FundingLine fundingLine in fundingLines.Where(_ => !unusedFundingLines.Any(uf => uf.FundingLineId == _.FundingLineId)))
            {
                AndTheMapping(fundingLine, apiFundingLines.Where(_ => _.FundingLineId == fundingLine.FundingLineId).First());
            }

            AndTheCollectionMapping(calculations, apiCalculations);
            AndTheSpecificationRelationshipsAreDeleted(calculationIdFive, specificationId, unusedCalculationRelationships, unusedDataFieldRelationships, withBelongsToSpecification);

            if (withFundingLineRemoval)
            {
                AndTheFundingLinesAreDeleted(unusedFundingLines.ToArray());
            }

            AndTheSpecificationIsCreated(apiSpecification);
            AndTheCalculationsAreCreated(apiCalculations);
            AndTheFundingLinesAreCreated(apiFundingLines.Where(_ => !unusedFundingLines.Any(uf => uf.FundingLineId == _.FundingLineId)).ToArray());
            AndTheSpecificationCalculationRelationshipsWereCreated(specificationId, new []
            {
                calculationIdOne,
                calculationIdTwo,
                calculationIdThree,
                calculationIdFour
            });
            AndTheFundingLineCalculationRelationshipsWereCreated(calculationIdOne, fundingLines.Select(_ => _.FundingLineId).ToArray(), calculations.Select(_ => _.CalculationId).ToArray());
            AndTheExistingRelationships(specificationId, existingEntities);
            AndTheExistingCalculationRelationships(calculationIdOne, existingCalculationEntities);

            if (withFundingLineRemoval)
            {
                AndTheExistingFundingLines(existingFundingLines);
            }

            AndTheRelationshipsWereCreated(calculationRelationships);
            AndTheDataFieldRelationshipsWereCreated(dataFieldRelationships);
            AndTheDatasetDataFieldRelationshipsWereCreated(datasetDataFieldRelationships, specificationId);
            AndTheDatasetDatasetDefinitionRelationshipsWereCreated(datasetDatasetDefinitionRelationships);

            SpecificationCalculationRelationships specificationUnusedCalculationRelationships = await WhenTheUnusedRelationshipsAreReturned(specificationCalculationRelationships);

            await AndTheGraphIsRecreated(specificationCalculationRelationships, specificationUnusedCalculationRelationships);

            _graphApiClient.VerifyAll();
        }