Пример #1
0
        public void CtorKeySegmentTemplate_ForAlternateKey_SetsProperties()
        {
            // Arrange & Act
            IDictionary <string, object> keys = new Dictionary <string, object>
            {
                { "name", BuildExpression("{nameValue}") }
            };
            KeySegment keySegment = new KeySegment(keys, _customerType, _customers);

            IEdmStructuralProperty             nameProperty = _customerType.StructuralProperties().First(c => c.Name == "Name");
            IDictionary <string, IEdmProperty> properties   = new Dictionary <string, IEdmProperty>
            {
                { "name", nameProperty }
            };
            KeySegmentTemplate segmentTemplate = new KeySegmentTemplate(keySegment, properties);

            // Assert
            KeyValuePair <string, string> keyMapping = Assert.Single(segmentTemplate.KeyMappings);

            Assert.Equal("name", keyMapping.Key);
            Assert.Equal("nameValue", keyMapping.Value);

            KeyValuePair <string, IEdmProperty> keyProperty = Assert.Single(segmentTemplate.KeyProperties);

            Assert.Equal("name", keyProperty.Key);
            Assert.Equal("Name", keyProperty.Value.Name);

            Assert.Same(_customers, segmentTemplate.NavigationSource);
            Assert.Same(_customerType, segmentTemplate.EntityType);
            Assert.Equal(1, segmentTemplate.Count);
        }
Пример #2
0
        public void CtorKeySegmentTemplate_SetsProperties()
        {
            // 1) Arrange & Act
            IDictionary <string, string> keys1 = new Dictionary <string, string>
            {
                { "customerId", "{key}" }
            };
            KeySegmentTemplate segment1 = new KeySegmentTemplate(keys1, _customerType, _customers);

            // 2) Arrange & Act
            IDictionary <string, object> keys2 = new Dictionary <string, object>
            {
                { "customerId", BuildExpression("{key}") }
            };
            KeySegment         keySegment = new KeySegment(keys2, _customerType, _customers);
            KeySegmentTemplate segment2   = new KeySegmentTemplate(keySegment);

            // Assert
            foreach (var segment in new[] { segment1, segment2 })
            {
                KeyValuePair <string, string> keyMapping = Assert.Single(segment.KeyMappings);
                Assert.Equal("customerId", keyMapping.Key);
                Assert.Equal("key", keyMapping.Value);

                KeyValuePair <string, IEdmProperty> keyProperty = Assert.Single(segment.KeyProperties);
                Assert.Equal("customerId", keyProperty.Key);
                Assert.Equal("customerId", keyProperty.Value.Name);

                Assert.Same(_customers, segment.NavigationSource);
                Assert.Same(_customerType, segment.EntityType);
                Assert.Equal(1, segment.Count);
            }
        }
        public void GetTemplatesWorksForODataPathWithDollarRefOnSingleNavigation()
        {
            // Arrange
            EdmEntityType customer = new EdmEntityType("NS", "Customer");

            customer.AddKeys(customer.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32));
            EdmEntityContainer container = new EdmEntityContainer("NS", "Default");
            var entitySet  = container.AddEntitySet("Customers", customer);
            var navigation = customer.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo
            {
                TargetMultiplicity = EdmMultiplicity.One,
                Name   = "SubCustomer",
                Target = customer
            });

            ODataPathTemplate template = new ODataPathTemplate(
                new EntitySetSegmentTemplate(entitySet),
                KeySegmentTemplate.CreateKeySegment(customer, entitySet),
                new NavigationLinkSegmentTemplate(navigation, entitySet));

            // Act
            IEnumerable <string> actual = template.GetTemplates();

            // Assert
            Assert.Equal(2, actual.Count());
            Assert.Equal(new[]
            {
                "Customers({key})/SubCustomer/$ref",
                "Customers/{key}/SubCustomer/$ref"
            }, actual);
        }
Пример #4
0
        public void BuildKeyMappingsKeySegmentTemplate_ReturnsKeyMapping_UriTemplateExpression()
        {
            // Arrange
            EdmEntityType         customerType = new EdmEntityType("NS", "Customer");
            EdmStructuralProperty idProperty   = customerType.AddStructuralProperty("customerId", EdmPrimitiveTypeKind.Int32);

            customerType.AddKeys(idProperty);

            UriTemplateExpression tempateExpression = BuildExpression("{yourId}", idProperty.Type);

            IDictionary <string, object> keys = new Dictionary <string, object>
            {
                { "customerId", tempateExpression }
            };

            // Act
            IDictionary <string, string> mapped = KeySegmentTemplate.BuildKeyMappings(keys, customerType);

            // Assert
            Assert.NotNull(mapped);
            KeyValuePair <string, string> actual = Assert.Single(mapped);

            Assert.Equal("customerId", actual.Key);
            Assert.Equal("yourId", actual.Value);
        }
Пример #5
0
        public void CtorKeySegmentTemplate_SetsProperties_ForCompositeKeys()
        {
            // Arrange & Act
            EdmEntityType         customerType  = new EdmEntityType("NS", "Customer");
            EdmStructuralProperty firstProperty = customerType.AddStructuralProperty("firstName", EdmPrimitiveTypeKind.String);
            EdmStructuralProperty lastProperty  = customerType.AddStructuralProperty("lastName", EdmPrimitiveTypeKind.String);

            customerType.AddKeys(firstProperty, lastProperty);
            IDictionary <string, object> keys = new Dictionary <string, object>
            {
                { "firstName", "{key1}" },
                { "lastName", "{key2}" }
            };

            KeySegment         segment  = new KeySegment(keys, customerType, null);
            KeySegmentTemplate template = new KeySegmentTemplate(segment);

            // Assert
            Assert.Collection(template.KeyMappings,
                              e =>
            {
                Assert.Equal("firstName", e.Key);
                Assert.Equal("key1", e.Value);
            },
                              e =>
            {
                Assert.Equal("lastName", e.Key);
                Assert.Equal("key2", e.Value);
            });
        }
        public void Translate_ReturnsODataKeySegment()
        {
            // Arrange
            EdmModel model = new EdmModel();

            model.AddElement(_customerType);
            model.AddElement(_container);

            IDictionary <string, string> keys = new Dictionary <string, string>
            {
                { "customerId", "{key}" }
            };

            RouteValueDictionary routeValueDictionary = new RouteValueDictionary(new { key = "42" });

            KeySegmentTemplate template = new KeySegmentTemplate(keys, _customerType, _customers);

            HttpContext httpContext = new DefaultHttpContext();
            ODataTemplateTranslateContext context = new ODataTemplateTranslateContext(httpContext, routeValueDictionary, model);

            // Act
            ODataPathSegment actual = template.Translate(context);

            // Assert
            Assert.NotNull(actual);
            KeySegment keySegment = Assert.IsType <KeySegment>(actual);
            var        actualKey  = Assert.Single(keySegment.Keys);

            Assert.Equal("customerId", actualKey.Key);
            Assert.Equal(42, actualKey.Value);
        }
Пример #7
0
        public void ParseODataUriTemplate_ForCompositeKeys(string template)
        {
            // Arrange
            // function with optional parameters
            EdmEntityType         person    = new EdmEntityType("NS", "Person");
            EdmStructuralProperty firstName = person.AddStructuralProperty("firstName", EdmPrimitiveTypeKind.String);
            EdmStructuralProperty lastName  = person.AddStructuralProperty("lastName", EdmPrimitiveTypeKind.String);

            person.AddKeys(firstName, lastName);
            _edmModel.AddElement(person);

            EdmEntityContainer container = _edmModel.SchemaElements.OfType <EdmEntityContainer>().First();

            container.AddEntitySet("People", person);

            IODataPathTemplateParser parser = new DefaultODataPathTemplateParser();

            // Act
            ODataPathTemplate path = parser.Parse(_edmModel, template, null);

            // Assert
            Assert.NotNull(path);
            Assert.Equal(2, path.Count);
            KeySegmentTemplate keySegment = Assert.IsType <KeySegmentTemplate>(path[1]);

            Assert.Equal(2, keySegment.KeyMappings.Count);

            Assert.Equal(new[] { "firstName", "lastName" }, keySegment.KeyMappings.Keys);
            Assert.Equal(new[] { "first", "last" }, keySegment.KeyMappings.Values);
        }
Пример #8
0
    public bool AppliesToAction(ODataControllerActionContext context)
    {
        if (context.Action.ActionName == "Get")
        {
            var entitySet  = context.Model.EntityContainer.FindEntitySet("Order Details");
            var route      = new EntitySetSegmentTemplate(entitySet);
            var parameters = context.Action.ActionMethod.GetParameters();
            if (parameters.Length == 0)
            {
                var path = new ODataPathTemplate(route);
                context.Action.AddSelector("get", context.Prefix, context.Model, path, context.Options.RouteOptions);

                return(true);
            }

            if (parameters.Length == 2 &&
                parameters[0].Name == "keyOrderId" &&
                parameters[1].Name == "keyProductId")
            {
                var keys = new Dictionary <string, string> {
                    { "OrderID", "{keyOrderId}" }, { "ProductID", "{keyProductId}" }
                };

                var keyTemplate = new KeySegmentTemplate(keys, entitySet.EntityType(), entitySet);

                var path = new ODataPathTemplate(route, keyTemplate);
                context.Action.AddSelector("get", context.Prefix, context.Model, path, context.Options.RouteOptions);

                return(true);
            }
        }

        return(false);
    }
Пример #9
0
        public void TryTranslateKeySegmentTemplate_ReturnsODataKeySegment()
        {
            // Arrange
            EdmModel model = new EdmModel();

            model.AddElement(_customerType);
            model.AddElement(_container);

            IDictionary <string, string> keys = new Dictionary <string, string>
            {
                { "customerId", "{key}" }
            };

            KeySegmentTemplate            template = new KeySegmentTemplate(keys, _customerType, _customers);
            ODataTemplateTranslateContext context  = new ODataTemplateTranslateContext
            {
                RouteValues = new RouteValueDictionary(new { key = "42" }),
                Model       = model
            };

            // Act
            bool ok = template.TryTranslate(context);

            // Assert
            Assert.True(ok);
            ODataPathSegment actual     = Assert.Single(context.Segments);
            KeySegment       keySegment = Assert.IsType <KeySegment>(actual);
            var actualKey = Assert.Single(keySegment.Keys);

            Assert.Equal("customerId", actualKey.Key);
            Assert.Equal(42, actualKey.Value);
        }
Пример #10
0
        internal static bool ProcessNonNavigationProperty(string httpMethod, ODataControllerActionContext context,
                                                          ActionModel action,
                                                          IEdmNavigationSource navigationSource,
                                                          IEdmEntityType entityType, IEdmStructuredType castType)
        {
            // Action parameter should have a (string navigationProperty) parameter
            if (!action.HasParameter <string>("navigationProperty"))
            {
                return(false);
            }

            // Let's only handle single-key convention, for composite key, use attribute routing or non-generic navigation.
            bool hasRelatedKey = action.Parameters.Any(p => p.Name == "relatedKey"); // case sensitive?
            bool hasRelatedId  = action.Parameters.Any(p => p.Name == "relatedId");

            IList <ODataSegmentTemplate> segments = new List <ODataSegmentTemplate>();

            if (context.EntitySet != null)
            {
                segments.Add(new EntitySetSegmentTemplate(context.EntitySet));
                segments.Add(KeySegmentTemplate.CreateKeySegment(entityType, context.EntitySet));
            }
            else
            {
                segments.Add(new SingletonSegmentTemplate(context.Singleton));
            }

            if (entityType != castType)
            {
                segments.Add(new CastSegmentTemplate(castType, entityType, navigationSource));
            }

            if (hasRelatedKey)
            {
                segments.Add(new NavigationLinkTemplateSegmentTemplate(entityType, navigationSource)
                {
                    RelatedKey = "relatedKey"
                });
            }
            else if (hasRelatedId)
            {
                segments.Add(new NavigationLinkTemplateSegmentTemplate(entityType, navigationSource)
                {
                    RelatedKey = "relatedId"
                });
            }
            else
            {
                segments.Add(new NavigationLinkTemplateSegmentTemplate(entityType, navigationSource));
            }

            ODataPathTemplate template = new ODataPathTemplate(segments);

            action.AddSelector(httpMethod, context.Prefix, context.Model, template, context.Options?.RouteOptions);

            return(true);
        }
Пример #11
0
        public void TryTranslateNavigationLinkSegmentTemplate_ReturnsODataNavigationSegment()
        {
            // Arrange
            EdmModel model = new EdmModel();

            model.AddElement(_employee);

            NavigationLinkSegmentTemplate linkSegment          = new NavigationLinkSegmentTemplate(_navigation, null);
            RouteValueDictionary          routeValueDictionary = new RouteValueDictionary(new { id = "42" });
            ODataTemplateTranslateContext context = new ODataTemplateTranslateContext
            {
                RouteValues = routeValueDictionary,
                Model       = model
            };

            // Without key segment
            // Act & Assert
            bool ok = linkSegment.TryTranslate(context);

            Assert.True(ok);
            ODataPathSegment actual = Assert.Single(context.Segments);
            NavigationPropertyLinkSegment navLinkSegment = Assert.IsType <NavigationPropertyLinkSegment>(actual);

            Assert.Same(_navigation, navLinkSegment.NavigationProperty);
            Assert.Null(navLinkSegment.NavigationSource);

            // With Key segment
            // Act & Assert
            context = new ODataTemplateTranslateContext
            {
                RouteValues = routeValueDictionary,
                Model       = model
            };

            linkSegment.Key = KeySegmentTemplate.CreateKeySegment(_employee, null, "id");
            ok = linkSegment.TryTranslate(context);

            Assert.True(ok);
            Assert.Collection(context.Segments,
                              e =>
            {
                NavigationPropertyLinkSegment navLinkSegment = Assert.IsType <NavigationPropertyLinkSegment>(e);
                Assert.Same(_navigation, navLinkSegment.NavigationProperty);
                Assert.Null(navLinkSegment.NavigationSource);
            },
                              e =>
            {
                KeySegment keySegment             = Assert.IsType <KeySegment>(e);
                KeyValuePair <string, object> key = Assert.Single(keySegment.Keys);
                Assert.Equal("Id", key.Key);
                Assert.Equal(42, key.Value);
            });
        }
Пример #12
0
        public void TryTranslateKeySegmentTemplate_ThrowsArgumentNull_Context()
        {
            // Arrange
            IDictionary <string, string> keys = new Dictionary <string, string>
            {
                { "customerId", "{key}" }
            };
            KeySegmentTemplate keySegment = new KeySegmentTemplate(keys, _customerType, _customers);

            // Act & Assert
            ExceptionAssert.ThrowsArgumentNull(() => keySegment.TryTranslate(null), "context");
        }
Пример #13
0
        private static void AddSelector(string httpMethod, ODataControllerActionContext context, ActionModel action,
                                        IEdmNavigationSource navigationSource,
                                        IEdmStructuralProperty edmProperty,
                                        IEdmType cast, IEdmEntityType declaringType, bool dollarValue, bool dollarCount)
        {
            IEdmEntitySet  entitySet  = navigationSource as IEdmEntitySet;
            IEdmEntityType entityType = navigationSource.EntityType();

            IList <ODataSegmentTemplate> segments = new List <ODataSegmentTemplate>();

            if (entitySet != null)
            {
                segments.Add(new EntitySetSegmentTemplate(entitySet));
                segments.Add(KeySegmentTemplate.CreateKeySegment(entityType, navigationSource));
            }
            else
            {
                segments.Add(new SingletonSegmentTemplate(navigationSource as IEdmSingleton));
            }

            if (declaringType != null && declaringType != entityType)
            {
                segments.Add(new CastSegmentTemplate(declaringType, entityType, navigationSource));
            }

            segments.Add(new PropertySegmentTemplate(edmProperty));

            if (cast != null)
            {
                if (edmProperty.Type.IsCollection())
                {
                    cast = new EdmCollectionType(cast.ToEdmTypeReference(edmProperty.Type.IsNullable));
                }

                // TODO: maybe create the collection type for the collection????
                segments.Add(new CastSegmentTemplate(cast, edmProperty.Type.Definition, navigationSource));
            }

            if (dollarValue)
            {
                segments.Add(new ValueSegmentTemplate(edmProperty.Type.Definition));
            }

            if (dollarCount)
            {
                segments.Add(CountSegmentTemplate.Instance);
            }

            ODataPathTemplate template = new ODataPathTemplate(segments);

            action.AddSelector(httpMethod.NormalizeHttpMethod(), context.Prefix, context.Model, template, context.Options?.RouteOptions);
        }
Пример #14
0
        public void CreateKeySegmentKeySegmentTemplate_ReturnsKeySegmentTemplate()
        {
            // Arrange
            KeySegmentTemplate template = KeySegmentTemplate.CreateKeySegment(_customerType, _customers, "id");

            // Assert
            Assert.NotNull(template);
            Assert.Equal(1, template.Count);
            KeyValuePair <string, string> keyMapping = Assert.Single(template.KeyMappings);

            Assert.Equal("customerId", keyMapping.Key);
            Assert.Equal("id", keyMapping.Value);
        }
Пример #15
0
        public void BuildKeyMappingsKeySegmentTemplate_ThrowsODataException_NullTemplateLiteral()
        {
            // Arrange
            IDictionary <string, object> keys = new Dictionary <string, object>
            {
                { "customerId", null }
            };

            // Act
            Action test = () => KeySegmentTemplate.BuildKeyMappings(keys, _customerType);

            // Assert
            ExceptionAssert.Throws <ODataException>(test, "Key template value '' for key segment 'customerId' does not start with '{' or ends with '}'.");
        }
Пример #16
0
        public void BuildKeyMappingsKeySegmentTemplate_ThrowsODataException_EmptyTemplateLiteral()
        {
            // Arrange
            IDictionary <string, object> keys = new Dictionary <string, object>
            {
                { "customerId", "{}" }
            };

            // Act
            Action test = () => KeySegmentTemplate.BuildKeyMappings(keys, _customerType);

            // Assert
            ExceptionAssert.Throws <ODataException>(test, "Key template value '{}' for key segment 'customerId' is empty.");
        }
Пример #17
0
        public void TryMatch_SingleKey_ReturnsTrueOnMatch()
        {
            KeySegmentTemplate template =
                new KeySegmentTemplate(new KeySegment(new[] { new KeyValuePair <string, object>("ID", "{key}") }, null,
                                                      null));
            KeySegment segment = new KeySegment(new[] { new KeyValuePair <string, object>("ID", 123) }, null, null);

            // Act
            Dictionary <string, object> values = new Dictionary <string, object>();
            bool result = template.TryMatch(segment, values);

            // Assert
            Assert.True(result);
            Assert.Equal(123, values["key"]);
        }
Пример #18
0
        public void TryTranslateKeySegmentTemplate_WorksWithKeyValue_UsingEscapedString()
        {
            // Arrange
            EdmModel              model        = new EdmModel();
            EdmEntityType         customerType = new EdmEntityType("NS", "Customer");
            EdmStructuralProperty firstName    = customerType.AddStructuralProperty("FirstName", EdmPrimitiveTypeKind.String);
            EdmStructuralProperty lastName     = customerType.AddStructuralProperty("LastName", EdmPrimitiveTypeKind.String);

            customerType.AddKeys(firstName, lastName);
            model.AddElement(customerType);
            EdmEntityContainer container = new EdmEntityContainer("NS", "Default");
            EdmEntitySet       customers = container.AddEntitySet("Customers", customerType);

            model.AddElement(container);
            RouteValueDictionary         routeValueDictionary = new RouteValueDictionary(new { First = "'Zhang'", Last = "'Gan%2Fnng%23%20T'" });
            IDictionary <string, string> keys = new Dictionary <string, string>
            {
                { "FirstName", "{first}" },
                { "LastName", "{last}" }
            };
            KeySegmentTemplate template = new KeySegmentTemplate(keys, customerType, customers);

            ODataTemplateTranslateContext context = new ODataTemplateTranslateContext
            {
                RouteValues = routeValueDictionary,
                Model       = model
            };

            // Act
            bool ok = template.TryTranslate(context);

            // Assert
            Assert.True(ok);
            ODataPathSegment actual     = Assert.Single(context.Segments);
            KeySegment       keySegment = Assert.IsType <KeySegment>(actual);

            Assert.Collection(keySegment.Keys,
                              e =>
            {
                Assert.Equal("FirstName", e.Key);
                Assert.Equal("Zhang", e.Value);
            },
                              e =>
            {
                Assert.Equal("LastName", e.Key);
                Assert.Equal("Gan/nng# T", e.Value);
            });
        }
Пример #19
0
        public void GetTemplatesKeySegmentTemplate_ReturnsTemplates_ForCompositeKeys()
        {
            // Arrange
            EdmEntityType         customerType  = new EdmEntityType("NS", "Customer");
            EdmStructuralProperty firstProperty = customerType.AddStructuralProperty("firstName", EdmPrimitiveTypeKind.String);
            EdmStructuralProperty lastProperty  = customerType.AddStructuralProperty("lastName", EdmPrimitiveTypeKind.String);

            customerType.AddKeys(firstProperty, lastProperty);
            IDictionary <string, string> keys = new Dictionary <string, string>
            {
                { "firstName", "{key1}" },
                { "lastName", "{key2}" }
            };

            KeySegmentTemplate keySegment = new KeySegmentTemplate(keys, customerType, null);

            // Act & Assert
            IEnumerable <string> templates = keySegment.GetTemplates();

            Assert.Collection(templates,
                              e =>
            {
                Assert.Equal("(firstName={key1},lastName={key2})", e);
            },
                              e =>
            {
                Assert.Equal("/firstName={key1},lastName={key2}", e);
            });

            // Act & Assert
            templates = keySegment.GetTemplates(new ODataRouteOptions
            {
                EnableKeyAsSegment = false
            });

            string template = Assert.Single(templates);

            Assert.Equal("(firstName={key1},lastName={key2})", template);

            // Act & Assert
            templates = keySegment.GetTemplates(new ODataRouteOptions
            {
                EnableKeyInParenthesis = false
            });

            template = Assert.Single(templates);
            Assert.Equal("/firstName={key1},lastName={key2}", template);
        }
Пример #20
0
        private void AddSelector(string httpMethod, ODataControllerActionContext context, ActionModel action,
                                 IEdmNavigationSource navigationSource, string declared, IEdmEntityType declaringEntityType,
                                 IEdmNavigationProperty navigationProperty, bool hasKey, bool dollarCount)
        {
            IEdmEntitySet  entitySet  = navigationSource as IEdmEntitySet;
            IEdmEntityType entityType = navigationSource.EntityType();

            // Starts the routing template
            IList <ODataSegmentTemplate> segments = new List <ODataSegmentTemplate>();

            if (entitySet != null)
            {
                segments.Add(new EntitySetSegmentTemplate(entitySet));
            }
            else
            {
                segments.Add(new SingletonSegmentTemplate(navigationSource as IEdmSingleton));
            }

            if (hasKey)
            {
                segments.Add(KeySegmentTemplate.CreateKeySegment(entityType, navigationSource));
            }

            if (declared != null)
            {
                // It should be always single type
                if (entityType != declaringEntityType)
                {
                    segments.Add(new CastSegmentTemplate(declaringEntityType, entityType, navigationSource));
                }
            }

            IEdmNavigationSource targetNavigationSource = navigationSource.FindNavigationTarget(navigationProperty, segments, out _);

            segments.Add(new NavigationSegmentTemplate(navigationProperty, targetNavigationSource));

            if (dollarCount)
            {
                segments.Add(CountSegmentTemplate.Instance);
            }

            ODataPathTemplate template = new ODataPathTemplate(segments);

            action.AddSelector(httpMethod.NormalizeHttpMethod(), context.Prefix, context.Model, template, context.RouteOptions);

            Log.AddedODataSelector(_logger, action, template);
        }
Пример #21
0
        public void CreateKeySegmentKeySegmentTemplate_ReturnsKeySegmentTemplate_CompositeKey()
        {
            // Arrange
            EdmEntityType         customerType  = new EdmEntityType("NS", "Customer");
            EdmStructuralProperty firstProperty = customerType.AddStructuralProperty("firstName", EdmPrimitiveTypeKind.String);
            EdmStructuralProperty lastProperty  = customerType.AddStructuralProperty("lastName", EdmPrimitiveTypeKind.String);

            customerType.AddKeys(firstProperty, lastProperty);

            // Act
            KeySegmentTemplate template = KeySegmentTemplate.CreateKeySegment(customerType, null);

            // Assert
            Assert.NotNull(template);
            Assert.Equal(2, template.Count);
        }
Пример #22
0
        public void GetTemplatesWorksForPathWithTypeCastAndFunction()
        {
            // Arrange
            EdmEntityType customer = new EdmEntityType("NS", "Customer");

            customer.AddKeys(customer.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32));

            // VipCustomer
            EdmEntityType vipCustomer = new EdmEntityType("NS", "VipCustomer", customer);

            EdmEntityContainer container = new EdmEntityContainer("NS", "Default");
            var entitySet = container.AddEntitySet("Customers", customer);

            // function with optional parameters
            EdmFunction getSalaray = new EdmFunction("NS", "GetWholeSalary", IntType, isBound: true, entitySetPathExpression: null, isComposable: false);

            getSalaray.AddParameter("entityset", new EdmEntityTypeReference(vipCustomer, false));
            getSalaray.AddParameter("salary", IntType);
            getSalaray.AddOptionalParameter("minSalary", IntType);
            getSalaray.AddOptionalParameter("maxSalary", IntType, "129");

            ODataPathTemplate template = new ODataPathTemplate(
                new EntitySetSegmentTemplate(entitySet),
                KeySegmentTemplate.CreateKeySegment(customer, entitySet),
                new CastSegmentTemplate(vipCustomer, customer, entitySet),
                new FunctionSegmentTemplate(getSalaray, null));

            // Act
            IEnumerable <(string, string)> actual = template.GetTemplates();

            Assert.Equal(4, actual.Count());
            Assert.Equal(new[]
            {
                "Customers({key})/NS.VipCustomer/NS.GetWholeSalary({salary;minSalary;maxSalary})",
                "Customers({key})/NS.VipCustomer/GetWholeSalary({salary;minSalary;maxSalary})",
                "Customers/{key}/NS.VipCustomer/NS.GetWholeSalary({salary;minSalary;maxSalary})",
                "Customers/{key}/NS.VipCustomer/GetWholeSalary({salary;minSalary;maxSalary})",
            }, actual.Select(a => a.Item1));

            Assert.Equal(new[]
            {
                "Customers({key})/NS.VipCustomer/NS.GetWholeSalary(salary={salary},minSalary={minSalary},maxSalary={maxSalary})",
                "Customers({key})/NS.VipCustomer/GetWholeSalary(salary={salary},minSalary={minSalary},maxSalary={maxSalary})",
                "Customers/{key}/NS.VipCustomer/NS.GetWholeSalary(salary={salary},minSalary={minSalary},maxSalary={maxSalary})",
                "Customers/{key}/NS.VipCustomer/GetWholeSalary(salary={salary},minSalary={minSalary},maxSalary={maxSalary})",
            }, actual.Select(a => a.Item2));
        }
Пример #23
0
        public void ParseODataUriTemplate_ForBasicKey(string template)
        {
            // Arrange
            IODataPathTemplateParser parser = new DefaultODataPathTemplateParser();

            // Act
            ODataPathTemplate path = parser.Parse(_edmModel, template, null);

            // Assert
            Assert.NotNull(path);
            Assert.Equal(2, path.Count);
            KeySegmentTemplate keySegment = Assert.IsType <KeySegmentTemplate>(path[1]);
            var keyMap = Assert.Single(keySegment.KeyMappings);

            Assert.Equal("Id", keyMap.Key);
            Assert.Equal("idKey", keyMap.Value);
        }
Пример #24
0
        public void TryTranslateKeySegmentTemplate_ReturnsODataKeySegment_ForKeyAsSegment()
        {
            // Arrange
            EdmModel              model        = new EdmModel();
            EdmEntityType         customerType = new EdmEntityType("NS", "Customer");
            EdmStructuralProperty idProperty   = customerType.AddStructuralProperty("customerId", EdmPrimitiveTypeKind.String);

            customerType.AddKeys(idProperty);
            model.AddElement(customerType);
            EdmEntityContainer container = new EdmEntityContainer("NS", "Default");
            EdmEntitySet       customers = container.AddEntitySet("Customers", customerType);

            model.AddElement(container);
            RouteValueDictionary         routeValueDictionary = new RouteValueDictionary(new { key = "Peter" });
            IDictionary <string, string> keys = new Dictionary <string, string>
            {
                { "customerId", "{key}" }
            };
            KeySegmentTemplate template = new KeySegmentTemplate(keys, customerType, customers);

            RouteEndpoint endpoint = new RouteEndpoint(
                c => Task.CompletedTask,
                RoutePatternFactory.Parse("odata/customers/{key}/Name"),
                0,
                EndpointMetadataCollection.Empty,
                "test");

            ODataTemplateTranslateContext context = new ODataTemplateTranslateContext
            {
                RouteValues = routeValueDictionary,
                Model       = model,
                Endpoint    = endpoint
            };

            // Act
            bool ok = template.TryTranslate(context);

            // Assert
            Assert.True(ok);
            ODataPathSegment actual     = Assert.Single(context.Segments);
            KeySegment       keySegment = Assert.IsType <KeySegment>(actual);
            KeyValuePair <string, object> actualKeys = Assert.Single(keySegment.Keys);

            Assert.Equal("customerId", actualKeys.Key);
            Assert.Equal("Peter", actualKeys.Value);
        }
        public void CommonKeySegmentTemplateProperties_ReturnsAsExpected()
        {
            // Assert
            IDictionary <string, string> keys = new Dictionary <string, string>
            {
                { "customerId", "{key}" }
            };

            // Act
            KeySegmentTemplate template = new KeySegmentTemplate(keys, _customerType, _customers);

            // Assert
            Assert.Equal(ODataSegmentKind.Key, template.Kind);
            Assert.Equal("{key}", template.Literal);
            Assert.True(template.IsSingle);
            Assert.Same(_customerType, template.EdmType);
            Assert.Same(_customers, template.NavigationSource);
        }
Пример #26
0
        public void GetTemplatesNavigationLinkSegmentTemplate_ReturnsTemplates()
        {
            // Arrange
            NavigationLinkSegmentTemplate linkSegment = new NavigationLinkSegmentTemplate(_navigation, null);

            // Act & Assert
            IEnumerable <string> templates = linkSegment.GetTemplates();
            string template = Assert.Single(templates);

            Assert.Equal("/DirectReports/$ref", template);

            // Act & Assert
            linkSegment.Key = KeySegmentTemplate.CreateKeySegment(_employee, null);
            templates       = linkSegment.GetTemplates();
            Assert.Collection(templates,
                              e => Assert.Equal("/DirectReports({key})/$ref", e),
                              e => Assert.Equal("/DirectReports/{key}/$ref", e));
        }
Пример #27
0
        public void TryTranslateKeySegmentTemplate_ReturnsODataKeySegment_ForCompositeKey()
        {
            // Arrange
            EdmModel              model         = new EdmModel();
            EdmEntityType         customerType  = new EdmEntityType("NS", "Customer");
            EdmStructuralProperty firstProperty = customerType.AddStructuralProperty("firstName", EdmPrimitiveTypeKind.String);
            EdmStructuralProperty lastProperty  = customerType.AddStructuralProperty("lastName", EdmPrimitiveTypeKind.String);

            customerType.AddKeys(firstProperty, lastProperty);
            IDictionary <string, string> keys = new Dictionary <string, string>
            {
                { "firstName", "{key1}" },
                { "lastName", "{key2}" }
            };

            model.AddElement(customerType);
            EdmEntityContainer container = new EdmEntityContainer("NS", "Default");
            EdmEntitySet       customers = container.AddEntitySet("Customers", customerType);

            model.AddElement(container);
            RouteValueDictionary routeValueDictionary = new RouteValueDictionary(new { key1 = "'Peter'", key2 = "'Sam'" });

            KeySegmentTemplate template = new KeySegmentTemplate(keys, customerType, customers);

            ODataTemplateTranslateContext context = new ODataTemplateTranslateContext
            {
                RouteValues = routeValueDictionary,
                Model       = model
            };

            // Act
            bool ok = template.TryTranslate(context);

            // Assert
            Assert.True(ok);
            ODataPathSegment actual     = Assert.Single(context.Segments);
            KeySegment       keySegment = Assert.IsType <KeySegment>(actual);

            Assert.Equal(2, keySegment.Keys.Count());
            Assert.Equal(new[] { "firstName", "lastName" }, keySegment.Keys.Select(c => c.Key));
            Assert.Equal(new[] { "Peter", "Sam" }, keySegment.Keys.Select(c => c.Value.ToString()));
        }
Пример #28
0
        public void GetTemplatesKeySegmentTemplate_ReturnsTemplates()
        {
            // Arrange
            IDictionary <string, string> keys = new Dictionary <string, string>
            {
                { "customerId", "{key}" }
            };

            KeySegmentTemplate keySegment = new KeySegmentTemplate(keys, _customerType, _customers);

            // Act & Assert
            IEnumerable <string> templates = keySegment.GetTemplates();

            Assert.Collection(templates,
                              e =>
            {
                Assert.Equal("({key})", e);
            },
                              e =>
            {
                Assert.Equal("/{key}", e);
            });

            // Act & Assert
            templates = keySegment.GetTemplates(new ODataRouteOptions
            {
                EnableKeyAsSegment = false
            });

            string template = Assert.Single(templates);

            Assert.Equal("({key})", template);

            // Act & Assert
            templates = keySegment.GetTemplates(new ODataRouteOptions
            {
                EnableKeyInParenthesis = false
            });

            template = Assert.Single(templates);
            Assert.Equal("/{key}", template);
        }
Пример #29
0
        public void GetTemplatesWorksForBasicPath()
        {
            // Arrange
            EdmEntityType customer = new EdmEntityType("NS", "Customer");

            customer.AddKeys(customer.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32));
            EdmEntityContainer container = new EdmEntityContainer("NS", "Default");
            var entitySet = container.AddEntitySet("Customers", customer);

            ODataPathTemplate template = new ODataPathTemplate(
                new EntitySetSegmentTemplate(entitySet),
                KeySegmentTemplate.CreateKeySegment(customer, entitySet));

            // Act
            IEnumerable <(string, string)> actual = template.GetTemplates();

            // Assert
            Assert.Equal(2, actual.Count());
            Assert.Equal(new[] { "Customers({key})", "Customers/{key}" }, actual.Select(a => a.Item1));
        }
Пример #30
0
        public void BuildKeyMappingsKeySegmentTemplate_ThrowsODataException_NoProperty()
        {
            // Arrange
            IDictionary <string, object> keys = new Dictionary <string, object>
            {
                { "customerId", "{key}" }
            };

            IEdmStructuralProperty             nameProperty = _customerType.StructuralProperties().First(c => c.Name == "Name");
            IDictionary <string, IEdmProperty> properties   = new Dictionary <string, IEdmProperty>
            {
                { "name", nameProperty }
            };

            // Act
            Action test = () => KeySegmentTemplate.BuildKeyMappings(keys, _customerType, properties);

            // Assert
            ExceptionAssert.Throws <ODataException>(test, "Cannot find key 'customerId' in the 'NS.Customer' type.");
        }