public void HasConstraint_ThrowsArgumentNull_ForNullPrincipalPropertyInfo()
        {
            // Arrange
            NavigationPropertyConfiguration navigationProperty =
                new NavigationPropertyConfiguration(new MockPropertyInfo(), EdmMultiplicity.ZeroOrOne,
                                                    new EntityTypeConfiguration());

            // Act & Assert
            Assert.ThrowsArgumentNull(
                () => navigationProperty.HasConstraint(new MockPropertyInfo(), principalPropertyInfo: null),
                "principalPropertyInfo");
        }
        public void HasConstraint_Throws_ReferentialConstraintAlreadyConfigured_Principal()
        {
            // Arrange
            PropertyInfo principalPropertyInfo      = typeof(Principal).GetProperty("PrincipalKey1");
            PropertyInfo dependentPropertyInfo      = typeof(Dependent).GetProperty("DependentKey1");
            PropertyInfo otherPrincipalPropertyInfo = typeof(Dependent).GetProperty("DependentKey2");

            ODataModelBuilder builder = new ODataModelBuilder();

            builder.AddEntityType(typeof(Principal));
            EntityTypeConfiguration         dependentEntity    = builder.AddEntityType(typeof(Dependent));
            NavigationPropertyConfiguration navigationProperty =
                new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One,
                                                    dependentEntity);

            navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo);

            // Act & Assert
            Assert.Throws <InvalidOperationException>(
                () => navigationProperty.HasConstraint(otherPrincipalPropertyInfo, principalPropertyInfo),
                String.Format(SRResources.ReferentialConstraintAlreadyConfigured,
                              "principal", "PrincipalKey1", "dependent", "DependentKey1"));
        }
        public void HasConstraint_CanSetDependentAndPrincipalProperty_OnlyOnceForTheSameConstraint()
        {
            // Arrange
            PropertyInfo      principalPropertyInfo = typeof(Principal).GetProperty("PrincipalKey1");
            PropertyInfo      dependentPropertyInfo = typeof(Dependent).GetProperty("DependentKey1");
            ODataModelBuilder builder = new ODataModelBuilder();

            builder.AddEntityType(typeof(Principal));
            EntityTypeConfiguration         dependentEntity    = builder.AddEntityType(typeof(Dependent));
            NavigationPropertyConfiguration navigationProperty =
                new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One,
                                                    dependentEntity);

            // Act
            navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo);
            navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo);
            navigationProperty.HasConstraint(new KeyValuePair <PropertyInfo, PropertyInfo>(dependentPropertyInfo,
                                                                                           principalPropertyInfo));

            // Assert
            Assert.Single(navigationProperty.PrincipalProperties);
            Assert.Single(navigationProperty.DependentProperties);
        }
        public void HasConstraint_Throws_MultiplicityMany()
        {
            // Arrange
            Mock <EntityTypeConfiguration> entityType = new Mock <EntityTypeConfiguration>();

            entityType.Setup(c => c.ClrType).Returns(typeof(NavigationPropertyConfigurationTest));
            NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(
                new MockPropertyInfo(typeof(List <NavigationPropertyConfigurationTest>), "Navigation"),
                EdmMultiplicity.Many, entityType.Object);

            // Act & Assert
            Assert.Throws <NotSupportedException>(
                () => navigationProperty.HasConstraint(new MockPropertyInfo(), new MockPropertyInfo()),
                String.Format(SRResources.ReferentialConstraintOnManyNavigationPropertyNotSupported,
                              "Navigation", typeof(NavigationPropertyConfigurationTest).FullName));
        }
        public NavigationPropertyConfiguration HasRequired <TTargetEntity>(
            Expression <Func <TEntityType, TTargetEntity> > navigationPropertyExpression,
            Expression <Func <TEntityType, TTargetEntity, bool> > referentialConstraintExpression) where TTargetEntity : class
        {
            NavigationPropertyConfiguration navigation =
                GetOrCreateNavigationProperty(navigationPropertyExpression, EdmMultiplicity.One);

            IDictionary <PropertyInfo, PropertyInfo> referentialConstraints =
                PropertyPairSelectorVisitor.GetSelectedProperty(referentialConstraintExpression);

            foreach (KeyValuePair <PropertyInfo, PropertyInfo> constraint in referentialConstraints)
            {
                navigation.HasConstraint(constraint);
            }

            return(navigation);
        }
        public void HasConstraint_Throws_ReferentialConstraintPropertyTypeNotValid()
        {
            // Arrange
            PropertyInfo principalPropertyInfo = typeof(Principal).GetProperty("MockPrincipal");
            PropertyInfo dependentPropertyInfo = typeof(Dependent).GetProperty("MockDependent");

            ODataModelBuilder builder = new ODataModelBuilder();

            builder.AddEntityType(typeof(Principal));
            EntityTypeConfiguration         dependentEntity    = builder.AddEntityType(typeof(Dependent));
            NavigationPropertyConfiguration navigationProperty =
                new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One,
                                                    dependentEntity);

            // Act & Assert
            Assert.Throws <InvalidOperationException>(
                () => navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo),
                String.Format(SRResources.ReferentialConstraintPropertyTypeNotValid, "System.Web.OData.MockType"));
        }
        public void HasConstraint_Throws_DependentAndPrincipalTypeNotMatch()
        {
            // Arrange
            PropertyInfo principalPropertyInfo = typeof(Principal).GetProperty("PrincipalKey2");
            PropertyInfo dependentPropertyInfo = typeof(Dependent).GetProperty("DependentKey1");

            ODataModelBuilder builder = new ODataModelBuilder();

            builder.AddEntityType(typeof(Principal));
            EntityTypeConfiguration         dependentEntity    = builder.AddEntityType(typeof(Dependent));
            NavigationPropertyConfiguration navigationProperty =
                new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One,
                                                    dependentEntity);

            // Act & Assert
            Assert.Throws <InvalidOperationException>(
                () => navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo),
                String.Format(SRResources.DependentAndPrincipalTypeNotMatch, "System.Int32", "System.String"));
        }
        public void HasConstraint_Throws_ReferentialConstraintPropertyTypeNotValid()
        {
            // Arrange
            PropertyInfo principalPropertyInfo = typeof(Principal).GetProperty("MockPrincipal");
            PropertyInfo dependentPropertyInfo = typeof(Dependent).GetProperty("MockDependent");

            ODataModelBuilder builder = new ODataModelBuilder();
            builder.AddEntityType(typeof(Principal));
            EntityTypeConfiguration dependentEntity = builder.AddEntityType(typeof(Dependent));
            NavigationPropertyConfiguration navigationProperty =
                new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One,
                    dependentEntity);

            // Act & Assert
            Assert.Throws<InvalidOperationException>(
                () => navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo),
                String.Format(SRResources.ReferentialConstraintPropertyTypeNotValid, "System.Web.OData.MockType"));
        }
        public void HasConstraint_Throws_DependentAndPrincipalTypeNotMatch()
        {
            // Arrange
            PropertyInfo principalPropertyInfo = typeof(Principal).GetProperty("PrincipalKey2");
            PropertyInfo dependentPropertyInfo = typeof(Dependent).GetProperty("DependentKey1");

            ODataModelBuilder builder = new ODataModelBuilder();
            builder.AddEntityType(typeof(Principal));
            EntityTypeConfiguration dependentEntity = builder.AddEntityType(typeof(Dependent));
            NavigationPropertyConfiguration navigationProperty =
                new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One,
                    dependentEntity);

            // Act & Assert
            Assert.Throws<InvalidOperationException>(
                () => navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo),
                String.Format(SRResources.DependentAndPrincipalTypeNotMatch, "System.Int32", "System.String"));
        }
        public void HasConstraint_Throws_ReferentialConstraintAlreadyConfigured_Principal()
        {
            // Arrange
            PropertyInfo principalPropertyInfo = typeof(Principal).GetProperty("PrincipalKey1");
            PropertyInfo dependentPropertyInfo = typeof(Dependent).GetProperty("DependentKey1");
            PropertyInfo otherPrincipalPropertyInfo = typeof(Dependent).GetProperty("DependentKey2");

            ODataModelBuilder builder = new ODataModelBuilder();
            builder.AddEntityType(typeof(Principal));
            EntityTypeConfiguration dependentEntity = builder.AddEntityType(typeof(Dependent));
            NavigationPropertyConfiguration navigationProperty =
                new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One,
                    dependentEntity);

            navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo);

            // Act & Assert
            Assert.Throws<InvalidOperationException>(
                () => navigationProperty.HasConstraint(otherPrincipalPropertyInfo, principalPropertyInfo),
                String.Format(SRResources.ReferentialConstraintAlreadyConfigured,
                "principal", "PrincipalKey1", "dependent", "DependentKey1"));
        }
        public void HasConstraint_Throws_MultiplicityMany()
        {
            // Arrange
            Mock<EntityTypeConfiguration> entityType = new Mock<EntityTypeConfiguration>();
            entityType.Setup(c => c.ClrType).Returns(typeof(NavigationPropertyConfigurationTest));
            NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(
                new MockPropertyInfo(typeof(List<NavigationPropertyConfigurationTest>), "Navigation"),
                EdmMultiplicity.Many, entityType.Object);

            // Act & Assert
            Assert.Throws<NotSupportedException>(
                () => navigationProperty.HasConstraint(new MockPropertyInfo(), new MockPropertyInfo()),
                String.Format(SRResources.ReferentialConstraintOnManyNavigationPropertyNotSupported,
                "Navigation", typeof(NavigationPropertyConfigurationTest).FullName));
        }
        public void HasConstraint_ThrowsArgumentNull_ForNullPrincipalPropertyInfo()
        {
            // Arrange
            NavigationPropertyConfiguration navigationProperty =
                new NavigationPropertyConfiguration(new MockPropertyInfo(), EdmMultiplicity.ZeroOrOne,
                    new EntityTypeConfiguration());

            // Act & Assert
            Assert.ThrowsArgumentNull(
                () => navigationProperty.HasConstraint(new MockPropertyInfo(), principalPropertyInfo: null),
                "principalPropertyInfo");
        }
        public void HasConstraint_CanSetDependentAndPrincipalProperty_OnlyOnceForTheSameConstraint()
        {
            // Arrange
            PropertyInfo principalPropertyInfo = typeof(Principal).GetProperty("PrincipalKey1");
            PropertyInfo dependentPropertyInfo = typeof(Dependent).GetProperty("DependentKey1");
            ODataModelBuilder builder = new ODataModelBuilder();
            builder.AddEntityType(typeof(Principal));
            EntityTypeConfiguration dependentEntity = builder.AddEntityType(typeof(Dependent));
            NavigationPropertyConfiguration navigationProperty =
                new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One,
                    dependentEntity);

            // Act
            navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo);
            navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo);
            navigationProperty.HasConstraint(new KeyValuePair<PropertyInfo, PropertyInfo>(dependentPropertyInfo,
                principalPropertyInfo));

            // Assert
            Assert.Single(navigationProperty.PrincipalProperties);
            Assert.Single(navigationProperty.DependentProperties);
        }