diff options
Diffstat (limited to 'test/System.Web.Http.OData.Test/OData/DefaultODataActionResolverTest.cs')
-rw-r--r-- | test/System.Web.Http.OData.Test/OData/DefaultODataActionResolverTest.cs | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/test/System.Web.Http.OData.Test/OData/DefaultODataActionResolverTest.cs b/test/System.Web.Http.OData.Test/OData/DefaultODataActionResolverTest.cs new file mode 100644 index 00000000..06b8b5ed --- /dev/null +++ b/test/System.Web.Http.OData.Test/OData/DefaultODataActionResolverTest.cs @@ -0,0 +1,110 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System.Linq; +using System.Net.Http; +using System.Web.Http.Hosting; +using System.Web.Http.OData.Builder; +using System.Web.Http.OData.Builder.TestModels; +using System.Web.Http.OData.Formatter.Deserialization; +using Microsoft.Data.Edm; +using Microsoft.TestCommon; + +namespace System.Web.Http.OData +{ + public class DefaultODataActionResolverTest + { + private IEdmModel _model; + + [Theory] + [InlineData("Drive", "http://server/Vehicles(6)/Drive")] + [InlineData("Drive", "http://server/Vehicles(6)/Container.Drive")] + [InlineData("Drive", "http://server/Vehicles(6)/org.odata.Container.Drive")] + [InlineData("Drive", "http://server/service/Vehicles(6)/Drive")] + [InlineData("Drive", "http://server/service/Vehicles(6)/Container.Drive")] + [InlineData("Drive", "http://server/service/Vehicles(6)/org.odata.Container.Drive")] + [InlineData("Drive", "http://server/Vehicles(6)/Container.Car/Drive")] + [InlineData("Drive", "http://server/Vehicles(6)/Container.Car/Container.Drive")] + [InlineData("Drive", "http://server/Vehicles(6)/Container.Car/org.odata.Container.Drive")] + [InlineData("Drive", "http://server/service/Vehicles/Container.Car(6)/Drive")] + [InlineData("Drive", "http://server/service/Vehicles/Container.Car(6)/Container.Drive")] + [InlineData("Drive", "http://server/service/Vehicles/Container.Car(6)/org.odata.Container.Drive")] + public void Can_find_action(string actionName, string url) + { + IODataActionResolver resolver = new DefaultODataActionResolver(); + ODataDeserializerContext context = new ODataDeserializerContext { Request = GetPostRequest(url), Model = GetModel() }; + IEdmFunctionImport action = resolver.Resolve(context); + Assert.NotNull(action); + Assert.Equal(actionName, action.Name); + } + + [Fact(Skip = "Requires improvements in Uri Parser so it can establish type of path segment prior to ActionName")] + public void Can_find_action_overload_using_bindingparameter_type() + { + string url = "http://server/service/Vehicles(8)/Container.Car/Wash"; + IODataActionResolver resolver = new DefaultODataActionResolver(); + ODataDeserializerContext context = new ODataDeserializerContext { Request = GetPostRequest(url), Model = GetModel() }; + IEdmFunctionImport action = resolver.Resolve(context); + Assert.NotNull(action); + Assert.Equal("Car", action.Parameters.First().Name); + } + + [Fact] + public void Throws_InvalidOperation_when_action_not_found() + { + string invalidUrl = "http://server/service/MissingOperation"; + IODataActionResolver resolver = new DefaultODataActionResolver(); + ODataDeserializerContext context = new ODataDeserializerContext { Request = GetPostRequest(invalidUrl), Model = GetModel() }; + Assert.Throws<InvalidOperationException>(() => + { + IEdmFunctionImport action = resolver.Resolve(context); + }, "Action 'MissingOperation' not found."); + } + + [Fact] + public void Throws_InvalidOperation_when_multiple_overloads_found() + { + string invalidUrl = "http://server/service/Vehicles/Container.Car(8)/Park"; + IODataActionResolver resolver = new DefaultODataActionResolver(); + ODataDeserializerContext context = new ODataDeserializerContext { Request = GetPostRequest(invalidUrl), Model = GetModel() }; + InvalidOperationException ioe = Assert.Throws<InvalidOperationException>(() => + { + IEdmFunctionImport action = resolver.Resolve(context); + }, "Ambiguous request. Multiple action overloads called 'Park' found."); + } + + [Fact] + public void Is_Auto_Registered() + { + HttpConfiguration configuration = new HttpConfiguration(); + DefaultODataActionResolver resolver = configuration.GetODataActionResolver() as DefaultODataActionResolver; + Assert.NotNull(resolver); + } + + private IEdmModel GetModel() + { + if (_model == null) + { + ODataModelBuilder builder = new ODataConventionModelBuilder(); + builder.ContainerName = "Container"; + builder.Namespace = "org.odata"; + // Action with no overloads + builder.EntitySet<Vehicle>("Vehicles").EntityType.Action("Drive"); + // Valid overloads of "Wash" bound to different entities + builder.Entity<Motorcycle>().Action("Wash"); + builder.Entity<Car>().Action("Wash"); + // Invalid overloads of "Park" + builder.Entity<Car>().Action("Park"); + builder.Entity<Car>().Action("Park").Parameter<string>("mood"); + _model = builder.GetEdmModel(); + } + return _model; + } + + private static HttpRequestMessage GetPostRequest(string url) + { + HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url); + request.Properties[HttpPropertyKeys.HttpConfigurationKey] = new HttpConfiguration(); + return request; + } + } +} |