public void Can_generate()
        {
            var entityMetadata = new EntityMetadata
            {
                LogicalName = "businessunit",
                SchemaName  = "BusinessUnit"
            };
            var holder = new EntityMetadataHolder(entityMetadata, new LookupAttributeMetadataHolder[0]);

            Assert.Equal(ExpectedTemplate.ExtensionClass, holder.Generate());
        }
        public void Can_convert_to_holders()
        {
            var teamMetadata = new EntityMetadata
            {
                LogicalName = "team",
                SchemaName  = "team"
            };

            typeof(EntityMetadata).GetProperty("Attributes").SetValue(teamMetadata, new AttributeMetadata[] { });

            var userMetadata = new EntityMetadata
            {
                LogicalName = "systemuser",
                SchemaName  = "systemuser"
            };

            typeof(EntityMetadata).GetProperty("Attributes").SetValue(userMetadata, new AttributeMetadata[] { });

            var productNameMetadata = new StringAttributeMetadata
            {
                LogicalName = "xts_name",
                SchemaName  = "xts_name"
            };

            var productMetadata = new EntityMetadata
            {
                LogicalName = "xts_product",
                SchemaName  = "xts_product"
            };

            typeof(EntityMetadata).GetProperty("Attributes").SetValue(productMetadata, new AttributeMetadata[] { productNameMetadata });

            var salesOrderProductMetadata = new LookupAttributeMetadata
            {
                LogicalName = "xts_productid",
                SchemaName  = "xts_productid",
                Targets     = new[] { "xts_product" }
            };

            var salesOrderOwnerMetadata = new LookupAttributeMetadata
            {
                LogicalName = "ownerid",
                SchemaName  = "ownerid",
                Targets     = new[] { "team", "systemuser" }
            };

            var salesOrderNameMetadata = new StringAttributeMetadata
            {
                LogicalName = "xts_name",
                SchemaName  = "xts_name"
            };

            var salesOrderMetadata = new EntityMetadata
            {
                LogicalName = "xts_salesorder",
                SchemaName  = "xts_salesorder"
            };

            typeof(EntityMetadata).GetProperty("Attributes").SetValue(salesOrderMetadata, new AttributeMetadata[]
            {
                salesOrderProductMetadata,
                salesOrderOwnerMetadata,
                salesOrderNameMetadata
            });

            var entitiesMetadata = new[]
            {
                teamMetadata,
                userMetadata,
                productMetadata,
                salesOrderMetadata
            };
            var results = EntityMetadataHolder.Convert(entitiesMetadata);

            Assert.Equal(1, results.Length);
            var entityHolder = results.First();

            Assert.Equal(salesOrderMetadata, entityHolder.EntityMetadata);
            Assert.Equal(3, entityHolder.LookupAttributeMetadataHolders.Length);
            var attributeHolders = entityHolder.LookupAttributeMetadataHolders
                                   .OrderBy(h => h.LookupMetadata.SchemaName)
                                   .ThenBy(h => h.LookupToEntityMetadata.SchemaName)
                                   .ToArray();

            Assert.Equal(salesOrderOwnerMetadata, attributeHolders[0].LookupMetadata);
            Assert.Equal(userMetadata, attributeHolders[0].LookupToEntityMetadata);

            Assert.Equal(salesOrderOwnerMetadata, attributeHolders[1].LookupMetadata);
            Assert.Equal(teamMetadata, attributeHolders[1].LookupToEntityMetadata);

            Assert.Equal(salesOrderProductMetadata, attributeHolders[2].LookupMetadata);
            Assert.Equal(productMetadata, attributeHolders[2].LookupToEntityMetadata);
        }