Exemple #1
0
 public static string GetDefaultSourceCode(this CalculationValueType calculationValueType)
 {
     return(calculationValueType switch
     {
         CalculationValueType.Number => "Return 0",
         CalculationValueType.Percentage => "Return 0",
         CalculationValueType.Currency => "Return 0",
         CalculationValueType.Boolean => "Return False",
         CalculationValueType.String => "Return Nothing",
         _ => throw new NotImplementedException(),
     });
Exemple #2
0
 public static CalculationDataType ToCalculationDataType(this CalculationValueType calculationValueType)
 {
     return(calculationValueType switch
     {
         CalculationValueType.Number => CalculationDataType.Decimal,
         CalculationValueType.Percentage => CalculationDataType.Decimal,
         CalculationValueType.Currency => CalculationDataType.Decimal,
         CalculationValueType.Boolean => CalculationDataType.Boolean,
         CalculationValueType.String => CalculationDataType.String,
         _ => throw new ArgumentOutOfRangeException(),
     });
Exemple #3
0
        public CalculationVersionBuilder WithValueType(CalculationValueType calculationValueType)
        {
            _calculationValueType = calculationValueType;

            return(this);
        }
        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 async Task CreatesCalculationsIfOnTemplateMappingButDontExistYet()
        {
            TemplateMappingItem mappingWithMissingCalculation1 = NewTemplateMappingItem();
            TemplateMappingItem mappingWithMissingCalculation2 = NewTemplateMappingItem();
            TemplateMappingItem mappingWithMissingCalculation3 = NewTemplateMappingItem();
            TemplateMappingItem mappingWithMissingCalculation4 = NewTemplateMappingItem();

            TemplateMapping templateMapping = NewTemplateMapping(_ => _.WithItems(mappingWithMissingCalculation1,
                                                                                  NewTemplateMappingItem(mi => mi.WithCalculationId(NewRandomString())),
                                                                                  mappingWithMissingCalculation2,
                                                                                  NewTemplateMappingItem(mi => mi.WithCalculationId(NewRandomString())),

                                                                                  mappingWithMissingCalculation3,
                                                                                  NewTemplateMappingItem(mi => mi.WithCalculationId(NewRandomString())),
                                                                                  mappingWithMissingCalculation4));

            TemplateMetadataContents templateMetadataContents = NewTemplateMetadataContents(_ => _.WithFundingLines(NewFundingLine(fl =>
                                                                                                                                   fl.WithCalculations(
                                                                                                                                       NewTemplateMappingCalculation(c1 =>
            {
                c1.WithCalculations(NewTemplateMappingCalculation(c4 => c4.WithTemplateCalculationId(4)));
                c1.WithTemplateCalculationId(1);
            }),
                                                                                                                                       NewTemplateMappingCalculation(c2 => c2.WithTemplateCalculationId(2)),
                                                                                                                                       NewTemplateMappingCalculation(c3 => c3.WithTemplateCalculationId(3)),
                                                                                                                                       NewTemplateMappingCalculation(c4 => c4.WithTemplateCalculationId(4)
                                                                                                                                                                     .WithType(Common.TemplateMetadata.Enums.CalculationType.Enum)
                                                                                                                                                                     .WithAllowedEnumTypeValues(new List <string>()
            {
                "Type1", "Type2", "Type3"
            })
                                                                                                                                                                     .WithValueFormat(CalculationValueFormat.String))
                                                                                                                                       ))));
            TemplateCalculation templateCalculationOne   = NewTemplateMappingCalculation(_ => _.WithName("template calculation 1"));
            TemplateCalculation templateCalculationTwo   = NewTemplateMappingCalculation(_ => _.WithName("template calculation 2"));
            TemplateCalculation templateCalculationThree = NewTemplateMappingCalculation(_ => _.WithName("template calculation 3"));
            TemplateCalculation templateCalculationFour  = NewTemplateMappingCalculation(_ => _.WithName("template calculation 4"));

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

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

            CalculationValueType calculationValueTypeOne   = templateCalculationOne.ValueFormat.AsMatchingEnum <CalculationValueType>();
            CalculationValueType calculationValueTypeTwo   = templateCalculationTwo.ValueFormat.AsMatchingEnum <CalculationValueType>();
            CalculationValueType calculationValueTypeThree = templateCalculationThree.ValueFormat.AsMatchingEnum <CalculationValueType>();
            CalculationValueType calculationValueTypeFour  = templateCalculationFour.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)));
            AndTheCalculationIsCreatedForRequestMatching(_ => _.Name == templateCalculationThree.Name &&
                                                         _.SourceCode == calculationValueTypeThree.GetDefaultSourceCode() &&
                                                         _.SpecificationId == _specificationId &&
                                                         _.FundingStreamId == _fundingStreamId &&
                                                         _.ValueType.GetValueOrDefault() == calculationValueTypeThree,
                                                         NewCalculation(_ => _.WithId(newCalculationId3)));
            AndTheCalculationIsCreatedForRequestMatching(_ => _.Name == templateCalculationFour.Name &&
                                                         _.SourceCode == calculationValueTypeFour.GetDefaultSourceCode() &&
                                                         _.SpecificationId == _specificationId &&
                                                         _.FundingStreamId == _fundingStreamId &&
                                                         _.ValueType.GetValueOrDefault() == calculationValueTypeFour,
                                                         NewCalculation(_ => _.WithId(newCalculationId4)));
            AndTheTemplateContentsCalculation(mappingWithMissingCalculation1, templateMetadataContents, templateCalculationOne);
            AndTheTemplateContentsCalculation(mappingWithMissingCalculation2, templateMetadataContents, templateCalculationTwo);
            AndTheTemplateContentsCalculation(mappingWithMissingCalculation3, templateMetadataContents, templateCalculationThree);
            AndTheTemplateContentsCalculation(mappingWithMissingCalculation4, templateMetadataContents, templateCalculationFour);
            AndTheSpecificationIsReturned();

            await WhenTheTemplateCalculationsAreApplied();

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

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

            mappingWithMissingCalculation3
            .CalculationId
            .Should().Be(newCalculationId3);

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

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