public void TryTranslateFunctionSegmentTemplate_ReturnsFalse_WithOptionalParameterMisMatch() { // Arrange EdmModel model = new EdmModel(); _edmFunction.AddOptionalParameter("min", IntType); _edmFunction.AddOptionalParameter("max", IntType); model.AddElement(_edmFunction); IDictionary <string, string> parameters = new Dictionary <string, string> { { "name", "{name}" }, { "title", "{title}" }, { "min", "{min}" }, }; FunctionSegmentTemplate template = new FunctionSegmentTemplate(parameters, _edmFunction, null); RouteValueDictionary routeValues = new RouteValueDictionary(new { name = "'pt'", title = "'abc'", min = "42,max=5" }); ODataTemplateTranslateContext context = new ODataTemplateTranslateContext { RouteValues = routeValues, Model = model }; // Act bool ok = template.TryTranslate(context); // Assert Assert.False(ok); Assert.Empty(context.Segments); }
public void CtorFunctionSegmentTemplate_SetsProperties() { // Arrange & Act FunctionSegmentTemplate segment = new FunctionSegmentTemplate(_edmFunction, null); // Assert Assert.Same(_edmFunction, segment.Function); Assert.Null(segment.NavigationSource); Assert.Collection(segment.ParameterMappings, e => { Assert.Equal("name", e.Key); Assert.Equal("name", e.Value); }, e => { Assert.Equal("title", e.Key); Assert.Equal("title", e.Value); }); // Arrange OperationSegment operationSegment = new OperationSegment(_edmFunction, null); // Act segment = new FunctionSegmentTemplate(operationSegment); // Assert Assert.Same(_edmFunction, segment.Function); Assert.Null(segment.NavigationSource); }
public void TryTranslateFunctionImportSegmentTemplate_ReturnsTemplates_ForEmptyParameter() { // Arrange EdmModel edmModel = new EdmModel(); EdmFunction function = new EdmFunction("NS", "MyFunction", IntType, true, null, false); function.AddParameter("bindingParameter", IntType); edmModel.AddElement(function); FunctionSegmentTemplate template = new FunctionSegmentTemplate(function, null); ODataTemplateTranslateContext context = new ODataTemplateTranslateContext { RouteValues = new RouteValueDictionary(), Model = edmModel }; // Act bool ok = template.TryTranslate(context); // Assert Assert.True(ok); ODataPathSegment actual = Assert.Single(context.Segments); OperationSegment functionSegment = Assert.IsType <OperationSegment>(actual); Assert.Same(function, functionSegment.Operations.First()); Assert.Empty(functionSegment.Parameters); }
public void GetTemplatesFunctionImportSegmentTemplate_ReturnsTemplates_ForEmptyParameter() { // Arrange EdmFunction function = new EdmFunction("NS", "MyFunction", IntType, true, null, false); function.AddParameter("bindingParameter", IntType); FunctionSegmentTemplate functionSegment = new FunctionSegmentTemplate(function, null); // Act & Assert IEnumerable <string> templates = functionSegment.GetTemplates(); Assert.Collection(templates, e => { Assert.Equal("/NS.MyFunction()", e); }, e => { Assert.Equal("/MyFunction()", e); }); // Act & Assert templates = functionSegment.GetTemplates(new ODataRouteOptions { EnableNonParenthesisForEmptyParameterFunction = true, EnableQualifiedOperationCall = false }); string template = Assert.Single(templates); Assert.Equal("/MyFunction", template); }
public void CommonFunctionTemplateProperties_ReturnsAsExpected_WithParameters() { // Assert var primitive = EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.Int32, false); EdmFunction function = new EdmFunction("NS", "MyFunction", primitive, true, null, false); function.AddParameter("bindingParameter", primitive); function.AddParameter("name", primitive); function.AddParameter("title", primitive); function.AddOptionalParameter("option1", primitive); function.AddOptionalParameter("option2", primitive); IDictionary <string, string> parameters = new Dictionary <string, string> { { "name", "{nameTemp}" }, { "title", "{titleTemp}" }, { "option2", "{option2Temp}" }, }; FunctionSegmentTemplate functionSegment = new FunctionSegmentTemplate(parameters, function, null); // Act & Assert Assert.Equal("NS.MyFunction({nameTemp;titleTemp;option2Temp})", functionSegment.Literal); Assert.Equal(ODataSegmentKind.Function, functionSegment.Kind); Assert.True(functionSegment.IsSingle); Assert.Same(primitive.Definition, functionSegment.EdmType); Assert.Null(functionSegment.NavigationSource); }
public void TryTranslateFunctionSegmentTemplate_ThrowsArgumentNull_Context() { // Arrange FunctionSegmentTemplate template = new FunctionSegmentTemplate(_edmFunction, null); // Act & Assert ExceptionAssert.ThrowsArgumentNull(() => template.TryTranslate(null), "context"); }
public void TryTranslateFunctionSegmentTemplate_ReturnsODataFunctionSegment_WithOptionalParameters() { // Arrange EdmModel model = new EdmModel(); _edmFunction.AddOptionalParameter("min", IntType); _edmFunction.AddOptionalParameter("max", IntType); model.AddElement(_edmFunction); IDictionary <string, string> parameters = new Dictionary <string, string> { { "name", "{nameTemp}" }, { "title", "{titleTemp}" }, { "min", "{minTemp}" }, }; FunctionSegmentTemplate template = new FunctionSegmentTemplate(parameters, _edmFunction, null); RouteValueDictionary routeValues = new RouteValueDictionary(new { nameTemp = "'pt'", titleTemp = "'abc'", minTemp = "42" }); ODataTemplateTranslateContext context = new ODataTemplateTranslateContext { RouteValues = routeValues, Model = model }; // Act bool ok = template.TryTranslate(context); // Assert Assert.True(ok); ODataPathSegment actual = Assert.Single(context.Segments); OperationSegment functionSegment = Assert.IsType <OperationSegment>(actual); Assert.Same(_edmFunction, functionSegment.Operations.First()); Assert.Equal(3, functionSegment.Parameters.Count()); Assert.Collection(functionSegment.Parameters, e => { Assert.Equal("name", e.Name); Assert.Equal("pt", e.Value); }, e => { Assert.Equal("title", e.Name); Assert.Equal("abc", e.Value); }, e => { Assert.Equal("min", e.Name); Assert.Equal(42, e.Value); }); }
public void TryTranslateFunctionSegmentTemplate_ReturnsODataFunctionSegment(bool hasRouteData) { // Arrange var primitive = EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.Int32, false); EdmFunction function = new EdmFunction("NS", "MyFunction", primitive, true, null, false); function.AddParameter("bindingParameter", primitive); function.AddParameter("age", primitive); function.AddParameter("price", primitive); FunctionSegmentTemplate template = new FunctionSegmentTemplate(function, null); EdmModel edmModel = new EdmModel(); edmModel.AddElement(function); RouteValueDictionary routeValue; if (hasRouteData) { routeValue = new RouteValueDictionary(new { age = "34", price = "9" }); } else { routeValue = new RouteValueDictionary(); // Empty } ODataTemplateTranslateContext context = new ODataTemplateTranslateContext { RouteValues = routeValue, Model = edmModel }; // Act bool ok = template.TryTranslate(context); // Assert if (hasRouteData) { Assert.True(ok); ODataPathSegment actual = Assert.Single(context.Segments); OperationSegment functionSegment = Assert.IsType <OperationSegment>(actual); Assert.Same(function, functionSegment.Operations.First()); Assert.Equal(2, functionSegment.Parameters.Count()); Assert.Equal(new[] { "age", "price" }, functionSegment.Parameters.Select(p => p.Name)); } else { Assert.False(ok); Assert.Empty(context.Segments); } }
public void Translate_ReturnsODataFunctionSegment(bool hasRouteData) { // Arrange var primitive = EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.Int32, false); EdmFunction function = new EdmFunction("NS", "MyFunction", primitive, true, null, false); function.AddParameter("bindingParameter", primitive); function.AddParameter("age", primitive); function.AddParameter("price", primitive); FunctionSegmentTemplate template = new FunctionSegmentTemplate(function, null); HttpContext httpContext = new Mock <HttpContext>().Object; EdmModel edmModel = new EdmModel(); edmModel.AddElement(function); RouteValueDictionary routeValue; if (hasRouteData) { // routeValue = new RouteValueDictionary(new { age = "34", price = "9" }); routeValue = new RouteValueDictionary { { "age;price", "age=34,price=9" } }; } else { routeValue = new RouteValueDictionary(); // Empty } ODataTemplateTranslateContext context = new ODataTemplateTranslateContext(httpContext, routeValue, edmModel); // Act ODataPathSegment actual = template.Translate(context); // Assert if (hasRouteData) { Assert.NotNull(actual); OperationSegment functionSegment = Assert.IsType <OperationSegment>(actual); Assert.Same(function, functionSegment.Operations.First()); Assert.Equal(2, functionSegment.Parameters.Count()); Assert.Equal(new[] { "age", "price" }, functionSegment.Parameters.Select(p => p.Name)); } else { Assert.Null(actual); } }
public void GetTemplatesFunctionSegmentTemplate_ReturnsTemplates() { // Assert _edmFunction.AddOptionalParameter("option1", IntType); _edmFunction.AddOptionalParameter("option2", IntType); IDictionary <string, string> parameters = new Dictionary <string, string> { { "name", "{nameTemp}" }, { "title", "{titleTemp}" }, { "option2", "{option2Temp}" }, }; FunctionSegmentTemplate functionSegment = new FunctionSegmentTemplate(parameters, _edmFunction, null); // Act & Assert IEnumerable <string> templates = functionSegment.GetTemplates(); Assert.Collection(templates, e => { Assert.Equal("/NS.MyFunction(name={nameTemp},title={titleTemp},option2={option2Temp})", e); }, e => { Assert.Equal("/MyFunction(name={nameTemp},title={titleTemp},option2={option2Temp})", e); }); // Act & Assert templates = functionSegment.GetTemplates(new ODataRouteOptions { EnableUnqualifiedOperationCall = false }); string template = Assert.Single(templates); Assert.Equal("/NS.MyFunction(name={nameTemp},title={titleTemp},option2={option2Temp})", template); // Act & Assert templates = functionSegment.GetTemplates(new ODataRouteOptions { EnableQualifiedOperationCall = false }); template = Assert.Single(templates); Assert.Equal("/MyFunction(name={nameTemp},title={titleTemp},option2={option2Temp})", template); }
public void FunctionCommonProperties_ReturnsAsExpected() { // Assert var primitive = EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.Int32, false); EdmFunction function = new EdmFunction("NS", "MyFunction", primitive, true, null, false); function.AddParameter("bindingParameter", primitive); function.AddParameter("name", primitive); function.AddParameter("title", primitive); FunctionSegmentTemplate functionSegment = new FunctionSegmentTemplate(function, null); // Act & Assert Assert.Equal("NS.MyFunction(name={name},title={title})", functionSegment.Literal); Assert.Equal(ODataSegmentKind.Function, functionSegment.Kind); Assert.True(functionSegment.IsSingle); Assert.Same(primitive.Definition, functionSegment.EdmType); Assert.Null(functionSegment.NavigationSource); }
public void ParseODataUriTemplate_ForFunctions(string template, int count) { // Arrange // function with optional parameters EdmFunction getSalaray = new EdmFunction("NS", "GetWholeSalary", IntType, isBound: true, entitySetPathExpression: null, isComposable: false); getSalaray.AddParameter("entityset", new EdmCollectionTypeReference(new EdmCollectionType(new EdmEntityTypeReference(_customerType, false)))); getSalaray.AddParameter("minSalary", IntType); getSalaray.AddOptionalParameter("maxSalary", IntType); getSalaray.AddOptionalParameter("aveSalary", IntType, "129"); _edmModel.AddElement(getSalaray); IODataPathTemplateParser parser = new DefaultODataPathTemplateParser(); MockServiceProvider sp = null; if (!template.Contains("NS.")) { sp = new MockServiceProvider(_edmModel); } // Act ODataPathTemplate path = parser.Parse(_edmModel, template, sp); // Assert Assert.NotNull(path); Assert.Equal(2, path.Count); FunctionSegmentTemplate functionSegment = Assert.IsType <FunctionSegmentTemplate>(path[1]); Assert.Equal(count, functionSegment.ParameterMappings.Count); if (count == 2) { Assert.Equal(new[] { "minSalary", "maxSalary" }, functionSegment.ParameterMappings.Keys); Assert.Equal(new[] { "min", "max" }, functionSegment.ParameterMappings.Values); } else { Assert.Equal(new[] { "minSalary", "maxSalary", "aveSalary" }, functionSegment.ParameterMappings.Keys); Assert.Equal(new[] { "min", "max", "ave" }, functionSegment.ParameterMappings.Values); } }
public void TryTranslateFunctionSegmentTemplate_ReturnsODataFunctionSegment_UsingEscapedString() { // Arrange var primitive = EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.String, false); EdmFunction function = new EdmFunction("NS", "MyFunction", primitive, true, null, false); function.AddParameter("bindingParameter", primitive); function.AddParameter("name", primitive); FunctionSegmentTemplate template = new FunctionSegmentTemplate(function, null); EdmModel edmModel = new EdmModel(); edmModel.AddElement(function); RouteValueDictionary routeValue = new RouteValueDictionary(new { name = "'Ji%2FChange%23%20T'" }); ODataTemplateTranslateContext context = new ODataTemplateTranslateContext { RouteValues = routeValue, Model = edmModel }; // Act bool ok = template.TryTranslate(context); // Assert Assert.True(ok); ODataPathSegment actual = Assert.Single(context.Segments); OperationSegment functionSegment = Assert.IsType <OperationSegment>(actual); Assert.Same(function, functionSegment.Operations.First()); var parameter = Assert.Single(functionSegment.Parameters); Assert.Equal("name", parameter.Name); Assert.Equal("Ji/Change# T", parameter.Value.ToString()); }
public static ODataOperationSegment ConvertTo(this FunctionSegmentTemplate function) { return(new ODataOperationSegment(function.Function)); }
public static ODataPath Translate(this ODataPathTemplate pathTemplate) { if (pathTemplate.Count == 0) { // It's service root, so far, let's skip it. return(null); } IList <ODataSegment> newSegments = new List <ODataSegment>(); foreach (var segment in pathTemplate) { switch (segment.Kind) { case ODataSegmentKind.Metadata: newSegments.Add(new ODataMetadataSegment()); break; case ODataSegmentKind.EntitySet: EntitySetSegmentTemplate entitySet = (EntitySetSegmentTemplate)segment; newSegments.Add(entitySet.ConvertTo()); break; case ODataSegmentKind.Singleton: SingletonSegmentTemplate singleton = (SingletonSegmentTemplate)segment; newSegments.Add(singleton.ConvertTo()); break; case ODataSegmentKind.Key: KeySegmentTemplate key = (KeySegmentTemplate)segment; newSegments.Add(key.ConvertTo()); break; case ODataSegmentKind.Cast: CastSegmentTemplate cast = (CastSegmentTemplate)segment; newSegments.Add(cast.ConvertTo()); break; case ODataSegmentKind.Property: // TODO: return(null); //PropertySegmentTemplate property = (PropertySegmentTemplate)segment; //newSegments.Add(property.ConvertTo()); //break; case ODataSegmentKind.Navigation: NavigationSegmentTemplate navigation = (NavigationSegmentTemplate)segment; newSegments.Add(navigation.ConvertTo()); break; case ODataSegmentKind.Function: FunctionSegmentTemplate function = (FunctionSegmentTemplate)segment; newSegments.Add(function.ConvertTo()); break; case ODataSegmentKind.Action: ActionSegmentTemplate action = (ActionSegmentTemplate)segment; newSegments.Add(action.ConvertTo()); break; case ODataSegmentKind.FunctionImport: FunctionImportSegmentTemplate functionImport = (FunctionImportSegmentTemplate)segment; newSegments.Add(functionImport.ConvertTo()); break; case ODataSegmentKind.ActionImport: ActionImportSegmentTemplate actionImport = (ActionImportSegmentTemplate)segment; newSegments.Add(actionImport.ConvertTo()); break; case ODataSegmentKind.Value: return(null); //ValueSegmentTemplate value = (ValueSegmentTemplate)segment; //newSegments.Add(value.ConvertTo()); //break; case ODataSegmentKind.Ref: return(null); //KeySegmentTemplate key = (KeySegmentTemplate)segment; //newSegments.Add(key.ConvertTo()); //break; case ODataSegmentKind.NavigationLink: return(null); //NavigationLinkSegmentTemplate navigationLink = (NavigationLinkSegmentTemplate)segment; //newSegments.Add(navigationLink.ConvertTo()); //break; case ODataSegmentKind.Count: CountSegmentTemplate count = (CountSegmentTemplate)segment; newSegments.Add(count.ConvertTo()); break; case ODataSegmentKind.PathTemplate: return(null); //KeySegmentTemplate key = (KeySegmentTemplate)segment; //newSegments.Add(key.ConvertTo()); //break; case ODataSegmentKind.Dynamic: return(null); //KeySegmentTemplate key = (KeySegmentTemplate)segment; //newSegments.Add(key.ConvertTo()); //break; default: throw new NotSupportedException(); } } return(new ODataPath(newSegments)); }