public void UnboundFunction_ForEnumTypeInODataConventionModelBuilder() { // Arrange ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); FunctionConfiguration functionConfiguration = builder.Function("UnboundFunction"); functionConfiguration.Parameter <Color>("Color"); functionConfiguration.ReturnsCollection <Color>(); // Act & Assert IEdmModel model = builder.GetEdmModel(); IEdmFunctionImport functionImport = model.EntityContainer.OperationImports().Single(o => o.Name == "UnboundFunction") as IEdmFunctionImport; IEdmTypeReference color = functionImport.Function.Parameters.Single(p => p.Name == "Color").Type; IEdmTypeReference returnType = functionImport.Function.ReturnType; IEdmEnumType colorType = model.SchemaElements.OfType <IEdmEnumType>().Single(e => e.Name == "Color"); Assert.Same(colorType, color.Definition); Assert.True(returnType.IsCollection()); Assert.Same(colorType, returnType.AsCollection().ElementType().Definition); }
public void WhenFunctionLinksNotManuallyConfigured_ConventionBasedBuilderUsesConventions() { // Arrange string uriTemplate = "http://server/Movies({0})/Default.Watch(param=@param)"; Uri expectedUri = new Uri(string.Format(uriTemplate, 1)); ODataModelBuilder builder = new ODataConventionModelBuilder(); EntityTypeConfiguration <Movie> movie = builder.EntitySet <Movie>("Movies").EntityType; FunctionConfiguration watch = movie.Function("Watch").Returns <int>(); watch.Parameter <string>("param"); IEdmModel model = builder.GetEdmModel(); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://server/Movies"); HttpConfiguration configuration = new HttpConfiguration(); string routeName = "Route"; configuration.MapODataServiceRoute(routeName, null, model); request.SetConfiguration(configuration); request.ODataProperties().RouteName = routeName; UrlHelper urlHelper = new UrlHelper(request); // Act IEdmEntityType movieType = model.SchemaElements.OfType <IEdmEntityType>().SingleOrDefault(); IEdmEntityContainer container = model.SchemaElements.OfType <IEdmEntityContainer>().SingleOrDefault(); IEdmFunction watchFunction = Assert.Single(model.SchemaElements.OfType <IEdmFunction>()); // Guard IEdmEntitySet entitySet = container.EntitySets().SingleOrDefault(); ODataSerializerContext serializerContext = new ODataSerializerContext { Model = model, NavigationSource = entitySet, Url = urlHelper }; EntityInstanceContext context = new EntityInstanceContext(serializerContext, movieType.AsReference(), new Movie { ID = 1, Name = "Avatar" }); FunctionLinkBuilder functionLinkBuilder = model.GetAnnotationValue <FunctionLinkBuilder>(watchFunction); //Assert Assert.Equal(expectedUri, watch.GetFunctionLink()(context)); Assert.NotNull(functionLinkBuilder); Assert.Equal(expectedUri, functionLinkBuilder.BuildFunctionLink(context)); }
public void WhenFeedActionLinksNotManuallyConfigured_ConventionBasedBuilderUsesConventions() { // Arrange Uri expectedUri = new Uri("http://server/Movies/Default.Watch(param=@param)"); ODataModelBuilder builder = new ODataConventionModelBuilder(); EntityTypeConfiguration <Movie> movie = builder.EntitySet <Movie>("Movies").EntityType; FunctionConfiguration watch = movie.Collection.Function("Watch").Returns <int>(); // function bound to collection watch.Parameter <string>("param"); IEdmModel model = builder.GetEdmModel(); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://server/Movies"); HttpConfiguration configuration = new HttpConfiguration(); string routeName = "Route"; configuration.MapODataServiceRoute(routeName, null, model); request.SetConfiguration(configuration); request.EnableODataDependencyInjectionSupport(routeName); UrlHelper urlHelper = new UrlHelper(request); // Act IEdmEntityContainer container = model.SchemaElements.OfType <IEdmEntityContainer>().SingleOrDefault(); IEdmFunction watchFunction = Assert.Single(model.SchemaElements.OfType <IEdmFunction>()); // Guard IEdmEntitySet entitySet = container.EntitySets().SingleOrDefault(); ResourceSetContext context = new ResourceSetContext { EntitySetBase = entitySet, Url = urlHelper, Request = request }; OperationLinkBuilder functionLinkBuilder = model.GetAnnotationValue <OperationLinkBuilder>(watchFunction); //Assert Assert.Equal(expectedUri, watch.GetFeedFunctionLink()(context)); Assert.NotNull(functionLinkBuilder); Assert.Equal(expectedUri, functionLinkBuilder.BuildLink(context)); }
public void BoundFunction_ForEnumTypeInODataModelBuilder() { // Arrange ODataModelBuilder builder = ODataModelBuilderMocks.GetModelBuilderMock <ODataModelBuilder>().Add_Color_EnumType(); EntityTypeConfiguration <EnumModel> entityTypeConfiguration = builder.EntityType <EnumModel>(); FunctionConfiguration functionConfiguration = entityTypeConfiguration.Function("BoundFunction"); functionConfiguration.Parameter <Color?>("Color"); functionConfiguration.Returns <Color>(); // Act & Assert IEdmModel model = builder.GetEdmModel(); IEdmFunction function = model.FindDeclaredOperations("Default.BoundFunction").Single() as IEdmFunction; IEdmTypeReference color = function.Parameters.Single(p => p.Name == "Color").Type; IEdmTypeReference returnType = function.ReturnType; IEdmEnumType colorType = model.SchemaElements.OfType <IEdmEnumType>().Single(e => e.Name == "Color"); Assert.True(color.IsNullable); Assert.Same(colorType, color.Definition); Assert.Same(colorType, returnType.Definition); }
public void BoundFunction_ForEnumWithLongUnderlyingTypeInODataModelBuilder() { // Arrange ODataModelBuilder builder = ODataModelBuilderMocks.GetModelBuilderMock <ODataModelBuilder>(); builder.Add_LongEnum_EnumType(); EntityTypeConfiguration <EnumModel> entityTypeConfiguration = builder.EntityType <EnumModel>(); FunctionConfiguration functionConfiguration = entityTypeConfiguration.Function("BoundFunction"); functionConfiguration.Parameter <LongEnum>("LongEnum"); functionConfiguration.Returns <int>(); // Act & Assert IEdmModel model = builder.GetEdmModel(); IEdmFunction function = model.FindDeclaredOperations("Default.BoundFunction").Single() as IEdmFunction; IEdmTypeReference longEnumParameter = function.Parameters.Single(p => p.Name == "LongEnum").Type; IEdmEnumType longEnumType = model.SchemaElements.OfType <IEdmEnumType>().Single(e => e.Name == "LongEnum"); Assert.Same(longEnumType, longEnumParameter.Definition); Assert.Equal(EdmPrimitiveTypeKind.Int64, longEnumParameter.AsEnum().EnumDefinition().UnderlyingType.PrimitiveKind); }
public void CanCreateEdmModel_ForBindableFunction_WithSupportedParameterType() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration <Customer> customer = builder.EntityType <Customer>(); customer.HasKey(c => c.CustomerId); customer.Property(c => c.Name); // Act FunctionConfiguration functionBuilder = customer.Function("FunctionName"); functionBuilder.Parameter <int>("primitive"); functionBuilder.CollectionParameter <int>("collectionPrimitive"); functionBuilder.Parameter <bool?>("nullablePrimitive"); functionBuilder.CollectionParameter <bool?>("nullableCollectionPrimitive"); functionBuilder.Parameter <Color>("enum"); functionBuilder.CollectionParameter <Color>("collectionEnum"); functionBuilder.Parameter <Color?>("nullableEnum"); functionBuilder.CollectionParameter <Color?>("nullableCollectionEnum"); functionBuilder.Parameter <Address>("complex"); functionBuilder.CollectionParameter <Address>("collectionComplex"); functionBuilder.EntityParameter <Customer>("entity"); functionBuilder.CollectionEntityParameter <Customer>("collectionEntity"); functionBuilder.Returns <bool>(); IEdmModel model = builder.GetEdmModel(); // Assert Assert.Equal(1, model.SchemaElements.OfType <IEdmFunction>().Count()); IEdmFunction function = Assert.Single(model.SchemaElements.OfType <IEdmFunction>()); Assert.False(function.IsComposable); Assert.True(function.IsBound); Assert.Equal("FunctionName", function.Name); Assert.NotNull(function.ReturnType); Assert.Equal(13, function.Parameters.Count()); function.AssertHasParameter(model, BindingParameterConfiguration.DefaultBindingParameterName, typeof(Customer), true); function.AssertHasParameter(model, parameterName: "primitive", parameterType: typeof(int), isNullable: false); function.AssertHasParameter(model, parameterName: "collectionPrimitive", parameterType: typeof(IList <int>), isNullable: false); function.AssertHasParameter(model, parameterName: "nullablePrimitive", parameterType: typeof(bool?), isNullable: true); function.AssertHasParameter(model, parameterName: "nullableCollectionPrimitive", parameterType: typeof(IList <bool?>), isNullable: true); function.AssertHasParameter(model, parameterName: "enum", parameterType: typeof(Color), isNullable: false); function.AssertHasParameter(model, parameterName: "collectionEnum", parameterType: typeof(IList <Color>), isNullable: false); function.AssertHasParameter(model, parameterName: "nullableEnum", parameterType: typeof(Color?), isNullable: true); function.AssertHasParameter(model, parameterName: "nullableCollectionEnum", parameterType: typeof(IList <Color?>), isNullable: true); function.AssertHasParameter(model, parameterName: "complex", parameterType: typeof(Address), isNullable: true); function.AssertHasParameter(model, parameterName: "collectionComplex", parameterType: typeof(IList <Address>), isNullable: true); function.AssertHasParameter(model, parameterName: "entity", parameterType: typeof(Customer), isNullable: true); function.AssertHasParameter(model, parameterName: "collectionEntity", parameterType: typeof(IList <Customer>), isNullable: true); }