Exemplo n.º 1
0
        public static string AsFormatCalculationType(this object value,
                                                     CalculationValueFormat calculationValueFormat)
        {
            if (value != null)
            {
                switch (calculationValueFormat)
                {
                case CalculationValueFormat.Boolean:
                case CalculationValueFormat.String:
                    return(value?.ToString());

                case CalculationValueFormat.Number:
                case CalculationValueFormat.Percentage:
                case CalculationValueFormat.Currency:
                    if (decimal.TryParse(value?.ToString(), out decimal decimalValue))
                    {
                        return(calculationValueFormat switch
                        {
                            CalculationValueFormat.Number => decimalValue.AsFormattedNumber(),
                            CalculationValueFormat.Percentage => decimalValue.AsFormattedPercentage(),
                            CalculationValueFormat.Currency => decimalValue.AsFormattedMoney(),
                            _ => throw new InvalidOperationException("Unknown calculation type")
                        });
                    }

                    break;
 private string GetSqlDatatypeForCalculation(CalculationValueFormat valueFormat)
 {
     return(valueFormat switch
     {
         var format when format == CalculationValueFormat.Currency ||
         format == CalculationValueFormat.Number ||
         format == CalculationValueFormat.Percentage
         => "[decimal](30, 18)",
         CalculationValueFormat.Boolean => "[bit]",
         CalculationValueFormat.String => "[varchar](128)",
         _ => throw new InvalidOperationException("Unknown value format")
     });
        public async Task DoesNotModifiesCalculationsIfOnTemplateExistsAndHasSameValues()
        {
            uint templateCalculationId1 = (uint)new RandomNumberBetween(1, int.MaxValue);
            uint templateCalculationId2 = (uint)new RandomNumberBetween(1, int.MaxValue);
            uint templateCalculationId3 = (uint)new RandomNumberBetween(1, int.MaxValue);
            uint templateCalculationId4 = (uint)new RandomNumberBetween(1, int.MaxValue);

            string calculationId1 = NewRandomString();
            string calculationId2 = NewRandomString();

            string calculationName1 = NewRandomString();
            string calculationName2 = NewRandomString();

            string newCalculationId1 = NewRandomString();
            string newCalculationId2 = NewRandomString();

            CalculationValueFormat calculationValueFormat1 = CalculationValueFormat.Currency;
            CalculationValueFormat calculationValueFormat2 = CalculationValueFormat.Number;

            TemplateMappingItem mappingWithMissingCalculation1 = NewTemplateMappingItem();
            TemplateMappingItem mappingWithMissingCalculation2 = NewTemplateMappingItem();

            TemplateMapping templateMapping = NewTemplateMapping(_ => _.WithItems(mappingWithMissingCalculation1,
                                                                                  mappingWithMissingCalculation2));

            TemplateMetadataContents templateMetadataContents = NewTemplateMetadataContents(_ => _.WithFundingLines(NewFundingLine(fl =>
                                                                                                                                   fl.WithCalculations(
                                                                                                                                       NewTemplateMappingCalculation(x => x.WithTemplateCalculationId(templateCalculationId1).WithName(calculationName1).WithValueFormat(calculationValueFormat1)),
                                                                                                                                       NewTemplateMappingCalculation(x => x.WithTemplateCalculationId(templateCalculationId2).WithName(calculationName2).WithValueFormat(calculationValueFormat2)),
                                                                                                                                       NewTemplateMappingCalculation(x => x.WithTemplateCalculationId(templateCalculationId3)),
                                                                                                                                       NewTemplateMappingCalculation(x => x.WithTemplateCalculationId(templateCalculationId4))))));
            TemplateCalculation templateCalculationOne = NewTemplateMappingCalculation(_ => _.WithName("template calculation 1"));
            TemplateCalculation templateCalculationTwo = NewTemplateMappingCalculation(_ => _.WithName("template calculation 2"));

            List <Calculation> calculations = new List <Calculation>
            {
                NewCalculation(_ => _.WithId(calculationId1)
                               .WithCurrentVersion(
                                   NewCalculationVersion(x =>
                                                         x.WithCalculationId(calculationId1).WithName(calculationName1).WithValueType(calculationValueFormat1.AsMatchingEnum <CalculationValueType>())))),
                NewCalculation(_ => _.WithId(calculationId2)
                               .WithCurrentVersion(
                                   NewCalculationVersion(x => x.WithCalculationId(calculationId2).WithName(calculationName2).WithValueType(calculationValueFormat2.AsMatchingEnum <CalculationValueType>())))),
            };

            GivenAValidMessage();
            AndTheJobCanBeRun();
            AndTheTemplateMapping(templateMapping);
            AndTheTemplateMetaDataContents(templateMetadataContents);

            CalculationValueType calculationValueTypeOne = templateCalculationOne.ValueFormat.AsMatchingEnum <CalculationValueType>();
            CalculationValueType calculationValueTypeTwo = templateCalculationTwo.ValueFormat.AsMatchingEnum <CalculationValueType>();

            AndTheCalculationIsCreatedForRequestMatching(_ => _.Name == templateCalculationOne.Name &&
                                                         _.SourceCode == calculationValueTypeOne.GetDefaultSourceCode() &&
                                                         _.SpecificationId == _specificationId &&
                                                         _.FundingStreamId == _fundingStreamId &&
                                                         _.ValueType.GetValueOrDefault() == calculationValueTypeOne,
                                                         NewCalculation(_ => _.WithId(newCalculationId1)));
            AndTheCalculationIsCreatedForRequestMatching(_ => _.Name == templateCalculationTwo.Name &&
                                                         _.SourceCode == calculationValueTypeTwo.GetDefaultSourceCode() &&
                                                         _.SpecificationId == _specificationId &&
                                                         _.FundingStreamId == _fundingStreamId &&
                                                         _.ValueType.GetValueOrDefault() == calculationValueTypeTwo,
                                                         NewCalculation(_ => _.WithId(newCalculationId2)));
            AndTheTemplateContentsCalculation(mappingWithMissingCalculation1, templateMetadataContents, templateCalculationOne);
            AndTheTemplateContentsCalculation(mappingWithMissingCalculation2, templateMetadataContents, templateCalculationTwo);

            AndTheCalculations(calculations);
            AndTheSpecificationIsReturned();

            await WhenTheTemplateCalculationsAreApplied();

            mappingWithMissingCalculation1
            .CalculationId
            .Should().Be(newCalculationId1);

            mappingWithMissingCalculation2
            .CalculationId
            .Should().Be(newCalculationId2);

            AndTheTemplateMappingWasUpdated(templateMapping, 1);
            AndTheJobsStartWasLogged();
            AndTheJobCompletionWasLogged();
            AndACalculationRunWasInitialised();

            AndCalculationEdited(_ => _.Name == calculationName1 &&
                                 _.ValueType.GetValueOrDefault() == calculationValueFormat1.AsMatchingEnum <CalculationValueType>() &&
                                 _.Description == null &&
                                 _.SourceCode == null,
                                 calculationId1, 0);

            AndCalculationEdited(_ => _.Name == calculationName2 &&
                                 _.ValueType.GetValueOrDefault() == calculationValueFormat2.AsMatchingEnum <CalculationValueType>() &&
                                 _.Description == null &&
                                 _.SourceCode == null,
                                 calculationId2, 0);
        }
        public async Task ModifiesCalculationsIfOnTemplateExists()
        {
            uint templateCalculationId1 = (uint)new RandomNumberBetween(1, int.MaxValue);
            uint templateCalculationId2 = (uint)new RandomNumberBetween(1, int.MaxValue);

            string calculationId1 = "calculationId1";
            string calculationId2 = "calculationId2";
            string calculationId3 = "calculationId3";

            string calculationName1 = "calculationName1";
            string calculationName2 = "calculationName2";
            string calculationName3 = "calculationName3";

            string newCalculationName1 = "newCalculationName1";
            string newCalculationName2 = "newCalculationName2";

            string newCalculationId4 = "newCalculationId4";
            string newCalculationId5 = "newCalculationId5";

            CalculationValueFormat calculationValueFormat1 = CalculationValueFormat.Currency;
            CalculationValueFormat calculationValueFormat2 = CalculationValueFormat.Number;
            CalculationValueType   calculationValueType3   = CalculationValueType.Percentage;

            TemplateMappingItem mappingWithMissingCalculation1 = NewTemplateMappingItem();
            TemplateMappingItem mappingWithMissingCalculation2 = NewTemplateMappingItem();
            TemplateMappingItem mappingWithMissingCalculation3 = NewTemplateMappingItem(_ =>
            {
                _.WithCalculationId(calculationId3);
                _.WithName(calculationName3);
            });

            TemplateMapping templateMapping = NewTemplateMapping(_ => _.WithItems(mappingWithMissingCalculation1,
                                                                                  NewTemplateMappingItem(mi => mi.WithCalculationId(calculationId1).WithTemplateId(templateCalculationId1)),
                                                                                  mappingWithMissingCalculation2,
                                                                                  NewTemplateMappingItem(mi => mi.WithCalculationId(calculationId2).WithTemplateId(templateCalculationId2)),
                                                                                  mappingWithMissingCalculation3));

            TemplateMetadataContents templateMetadataContents = NewTemplateMetadataContents(_ => _.WithFundingLines(NewFundingLine(fl =>
                                                                                                                                   fl.WithCalculations(
                                                                                                                                       NewTemplateMappingCalculation(),
                                                                                                                                       NewTemplateMappingCalculation(),
                                                                                                                                       NewTemplateMappingCalculation(x => x.WithTemplateCalculationId(templateCalculationId1).WithName(newCalculationName1).WithValueFormat(calculationValueFormat1)),
                                                                                                                                       NewTemplateMappingCalculation(x => x.WithTemplateCalculationId(templateCalculationId2).WithName(newCalculationName2).WithValueFormat(calculationValueFormat2))))));
            TemplateCalculation templateCalculationOne = NewTemplateMappingCalculation(_ => _.WithName("template calculation 1"));
            TemplateCalculation templateCalculationTwo = NewTemplateMappingCalculation(_ => _.WithName("template calculation 2"));

            List <Calculation> calculations = new List <Calculation>
            {
                NewCalculation(_ => _.WithId(calculationId1)
                               .WithCurrentVersion(
                                   NewCalculationVersion(x => x.WithCalculationId(calculationId1).WithName(calculationName1)))),
                NewCalculation(_ => _.WithId(calculationId2)
                               .WithCurrentVersion(
                                   NewCalculationVersion(x => x.WithCalculationId(calculationId2).WithName(calculationName2)))),
            };

            Calculation missingCalculation = NewCalculation(_ => _.WithId(calculationId3)
                                                            .WithCurrentVersion(
                                                                NewCalculationVersion(x =>
            {
                x.WithName(calculationName3);
                x.WithValueType(calculationValueType3);
            })));

            GivenAValidMessage();
            AndTheJobCanBeRun();
            AndTheTemplateMapping(templateMapping);
            AndTheTemplateMetaDataContents(templateMetadataContents);

            CalculationValueType calculationValueTypeOne = templateCalculationOne.ValueFormat.AsMatchingEnum <CalculationValueType>();
            CalculationValueType calculationValueTypeTwo = templateCalculationTwo.ValueFormat.AsMatchingEnum <CalculationValueType>();

            AndTheCalculationIsCreatedForRequestMatching(_ => _.Name == templateCalculationOne.Name &&
                                                         _.SourceCode == calculationValueTypeOne.GetDefaultSourceCode() &&
                                                         _.SpecificationId == _specificationId &&
                                                         _.FundingStreamId == _fundingStreamId &&
                                                         _.ValueType.GetValueOrDefault() == calculationValueTypeOne,
                                                         NewCalculation(_ => _.WithId(newCalculationId4)));
            AndTheCalculationIsEditedForRequestMatching(_ => _.Name == newCalculationName1 &&
                                                        _.ValueType.GetValueOrDefault() == calculationValueFormat1.AsMatchingEnum <CalculationValueType>() &&
                                                        _.Description == null &&
                                                        _.SourceCode == null,
                                                        calculationId1);
            AndTheCalculationIsCreatedForRequestMatching(_ => _.Name == templateCalculationTwo.Name &&
                                                         _.SourceCode == calculationValueTypeTwo.GetDefaultSourceCode() &&
                                                         _.SpecificationId == _specificationId &&
                                                         _.FundingStreamId == _fundingStreamId &&
                                                         _.ValueType.GetValueOrDefault() == calculationValueTypeTwo,
                                                         NewCalculation(_ => _.WithId(newCalculationId5)));
            AndTheCalculationIsEditedForRequestMatching(_ => _.Name == newCalculationName2 &&
                                                        _.ValueType.GetValueOrDefault() == calculationValueFormat2.AsMatchingEnum <CalculationValueType>() &&
                                                        _.Description == null &&
                                                        _.SourceCode == null,
                                                        calculationId2);

            AndTheTemplateContentsCalculation(mappingWithMissingCalculation1, templateMetadataContents, templateCalculationOne);
            AndTheTemplateContentsCalculation(mappingWithMissingCalculation2, templateMetadataContents, templateCalculationTwo);

            AndMissingCalculation(calculationId3, missingCalculation);
            AndTheCalculations(calculations);
            AndTheSpecificationIsReturned();
            AndTheCalculationCodeOnCalculationChangeReturned(calculationId1, newCalculationName1, calculationName1, _specificationId, calculations.Where(_ => _.Id == calculationId1));

            await WhenTheTemplateCalculationsAreApplied();

            mappingWithMissingCalculation1
            .CalculationId
            .Should().Be(newCalculationId4);

            mappingWithMissingCalculation2
            .CalculationId
            .Should().Be(newCalculationId5);

            AndTheCalculationCodeOnCalculationChangeUpdated(calculationId1, newCalculationName1, calculationName1, _specificationId, 1);
            AndTheCalculationCodeOnCalculationChangeUpdated(calculationId2, newCalculationName2, calculationName2, _specificationId, 1);
            AndUpdateBuildProjectCalled(_specificationId, 2);
            AndTheTemplateMappingWasUpdated(templateMapping, 1);
            AndTheJobsStartWasLogged();
            AndTheJobCompletionWasLogged();
            AndACalculationRunWasInitialised();
            AndACodeContextUpdateJobWasQueued();
        }
        public TemplateCalculationBuilder WithValueFormat(CalculationValueFormat valueFormat)
        {
            _valueFormat = valueFormat;

            return(this);
        }