public void GenerateActionLink_GeneratesLinkWithoutCast_IfEntitySetTypeMatchesActionEntityType() { // Arrange ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); var cars = builder.EntitySet<Car>("cars"); var paintAction = cars.EntityType.Action("Paint"); IEdmModel model = builder.GetEdmModel(); var carsEdmSet = model.EntityContainers().Single().FindEntitySet("cars"); HttpConfiguration configuration = new HttpConfiguration(); string routeName = "Route"; configuration.Routes.MapODataRoute(routeName, null, model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost"); request.SetConfiguration(configuration); request.SetODataRouteName(routeName); // Act Uri link = ActionLinkGenerationConvention.GenerateActionLink( new EntityInstanceContext() { EdmModel = model, EntitySet = carsEdmSet, EntityType = carsEdmSet.ElementType, Url = request.GetUrlHelper(), EntityInstance = new Car { Model = 2009, Name = "Accord" } }, paintAction); Assert.Equal("http://localhost/cars(Model=2009,Name='Accord')/Paint", link.AbsoluteUri); }
public void NavigationLinksGenerationConvention_GeneratesLinksWithCast_ForDerivedProperties() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.EntitySet<Vehicle>("vehicles"); builder.EntitySet<Manufacturer>("manufacturers"); IEdmModel model = builder.GetEdmModel(); IEdmEntitySet vehiclesEdmEntitySet = model.EntityContainers().Single().FindEntitySet("vehicles"); IEdmEntityType carType = model.AssertHasEntityType(typeof(Car)); IEdmNavigationProperty carManufacturerProperty = carType.AssertHasNavigationProperty(model, "Manufacturer", typeof(CarManufacturer), isNullable: true, multiplicity: EdmMultiplicity.ZeroOrOne); HttpConfiguration configuration = new HttpConfiguration(); string routeName = "Route"; configuration.Routes.MapODataRoute(routeName, null, model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost"); request.SetConfiguration(configuration); request.SetODataRouteName(routeName); EntitySetLinkBuilderAnnotation linkBuilder = model.GetEntitySetLinkBuilder(vehiclesEdmEntitySet); var serializerContext = new ODataSerializerContext { Model = model, EntitySet = vehiclesEdmEntitySet, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, carType.AsReference(), new Car { Model = 2009, Name = "Accord" }); Uri uri = linkBuilder.BuildNavigationLink(entityContext, carManufacturerProperty, ODataMetadataLevel.Default); Assert.Equal("http://localhost/vehicles(Model=2009,Name='Accord')/System.Web.Http.OData.Builder.TestModels.Car/Manufacturer", uri.AbsoluteUri); }
private HttpRequestMessage GetSampleRequest() { HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/employees"); HttpConfiguration configuration = new HttpConfiguration(); string routeName = "Route"; configuration.Routes.MapODataRoute(routeName, null, GetSampleModel()); request.SetConfiguration(configuration); IEdmEntitySet entitySet = _model.EntityContainers().Single().FindEntitySet("employees"); request.SetEdmModel(_model); request.SetODataPath(new ODataPath(new EntitySetPathSegment(entitySet))); request.SetODataRouteName(routeName); return request; }
public override bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection) { if (routeDirection != HttpRouteDirection.UriResolution) { return true; } object odataPathValue; if (!values.TryGetValue(ODataRouteConstants.ODataPath, out odataPathValue)) { return false; } var pathString = odataPathValue as string; if (pathString == null) pathString = string.Empty; ODataPath path = null; try { path = VersionAwarePathHandler.Parse(request, EdmModel, pathString); } catch (ODataException e) { throw new HttpResponseException(request.CreateErrorResponse(HttpStatusCode.NotFound, "Invalid OData path", e)); } if (path != null) { values[ODataRouteConstants.ODataPath] = path.Segments.First(); // Set all the properties we need for routing, querying, formatting request.SetEdmModel(EdmModel); request.SetODataPathHandler(VersionAwarePathHandler); request.SetODataPath(path); request.SetODataRouteName(RouteName); request.SetODataRoutingConventions(RoutingConventions); if (!values.ContainsKey(ODataRouteConstants.Controller)) { // Select controller name using the routing conventions string controllerName = SelectControllerName(path, request); if (controllerName != null) { values[ODataRouteConstants.Controller] = controllerName; } } } return path != null; }
public void GenerateActionLink_GeneratesLinkWithoutCast_IfEntitySetTypeDerivesFromActionEntityType() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); var cars = builder.EntitySet<Car>("cars"); var paintAction = builder.Entity<Vehicle>().Action("Paint"); IEdmModel model = builder.GetEdmModel(); var carsEdmSet = model.EntityContainers().Single().FindEntitySet("cars"); HttpConfiguration configuration = new HttpConfiguration(); string routeName = "Route"; configuration.Routes.MapODataRoute(routeName, null, model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost"); request.SetConfiguration(configuration); request.SetODataRouteName(routeName); var serializerContext = new ODataSerializerContext { Model = model, EntitySet = carsEdmSet, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, carsEdmSet.ElementType.AsReference(), new Car { Model = 2009, Name = "Accord" }); Uri link = ActionLinkGenerationConvention.GenerateActionLink(entityContext, paintAction); Assert.Equal("http://localhost/cars(Model=2009,Name='Accord')/Paint", link.AbsoluteUri); }
private static HttpRequestMessage GetODataRequest(IEdmModel model) { HttpConfiguration configuration = new HttpConfiguration(); string routeName = "Route"; configuration.Routes.MapODataRoute(routeName, null, model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost"); request.SetConfiguration(configuration); request.SetODataRouteName(routeName); return request; }
public void WhenActionLinksNotManuallyConfigured_ConventionBasedBuilderUsesConventions() { // Arrange string uriTemplate = "http://server/Movies({0})/Watch"; Uri expectedUri = new Uri(string.Format(uriTemplate, 1)); ODataModelBuilder builder = new ODataConventionModelBuilder(); EntityTypeConfiguration<Movie> movie = builder.EntitySet<Movie>("Movies").EntityType; ActionConfiguration watch = movie.Action("Watch"); IEdmModel model = builder.GetEdmModel(); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://server/Movies"); HttpConfiguration configuration = new HttpConfiguration(); string routeName = "Route"; configuration.Routes.MapODataRoute(routeName, null, model); request.SetConfiguration(configuration); request.SetODataRouteName(routeName); UrlHelper urlHelper = new UrlHelper(request); // Act IEdmEntityType movieType = model.SchemaElements.OfType<IEdmEntityType>().SingleOrDefault(); IEdmEntityContainer container = model.SchemaElements.OfType<IEdmEntityContainer>().SingleOrDefault(); IEdmFunctionImport watchAction = container.FunctionImports().SingleOrDefault(); IEdmEntitySet entitySet = container.EntitySets().SingleOrDefault(); EntityInstanceContext<Movie> context = new EntityInstanceContext<Movie>() { EdmModel = model, EntitySet = entitySet, EntityType = movieType, Url = urlHelper, EntityInstance = new Movie { ID = 1, Name = "Avatar" }, SkipExpensiveAvailabilityChecks = false }; ActionLinkBuilder actionLinkBuilder = model.GetAnnotationValue<ActionLinkBuilder>(watchAction); //Assert Assert.Equal(expectedUri, watch.GetActionLink()(context)); Assert.NotNull(actionLinkBuilder); Assert.Equal(expectedUri, actionLinkBuilder.BuildActionLink(context)); }
public void PrimitiveTypesDeserializeAsOData(Type valueType, object value, MediaTypeHeaderValue mediaType, string resourceName) { string entity = Resources.GetString(resourceName); Assert.NotNull(entity); object expectedValue = value; ODataConventionModelBuilder modelBuilder = new ODataConventionModelBuilder(); modelBuilder.EntitySet<WorkItem>("WorkItems"); IEdmModel model = modelBuilder.GetEdmModel(); object actualValue; using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/WorkItems(10)/ID")) { HttpConfiguration config = new HttpConfiguration(); config.Routes.MapODataRoute("default", "", model); request.SetConfiguration(config); request.SetODataRouteName("default"); request.SetEdmModel(model); ODataMediaTypeFormatter formatter = CreateFormatter(request); formatter.SupportedMediaTypes.Add(mediaType); using (StringContent content = new StringContent(entity)) { content.Headers.ContentType = mediaType; using (Stream stream = content.ReadAsStreamAsync().Result) { actualValue = formatter.ReadFromStreamAsync(valueType, stream, content, new Mock<IFormatterLogger>().Object).Result; } } } Assert.Equal(expectedValue, actualValue); }
public virtual bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection) { if (request == null) { throw Error.ArgumentNull("request"); } if (values == null) { throw Error.ArgumentNull("values"); } if (routeDirection == HttpRouteDirection.UriResolution) { object odataPathRouteValue; if (values.TryGetValue(ODataRouteConstants.ODataPath, out odataPathRouteValue)) { string odataPath = odataPathRouteValue as string; if (odataPath == null) { // No odataPath means the path is empty; this is necessary for service documents odataPath = String.Empty; } ODataPath path; try { path = PathHandler.Parse(EdmModel, odataPath); } catch (ODataException e) { throw new HttpResponseException( request.CreateErrorResponse(HttpStatusCode.NotFound, SRResources.ODataPathInvalid, e)); } if (path != null) { // Set all the properties we need for routing, querying, formatting request.SetEdmModel(EdmModel); request.SetODataPathHandler(PathHandler); request.SetODataPath(path); request.SetODataRouteName(RouteName); request.SetODataRoutingConventions(RoutingConventions); if (!values.ContainsKey(ODataRouteConstants.Controller)) { // Select controller name using the routing conventions string controllerName = SelectControllerName(path, request); if (controllerName != null) { values[ODataRouteConstants.Controller] = controllerName; } } return true; } } return false; } else { // This constraint only applies to URI resolution return true; } }
public void GenerateActionLink_GeneratesLinkWithCast_IfEntitySetTypeDoesnotMatchActionEntityType() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); var vehicles = builder.EntitySet<Vehicle>("vehicles"); var car = builder.Entity<Car>(); var paintAction = car.Action("Paint"); IEdmModel model = builder.GetEdmModel(); var vehiclesEdmSet = model.EntityContainers().Single().FindEntitySet("vehicles"); var carEdmType = model.FindDeclaredType("System.Web.Http.OData.Builder.TestModels.Car") as IEdmEntityType; HttpConfiguration configuration = new HttpConfiguration(); string routeName = "Route"; configuration.Routes.MapODataRoute(routeName, null, model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost"); request.SetConfiguration(configuration); request.SetODataRouteName(routeName); Uri link = ActionLinkGenerationConvention.GenerateActionLink( new EntityInstanceContext() { EdmModel = model, EntitySet = vehiclesEdmSet, EntityType = carEdmType, Url = request.GetUrlHelper(), EntityInstance = new Car { Model = 2009, Name = "Accord" } }, paintAction); Assert.Equal("http://localhost/vehicles(Model=2009,Name='Accord')/System.Web.Http.OData.Builder.TestModels.Car/Paint", link.AbsoluteUri); }
public void GenerateNavigationLink_GeneratesCorrectLink_EvenIfRouteDataPointsToADifferentController() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); var orders = builder.AddEntitySet("Orders", builder.AddEntity(typeof(NavigationLinksGenerationConventionTest_Order))); IEdmModel model = builder.GetEdmModel(); var edmEntitySet = model.EntityContainers().Single().EntitySets().Single(); HttpConfiguration configuration = new HttpConfiguration(); string routeName = "Route"; configuration.Routes.MapODataRoute(routeName, null, model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost"); request.SetConfiguration(configuration); request.SetODataRouteName(routeName); Uri uri = NavigationLinksGenerationConvention.GenerateNavigationPropertyLink( new EntityInstanceContext { EdmModel = model, EntityInstance = new NavigationLinksGenerationConventionTest_Order { ID = 100 }, EntitySet = edmEntitySet, EntityType = edmEntitySet.ElementType, Url = request.GetUrlHelper() }, edmEntitySet.ElementType.NavigationProperties().Single(), orders, includeCast: false); Assert.Equal("http://localhost/Orders(100)/Customer", uri.AbsoluteUri); }
public void NavigationLinksGenerationConvention_GeneratesLinksWithoutCast_ForBaseProperties() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.EntitySet<SportBike>("vehicles"); builder.EntitySet<Manufacturer>("manufacturers"); IEdmModel model = builder.GetEdmModel(); IEdmEntitySet vehiclesEdmEntitySet = model.EntityContainers().Single().FindEntitySet("vehicles"); IEdmEntityType sportbikeType = model.AssertHasEntityType(typeof(SportBike)); IEdmNavigationProperty motorcycleManufacturerProperty = sportbikeType.AssertHasNavigationProperty(model, "Manufacturer", typeof(MotorcycleManufacturer), isNullable: true, multiplicity: EdmMultiplicity.ZeroOrOne); HttpConfiguration configuration = new HttpConfiguration(); string routeName = "Route"; configuration.Routes.MapODataRoute(routeName, null, model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost"); request.SetConfiguration(configuration); request.SetODataRouteName(routeName); EntitySetLinkBuilderAnnotation linkBuilder = model.GetEntitySetLinkBuilder(vehiclesEdmEntitySet); Uri uri = linkBuilder.BuildNavigationLink( new EntityInstanceContext() { EdmModel = model, EntitySet = vehiclesEdmEntitySet, EntityType = sportbikeType, Url = request.GetUrlHelper(), EntityInstance = new Car { Model = 2009, Name = "Ninja" } }, motorcycleManufacturerProperty, ODataMetadataLevel.Default); Assert.Equal("http://localhost/vehicles(Model=2009,Name='Ninja')/Manufacturer", uri.AbsoluteUri); }