public void GenerateSelfLink_WorksToGenerateExpectedSelfLink_ForSingleton(bool includeCast, string expectedIdLink) { // Arrange IEdmSingleton mary = new EdmSingleton(_model.EntityContainer, "Mary", _customer); var request = RequestFactory.Create(_model); var serializerContext = ODataSerializerContextFactory.Create(_model, mary, request); var entityContext = new ResourceContext(serializerContext, _specialCustomer.AsReference(), new { ID = 42 }); // Act var idLink = entityContext.GenerateSelfLink(includeCast); // Assert Assert.Equal(expectedIdLink, idLink.ToString()); }
public void GenerateActionLink_GeneratesLinkWithDownCast_IfElementTypeDerivesFromBindingParameterType_ForSingleton() { // Arrange IEdmSingleton me = new EdmSingleton(_model.Container, "Me", _model.SpecialCustomer); var request = RequestFactory.CreateFromModel(_model.Model); var serializerContext = ODataSerializerContextFactory.Create(_model.Model, me, request); var entityContext = new ResourceContext(serializerContext, _model.SpecialCustomer.AsReference(), new { ID = 42 }); // Act Uri link = entityContext.GenerateActionLink(_model.UpgradeCustomer); // Assert Assert.Equal("http://localhost/Me/NS.Customer/NS.upgrade", link.AbsoluteUri); }
public void GenerateNavigationLink_WorksToGenerateExpectedNavigationLink_ForEntitySet(bool includeCast, string expectedNavigationLink) { // Arrange var request = RequestFactory.Create(_model); var serializerContext = ODataSerializerContextFactory.Create(_model, _customers, request); var entityContext = new ResourceContext(serializerContext, _specialCustomer.AsReference(), new { ID = 42 }); IEdmNavigationProperty ordersProperty = _customer.NavigationProperties().Single(); // Act Uri uri = entityContext.GenerateNavigationPropertyLink(ordersProperty, includeCast); // Assert Assert.Equal(expectedNavigationLink, uri.AbsoluteUri); }
public void GenerateActionLink_GeneratesLinkWithoutCast_IfEntitySetTypeMatchesActionEntityType() { // Arrange var request = RequestFactory.Create(_model); var serializerContext = ODataSerializerContextFactory.Create(_model, _customers, request); var entityContext = new ResourceContext(serializerContext, _customer.AsReference(), new { ID = 42 }); IEdmAction upgradeCustomer = _model.SchemaElements.OfType <IEdmAction>().FirstOrDefault(c => c.Name == "upgrade"); Assert.NotNull(upgradeCustomer); // Act Uri link = entityContext.GenerateActionLink(upgradeCustomer); Assert.Equal("http://localhost/Customers(42)/NS.upgrade", link.AbsoluteUri); }
public void Ctor_FollowingConventions_GeneratesSelfLinkWithCast_IfDerivedTypeHasNavigationProperty() { // Arrange CustomersModelWithInheritance model = new CustomersModelWithInheritance(); var request = RequestFactory.CreateFromModel(model.Model); ODataSerializerContext serializerContext = ODataSerializerContextFactory.Create(model.Model, model.Customers, request); ResourceContext instanceContext = new ResourceContext(serializerContext, model.SpecialCustomer.AsReference(), new { ID = 42 }); // Act NavigationSourceLinkBuilderAnnotation linkBuilder = new NavigationSourceLinkBuilderAnnotation(model.Customers, model.Model); var result = linkBuilder.BuildIdLink(instanceContext, ODataMetadataLevel.FullMetadata); // Assert Assert.Equal("http://localhost/Customers(42)/NS.SpecialCustomer", result.ToString()); }
public void GenerateFunctionLink_GeneratesLinkWithDownCast_IfElementTypeDerivesFromBindingParameterType() { // Arrange IEdmEntitySet specialCustomers = new EdmEntitySet(_model.Container, "SpecialCustomers", _model.SpecialCustomer); var request = RequestFactory.CreateFromModel(_model.Model); var serializerContext = ODataSerializerContextFactory.Create(_model.Model, specialCustomers, request); var entityContext = new ResourceContext(serializerContext, _model.SpecialCustomer.AsReference(), new { ID = 42 }); // Act Uri link = entityContext.GenerateFunctionLink(_model.IsCustomerUpgraded); // Assert Assert.Equal("http://localhost/SpecialCustomers(42)/NS.Customer/NS.IsUpgradedWithParam(city=@city)", link.AbsoluteUri); }
public void GenerateFunctionLink_GeneratesLinkWithCast_IfEntitySetTypeDoesnotMatchActionEntityType() { // Arrange var request = RequestFactory.Create(_model); var serializerContext = ODataSerializerContextFactory.Create(_model, _customers, request); var entityContext = new ResourceContext(serializerContext, _specialCustomer.AsReference(), new { ID = 42 }); IEdmFunction isSpecialUpgraded = _model.SchemaElements.OfType <IEdmFunction>().First(c => c.Name == "IsSpecialUpgraded"); Assert.NotNull(isSpecialUpgraded); // Act Uri link = entityContext.GenerateFunctionLink(isSpecialUpgraded); // Assert Assert.Equal("http://localhost/Customers(42)/NS.SpecialCustomer/NS.IsSpecialUpgraded()", link.AbsoluteUri); }
public void GenerateActionLink_GeneratesLinkWithDownCast_IfElementTypeDerivesFromBindingParameterType() { // Arrange IEdmEntitySet specialCustomers = new EdmEntitySet(_model.EntityContainer, "SpecialCustomers", _specialCustomer); var request = RequestFactory.Create(_model); var serializerContext = ODataSerializerContextFactory.Create(_model, specialCustomers, request); var entityContext = new ResourceContext(serializerContext, _specialCustomer.AsReference(), new { ID = 42 }); IEdmAction upgradeCustomer = _model.SchemaElements.OfType <IEdmAction>().FirstOrDefault(c => c.Name == "upgrade"); Assert.NotNull(upgradeCustomer); // Act Uri link = entityContext.GenerateActionLink(upgradeCustomer); // Assert Assert.Equal("http://localhost/SpecialCustomers(42)/NS.Customer/NS.upgrade", link.AbsoluteUri); }
public void GenerateActionLink_GeneratesLinkWithCast_IfEntitySetTypeDoesnotMatchActionEntityType_ForSingleton() { // Arrange IEdmSingleton mary = new EdmSingleton(_model.EntityContainer, "Mary", _customer); var request = RequestFactory.Create(_model); var serializerContext = ODataSerializerContextFactory.Create(_model, mary, request); var entityContext = new ResourceContext(serializerContext, _specialCustomer.AsReference(), new { ID = 42 }); IEdmAction specialUpgrade = _model.SchemaElements.OfType <IEdmAction>().FirstOrDefault(c => c.Name == "specialUpgrade"); Assert.NotNull(specialUpgrade); // Act Uri link = entityContext.GenerateActionLink(specialUpgrade); // Assert Assert.Equal("http://localhost/Mary/NS.SpecialCustomer/NS.specialUpgrade", link.AbsoluteUri); }
public void GenerateFunctionLink_GeneratesLinkWithDownCast_IfElementTypeDerivesFromBindingParameterType_ForSingleton() { // Arrange IEdmSingleton me = new EdmSingleton(_model.EntityContainer, "Me", _specialCustomer); HttpRequest request = RequestFactory.Create(_model); var serializerContext = ODataSerializerContextFactory.Create(_model, me, request); var entityContext = new ResourceContext(serializerContext, _specialCustomer.AsReference(), new { ID = 42 }); IEdmFunction isCustomerUpgraded = _model.SchemaElements.OfType <IEdmFunction>().First(c => c.Name == "IsUpgradedWithParam"); Assert.NotNull(isCustomerUpgraded); // Act Uri link = entityContext.GenerateFunctionLink(isCustomerUpgraded); // Assert Assert.Equal("http://localhost/Me/NS.Customer/NS.IsUpgradedWithParam(city=@city)", link.AbsoluteUri); }
public void Ctor_FollowingConventions_GeneratesNavigationLinkWithCast_ForDerivedNavigationProperty() { // Arrange CustomersModelWithInheritance model = new CustomersModelWithInheritance(); var request = RequestFactory.CreateFromModel(model.Model); ODataSerializerContext serializerContext = ODataSerializerContextFactory.Create(model.Model, model.Customers, request); ResourceContext instanceContext = new ResourceContext(serializerContext, model.SpecialCustomer.AsReference(), new { ID = 42 }); IEdmNavigationProperty ordersProperty = model.SpecialCustomer.NavigationProperties().First(p => p.Name == "SpecialOrders"); // Act NavigationSourceLinkBuilderAnnotation linkBuilder = new NavigationSourceLinkBuilderAnnotation(model.Customers, model.Model); linkBuilder.AddNavigationPropertyLinkBuilder(ordersProperty, new NavigationLinkBuilder((context, property) => context.GenerateNavigationPropertyLink(property, includeCast: true), false)); Uri result = linkBuilder.BuildNavigationLink(instanceContext, ordersProperty, ODataMetadataLevel.MinimalMetadata); // Assert Assert.Equal("http://localhost/Customers(42)/NS.SpecialCustomer/SpecialOrders", result.AbsoluteUri); }
public void GenerateNavigationLink_WorksToGenerateExpectedNavigationLink_ForContainedNavigation( bool includeCast, string expectedNavigationLink) { // NOTE: This test is generating a link that does not technically correspond to a valid model (specifically // the extra OrderLines navigation), but it allows us to validate the nested navigation scenario // without twisting the model unnecessarily. // Arrange IEdmEntityType myOrder = (IEdmEntityType)_myOrderModel.FindDeclaredType("NS.MyOrder"); IEdmEntityType orderLine = (IEdmEntityType)_myOrderModel.FindDeclaredType("NS.OrderLine"); IEdmNavigationProperty orderLinesProperty = myOrder.NavigationProperties().Single(x => x.ContainsTarget); IEdmEntitySet entitySet = _myOrderModel.FindDeclaredEntitySet("MyOrders"); IDictionary <string, object> parameters = new Dictionary <string, object> { { "ID", 42 } }; IDictionary <string, object> parameters2 = new Dictionary <string, object> { { "ID", 21 } }; // containment IEdmContainedEntitySet orderLines = (IEdmContainedEntitySet)entitySet.FindNavigationTarget(orderLinesProperty); ODataPath path = new ODataPath( new EntitySetSegment(entitySet), new KeySegment(parameters.ToArray(), myOrder, entitySet), new NavigationPropertySegment(orderLinesProperty, orderLines), new KeySegment(parameters2.ToArray(), orderLine, orderLines)); var request = RequestFactory.Create(_myOrderModel); var serializerContext = ODataSerializerContextFactory.Create(_myOrderModel, orderLines, path, request); var entityContext = new ResourceContext(serializerContext, orderLine.AsReference(), new { ID = 21 }); // Act Uri uri = entityContext.GenerateNavigationPropertyLink(orderLinesProperty, includeCast); // Assert Assert.Equal(expectedNavigationLink, uri.AbsoluteUri); }
public void SelfLinksGenerationConvention_Uses_GetByIdWithCast_IfDerivedTypeHasNavigationProperty() { ODataConventionModelBuilder builder = ODataConventionModelBuilderFactory.Create(); var vehicles = builder.EntitySet <Vehicle>("vehicles"); IEdmModel model = builder.GetEdmModel(); IEdmEntitySet vehiclesEdmEntitySet = model.EntityContainer.EntitySets().Single(); IEdmEntityType carType = model.AssertHasEntityType(typeof(Car)); var request = RequestFactory.CreateFromModel(model); NavigationSourceLinkBuilderAnnotation linkBuilder = model.GetNavigationSourceLinkBuilder(vehiclesEdmEntitySet); var serializerContext = ODataSerializerContextFactory.Create(model, vehiclesEdmEntitySet, request); var entityContext = new ResourceContext(serializerContext, carType.AsReference(), new Car { Model = 2009, Name = "Contoso" }); EntitySelfLinks selfLinks = linkBuilder.BuildEntitySelfLinks(entityContext, ODataMetadataLevel.FullMetadata); Assert.Equal("http://localhost/vehicles(Model=2009,Name='Contoso')", selfLinks.IdLink.ToString()); Assert.Equal("http://localhost/vehicles(Model=2009,Name='Contoso')/Microsoft.Test.AspNet.OData.Builder.TestModels.Car", selfLinks.EditLink.ToString()); }
public void Apply_Doesnot_Override_UserConfiguration() { // Arrange ODataConventionModelBuilder builder = ODataConventionModelBuilderFactory.Create(); var customers = builder.EntitySet <Customer>("Customers"); var paintAction = customers.EntityType.Action("Paint"); paintAction.HasActionLink(ctxt => new Uri("http://localhost/ActionTestWorks"), followsConventions: false); ActionLinkGenerationConvention convention = new ActionLinkGenerationConvention(); // Act convention.Apply(paintAction, builder); IEdmModel model = builder.GetEdmModel(); var edmCustomers = model.EntityContainer.FindEntitySet("Customers"); var edmCustomer = model.SchemaElements.OfType <IEdmEntityType>().First(c => c.Name == "Customer"); var edmAction = model.SchemaElements.OfType <IEdmAction>().First(a => a.Name == "Paint"); Assert.NotNull(edmAction); string routeName = "OData"; var configuration = RoutingConfigurationFactory.CreateWithRootContainer(routeName); configuration.MapODataServiceRoute(routeName, null, model); var request = RequestFactory.Create(HttpMethod.Get, "http://localhost", configuration, routeName); OperationLinkBuilder actionLinkBuilder = model.GetOperationLinkBuilder(edmAction); var serializerContext = ODataSerializerContextFactory.Create(model, edmCustomers, request); var entityContext = new ResourceContext(serializerContext, edmCustomer.AsReference(), new Customer { Id = 2009 }); // Assert Uri link = actionLinkBuilder.BuildLink(entityContext); Assert.Equal("http://localhost/ActionTestWorks", link.AbsoluteUri); }
public void NavigationLinksGenerationConvention_GeneratesLinksWithoutCast_ForBaseProperties() { ODataConventionModelBuilder builder = ODataConventionModelBuilderFactory.Create(); builder.EntitySet <SportBike>("vehicles"); builder.EntitySet <Manufacturer>("manufacturers"); IEdmModel model = builder.GetEdmModel(); IEdmEntitySet vehiclesEdmEntitySet = model.EntityContainer.FindEntitySet("vehicles"); IEdmEntityType sportbikeType = model.AssertHasEntityType(typeof(SportBike)); IEdmNavigationProperty motorcycleManufacturerProperty = sportbikeType.AssertHasNavigationProperty(model, "Manufacturer", typeof(MotorcycleManufacturer), isNullable: true, multiplicity: EdmMultiplicity.ZeroOrOne); var configuration = RoutingConfigurationFactory.Create(); string routeName = "Route"; configuration.MapODataServiceRoute(routeName, null, model); var request = RequestFactory.Create(HttpMethod.Get, "http://localhost", configuration, routeName); NavigationSourceLinkBuilderAnnotation linkBuilder = model.GetNavigationSourceLinkBuilder(vehiclesEdmEntitySet); linkBuilder.AddNavigationPropertyLinkBuilder(motorcycleManufacturerProperty, new NavigationLinkBuilder((context, property) => context.GenerateNavigationPropertyLink(property, includeCast: false), false)); var serializerContext = ODataSerializerContextFactory.Create(model, vehiclesEdmEntitySet, request); var entityContext = new ResourceContext(serializerContext, sportbikeType.AsReference(), new SportBike { Model = 2009, Name = "Ninja" }); // We might get one of these: // http://localhost/vehicles(Model=2009,Name='Ninja')/Manufacturer // http://localhost/vehicles(Name='Ninja',Model=2009)/Manufacturer Uri uri = linkBuilder.BuildNavigationLink(entityContext, motorcycleManufacturerProperty, ODataMetadataLevel.MinimalMetadata); string aboluteUri = uri.AbsoluteUri; Assert.Contains("http://localhost/vehicles(", aboluteUri); Assert.Contains("Model=2009", aboluteUri); Assert.Contains("Name='Ninja'", aboluteUri); Assert.Contains(")/Manufacturer", aboluteUri); }
public void GenerateNavigationLink_WorksToGenerateExpectedNavigationLink_ForNonContainedNavigation() { // Arrange IEdmEntityType myOrder = (IEdmEntityType)_myOrderModel.FindDeclaredType("NS.MyOrder"); IEdmEntityType orderLine = (IEdmEntityType)_myOrderModel.FindDeclaredType("NS.OrderLine"); IEdmNavigationProperty nonOrderLinesProperty = myOrder.NavigationProperties().Single(x => x.Name.Equals("NonContainedOrderLines")); IEdmEntitySet entitySet = _myOrderModel.FindDeclaredEntitySet("MyOrders"); IDictionary <string, object> parameters = new Dictionary <string, object> { { "ID", 42 } }; IDictionary <string, object> parameters2 = new Dictionary <string, object> { { "ID", 21 } }; IEdmNavigationSource nonContainedOrderLines = entitySet.FindNavigationTarget(nonOrderLinesProperty); ODataPath path = new ODataPath( new EntitySetSegment(entitySet), new KeySegment(parameters.ToArray(), myOrder, entitySet), new NavigationPropertySegment(nonOrderLinesProperty, nonContainedOrderLines), new KeySegment(parameters2.ToArray(), orderLine, nonContainedOrderLines)); IEdmNavigationProperty orderLinesProperty = myOrder.NavigationProperties().Single(x => x.ContainsTarget); IEdmContainedEntitySet orderLines = (IEdmContainedEntitySet)entitySet.FindNavigationTarget(orderLinesProperty); var request = RequestFactory.Create(_myOrderModel); var serializerContext = ODataSerializerContextFactory.Create(_myOrderModel, orderLines, path, request); var entityContext = new ResourceContext(serializerContext, orderLine.AsReference(), new { ID = 21 }); // Act Uri uri = entityContext.GenerateSelfLink(false); // Assert Assert.Equal("http://localhost/OrderLines(21)", uri.AbsoluteUri); }
public void SelfLinksGenerationConvention_Uses_WithoutCast_IfDerivedTypeDoesnotHaveNavigationProperty_ForSingleton() { // Arrange ODataConventionModelBuilder builder = ODataConventionModelBuilderFactory.Create(); var myMotorcycle = builder.Singleton <Motorcycle>("MyMotor"); IEdmModel model = builder.GetEdmModel(); IEdmSingleton vehicleEdmSingleton = model.EntityContainer.FindSingleton("MyMotor"); IEdmEntityType sportbikeType = model.AssertHasEntityType(typeof(SportBike)); var request = RequestFactory.CreateFromModel(model); NavigationSourceLinkBuilderAnnotation linkBuilder = model.GetNavigationSourceLinkBuilder(vehicleEdmSingleton); var serializerContext = ODataSerializerContextFactory.Create(model, vehicleEdmSingleton, request); var entityContext = new ResourceContext(serializerContext, sportbikeType.AsReference(), new SportBike { Model = 2014, Name = "Ninja" }); // Act EntitySelfLinks selfLinks = linkBuilder.BuildEntitySelfLinks(entityContext, ODataMetadataLevel.FullMetadata); // Assert Assert.Equal("http://localhost/MyMotor", selfLinks.IdLink.ToString()); }
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 = ODataConventionModelBuilderFactory.Create(); EntityTypeConfiguration <Movie> movie = builder.EntitySet <Movie>("Movies").EntityType; FunctionConfiguration watch = movie.Function("Watch").Returns <int>(); watch.Parameter <string>("param"); IEdmModel model = builder.GetEdmModel(); var configuration = RoutingConfigurationFactory.Create(); string routeName = "Route"; configuration.MapODataServiceRoute(routeName, null, model); var request = RequestFactory.Create(HttpMethod.Get, "http://server/Movies", configuration, routeName); // 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 = ODataSerializerContextFactory.Create(model, entitySet, request); ResourceContext context = new ResourceContext(serializerContext, movieType.AsReference(), new Movie { ID = 1, Name = "Avatar" }); OperationLinkBuilder functionLinkBuilder = model.GetAnnotationValue <OperationLinkBuilder>(watchFunction); //Assert Assert.Equal(expectedUri, watch.GetFunctionLink()(context)); Assert.NotNull(functionLinkBuilder); Assert.Equal(expectedUri, functionLinkBuilder.BuildLink(context)); }
public void SelfLinksGenerationConvention_Uses_WithCast_IfDerivedTypeHasNavigationProperty_ForSingleton() { // Arrange ODataConventionModelBuilder builder = ODataConventionModelBuilderFactory.Create(); var myVehicle = builder.Singleton <Vehicle>("MyVehicle"); IEdmModel model = builder.GetEdmModel(); IEdmSingleton vehicleEdmSingleton = model.EntityContainer.FindSingleton("MyVehicle"); IEdmEntityType carType = model.AssertHasEntityType(typeof(Car)); var request = RequestFactory.CreateFromModel(model); NavigationSourceLinkBuilderAnnotation linkBuilder = model.GetNavigationSourceLinkBuilder(vehicleEdmSingleton); var serializerContext = ODataSerializerContextFactory.Create(model, vehicleEdmSingleton, request); var entityContext = new ResourceContext(serializerContext, carType.AsReference(), new Car { Model = 2014, Name = "Contoso" }); // Act EntitySelfLinks selfLinks = linkBuilder.BuildEntitySelfLinks(entityContext, ODataMetadataLevel.FullMetadata); // Assert Assert.Equal("http://localhost/MyVehicle", selfLinks.IdLink.ToString()); Assert.Equal("http://localhost/MyVehicle/Microsoft.Test.AspNet.OData.Builder.TestModels.Car", selfLinks.EditLink.ToString()); }
public void Convention_GeneratesUri_ForFunctionBoundToEntity() { // Arrange ODataConventionModelBuilder builder = ODataConventionModelBuilderFactory.Create(); builder.EntitySet <Customer>("Customers"); var function = builder.EntityType <Customer>().Function("MyFunction").Returns <int>(); function.Parameter <string>("param"); IEdmModel model = builder.GetEdmModel(); // Act var configuration = RoutingConfigurationFactory.Create(); configuration.MapODataServiceRoute("odata", "odata", model); var request = RequestFactory.Create(HttpMethod.Get, "http://*****:*****@param)", link.AbsoluteUri); }