public void EnsureMetadata_Invalidates_WhenCalculationChanged()
        {
            EntityType type      = null;
            Field      field     = null;
            Field      calcField = null;

            try
            {
                // Create scenario
                type       = new EntityType();
                type.Name  = "CFType";
                field      = new StringField().As <Field>();
                field.Name = "CFField";
                field.Save();
                calcField                   = new StringField().As <Field>();
                calcField.Name              = "CFCalcField";
                calcField.FieldCalculation  = "'A'+CFField";
                calcField.IsCalculatedField = true;
                calcField.Save();
                type.Fields.Add(field);
                type.Fields.Add(calcField);
                type.Save();

                // Get provider
                ICalculatedFieldMetadataProvider provider = Factory.CalculatedFieldMetadataProvider;

                // Run
                CalculatedFieldMetadata res1 = provider.GetCalculatedFieldMetadata(calcField.Id, CalculatedFieldSettings.Default);
                CalculatedFieldMetadata res2 = provider.GetCalculatedFieldMetadata(calcField.Id, CalculatedFieldSettings.Default);

                // Ensure same instance was returned (came from cache)
                Assert.That(res2, Is.SameAs(res1));

                // Delete the field
                calcField.FieldCalculation = "'B'+CFField";
                calcField.Save();

                // Rerun
                CalculatedFieldMetadata res3 = provider.GetCalculatedFieldMetadata(calcField.Id, CalculatedFieldSettings.Default);

                // Ensure different instance was returned (not from cache)
                Assert.That(res3, Is.Not.SameAs(res1));
                Assert.That(res3.Calculation, Is.EqualTo("'B'+CFField")); // because the script is now invalid
            }
            finally
            {
                if (field != null)
                {
                    field.Delete();
                }
                if (calcField != null)
                {
                    calcField.Delete();
                }
                if (type != null)
                {
                    type.Delete();
                }
            }
        }
コード例 #2
0
        public void GetCalculatedFieldMetadata_SingleField_ParseException()
        {
            long fieldId = 123;
            CalculatedFieldSettings settings = new CalculatedFieldSettings();
            Mock <ICalculatedFieldMetadataProvider> mockProvider;
            CalculatedFieldMetadata mockSingleResult;
            IReadOnlyCollection <CalculatedFieldMetadata> mockProviderResult;
            CalculatedFieldMetadata actualResult;
            ParseException          parseException = new ParseException("Test");

            // Mock provider
            mockSingleResult   = new CalculatedFieldMetadata(fieldId, "calc", null, parseException);
            mockProviderResult = new[] { mockSingleResult };
            mockProvider       = new Mock <ICalculatedFieldMetadataProvider>(MockBehavior.Strict);
            mockProvider
            .Setup(p => p.GetCalculatedFieldMetadata(It.Is <IReadOnlyCollection <long> >(fields => fields.Count == 1 && fields.First() == fieldId), settings))
            .Returns(mockProviderResult);

            // Test extension method
            actualResult = mockProvider.Object.GetCalculatedFieldMetadata(fieldId, settings);

            // Verify
            Assert.That(actualResult, Is.EqualTo(mockSingleResult));

            mockProvider.VerifyAll();
        }
        public void EnsureMetadata_Invalidates_WhenFieldRenamedToCorrectName()
        {
            EntityType type      = null;
            Field      field     = null;
            Field      calcField = null;

            try
            {
                // Create scenario
                type       = new EntityType();
                type.Name  = "CFType";
                field      = new StringField().As <Field>();
                field.Name = "CFFieldWrongName";
                field.Save();
                calcField                   = new StringField().As <Field>();
                calcField.Name              = "CFCalcField";
                calcField.FieldCalculation  = "'A'+CFFieldRightName";
                calcField.IsCalculatedField = true;
                calcField.Save();
                type.Fields.Add(field);
                type.Fields.Add(calcField);
                type.Save();

                // Get provider
                ICalculatedFieldMetadataProvider provider = Factory.CalculatedFieldMetadataProvider;

                // Run
                CalculatedFieldMetadata res1 = provider.GetCalculatedFieldMetadata(calcField.Id, CalculatedFieldSettings.Default);
                CalculatedFieldMetadata res2 = provider.GetCalculatedFieldMetadata(calcField.Id, CalculatedFieldSettings.Default);

                // Ensure same instance was returned (came from cache)
                Assert.That(res1.Exception, Is.Not.Null, "res1 should have error"); // because the script is invalid
                Assert.That(res2, Is.SameAs(res1), "res2 should be same as res1");

                // Rename the field
                field.Name = "CFFieldRightName";
                field.Save();

                // Rerun
                CalculatedFieldMetadata res3 = provider.GetCalculatedFieldMetadata(calcField.Id, CalculatedFieldSettings.Default);

                // Ensure different instance was returned (not from cache)
                Assert.That(res3, Is.Not.SameAs(res1), "res3 should be != res1");
                Assert.That(res3.Exception, Is.Null, "res3 should not have error");       // because the script is now fixed
                Assert.That(res3.Expression, Is.Not.Null, "res3 should have expression"); // because the script is now fixed
            }
            finally
            {
                if (field != null)
                {
                    field.Delete();
                }
                if (calcField != null)
                {
                    calcField.Delete();
                }
                if (type != null)
                {
                    type.Delete();
                }
            }
        }