示例#1
0
        public void AddRouteComponents_Throws_IfPrefixExisted()
        {
            // Arrange
            ODataOptions options  = new ODataOptions();
            IEdmModel    edmModel = EdmCoreModel.Instance;

            options.AddRouteComponents("odata", edmModel);

            // Act
            Action test = () => options.AddRouteComponents("odata", edmModel);

            // Assert
            ExceptionAssert.Throws <InvalidOperationException>(test, "The prefix 'odata' was already used for other Edm model.");
        }
示例#2
0
 static AttributeRoutingConventionTests()
 {
     _edmModel = GetEdmModel();
     _options  = new ODataOptions();
     _options.AddRouteComponents(_edmModel);
     _attributeConvention = CreateConvention();
 }
示例#3
0
        public void OnProvidersExecuted_AddODataRoutingSelector_WhenAttributeRoutingConvention()
        {
            // Arrange
            ODataOptions options = new ODataOptions();

            options.AddRouteComponents("odata", _model);

            LoggerFactory            loggerFactory = new LoggerFactory();
            var                      logger        = new Logger <AttributeRoutingConvention>(loggerFactory);
            IODataPathTemplateParser parser        = new DefaultODataPathTemplateParser();

            IODataControllerActionConvention[] conventions = new IODataControllerActionConvention[]
            {
                new AttributeRoutingConvention(logger, parser)
            };

            ODataRoutingApplicationModelProvider provider        = CreateProvider(options, conventions);
            ApplicationModelProviderContext      providerContext = CreateProviderContext(typeof(AttributeRoutingController));

            // Act
            provider.OnProvidersExecuted(providerContext);

            // Assert
            ControllerModel controller = Assert.Single(providerContext.Result.Controllers);

            ActionModel action = Assert.Single(controller.Actions);

            Assert.Equal("AnyMethodNameHere", action.ActionMethod.Name);
            Assert.Single(action.Parameters);
            SelectorModel selectorModel = Assert.Single(action.Selectors);

            Assert.Equal("/odata/Customers({key})/Name", selectorModel.AttributeRouteModel.Template);
            Assert.Contains(selectorModel.EndpointMetadata, a => a is ODataRoutingMetadata);
        }
示例#4
0
        public void Register(ODataOptions options)
        {
            ODataModelBuilder builder = new ODataConventionModelBuilder();

            builder.EntitySet <Person>("PersonApi");
            options.AddRouteComponents("odata", builder.GetEdmModel());
        }
示例#5
0
        public void AddRouteComponents_Throws_IfRoutePrefixNull()
        {
            // Arrange
            ODataOptions options = new ODataOptions();

            // Act & Assert
            ExceptionAssert.ThrowsArgumentNull(() => options.AddRouteComponents(null, EdmCoreModel.Instance, builder => { }), "routePrefix");
        }
示例#6
0
        public void AddRouteComponents_Throws_IfModelNull()
        {
            // Arrange
            ODataOptions options = new ODataOptions();

            // Act & Assert
            ExceptionAssert.ThrowsArgumentNull(() => options.AddRouteComponents("odata", null, builder => { }), "model");
        }
示例#7
0
        public void AddRouteComponents_Strips_RoutePrefix_Leading_And_Trailing_Slashes(string routePrefix, string expectedRoutePrefix)
        {
            // Arrange
            ODataOptions options  = new ODataOptions();
            IEdmModel    edmModel = EdmCoreModel.Instance;

            // Act
            options.AddRouteComponents(routePrefix, edmModel, services => services.AddSingleton <IODataFeature, ODataFeature>());

            // Assert
            Assert.False(options.RouteComponents.ContainsKey(routePrefix));
            Assert.True(options.RouteComponents.ContainsKey(expectedRoutePrefix));
        }
示例#8
0
        public void GetRouteServices_ReturnsCorrectServiceProvider()
        {
            // Arrange
            ODataOptions options  = new ODataOptions();
            IEdmModel    edmModel = EdmCoreModel.Instance;

            // Act
            options.AddRouteComponents("odata", edmModel);

            // & Assert
            IServiceProvider sp = options.GetRouteServices("odata");

            Assert.NotNull(sp);
        }
示例#9
0
        public void AddRouteComponents_WithoutOrWithPrefix_SetModel(string prefix)
        {
            // Arrange
            ODataOptions options  = new ODataOptions();
            IEdmModel    edmModel = EdmCoreModel.Instance;

            // Act
            if (prefix == null)
            {
                options.AddRouteComponents(edmModel);
            }
            else
            {
                options.AddRouteComponents(prefix, edmModel);
            }

            // Assert
            KeyValuePair <string, (IEdmModel, IServiceProvider)> model = Assert.Single(options.RouteComponents);

            Assert.Equal(prefix ?? String.Empty, model.Key);

            Assert.Same(edmModel, model.Value.Item1);
            Assert.NotNull(model.Value.Item2);
        }
示例#10
0
        public void OnProvidersExecuted_AddODataRoutingSelector_WhenEntityRoutingConvention()
        {
            // Arrange
            ODataOptions options = new ODataOptions();

            options.AddRouteComponents("odata", _model);

            IODataControllerActionConvention[] conventions = new IODataControllerActionConvention[]
            {
                new EntityRoutingConvention()
            };

            ODataRoutingApplicationModelProvider provider = CreateProvider(options, conventions);

            Type controllerType = typeof(CustomersController);
            ApplicationModelProviderContext providerContext = CreateProviderContext(controllerType);

            // Act
            provider.OnProvidersExecuted(providerContext);

            // Assert
            ControllerModel controller = Assert.Single(providerContext.Result.Controllers);

            Assert.Equal(2, controller.Actions.Count);
            Assert.Collection(controller.Actions,
                              e =>
            {
                // Get()
                Assert.Equal("Get", e.ActionMethod.Name);
                Assert.Empty(e.Parameters);
                var selector = Assert.Single(e.Selectors);
                Assert.Null(selector.AttributeRouteModel);
            },
                              e =>
            {
                // Get(int key)
                Assert.Equal("Get", e.ActionMethod.Name);
                Assert.Single(e.Parameters);
                Assert.Equal(2, e.Selectors.Count);
                Assert.Equal(new[] { "/odata/Customers({key})", "/odata/Customers/{key}" }, e.Selectors.Select(s => s.AttributeRouteModel.Template));
            });
        }
示例#11
0
        public void AddRouteComponents_WithDependencyInjection_SetModelAndServices()
        {
            // Arrange
            ODataOptions options  = new ODataOptions();
            IEdmModel    edmModel = EdmCoreModel.Instance;

            // Act
            options.AddRouteComponents("odata", edmModel, services => services.AddSingleton <IODataFeature, ODataFeature>());

            // Assert
            KeyValuePair <string, (IEdmModel, IServiceProvider)> model = Assert.Single(options.RouteComponents);

            Assert.Equal("odata", model.Key);

            Assert.Same(edmModel, model.Value.Item1);
            Assert.NotNull(model.Value.Item2);
            IODataFeature actual = model.Value.Item2.GetService <IODataFeature>();

            Assert.IsType <ODataFeature>(actual);
        }
示例#12
0
        public void GetRouteServices_ReturnsCorrectServiceProvider_When_Leading_Or_Trailing_Slashes(string routePrefix)
        {
            // Arrange
            ODataOptions options  = new ODataOptions();
            IEdmModel    edmModel = EdmCoreModel.Instance;

            // Act
            options.AddRouteComponents(routePrefix, edmModel);

            // & Assert
            // can retrieve service provider using original routePrefix
            IServiceProvider sp = options.GetRouteServices(routePrefix);

            Assert.NotNull(sp);

            // can retrieve service provider using sanitized routePrefix
            string           sanitizedRoutePrefix = "odata";
            IServiceProvider sp2 = options.GetRouteServices(sanitizedRoutePrefix);

            Assert.NotNull(sp2);
        }
示例#13
0
        public void AddRouteComponents_WithBatchHandler_SetModel()
        {
            // Arrange
            ODataOptions      options  = new ODataOptions();
            IEdmModel         edmModel = EdmCoreModel.Instance;
            ODataBatchHandler handler  = new Mock <ODataBatchHandler>().Object;

            // Act
            options.AddRouteComponents(edmModel, handler);

            // Assert
            KeyValuePair <string, (IEdmModel, IServiceProvider)> model = Assert.Single(options.RouteComponents);

            Assert.Equal(String.Empty, model.Key);

            Assert.Same(edmModel, model.Value.Item1);
            Assert.NotNull(model.Value.Item2);
            ODataBatchHandler actual = model.Value.Item2.GetService <ODataBatchHandler>();

            Assert.Same(handler, actual);
        }
示例#14
0
        public void OnProvidersExecuting_DoesNothing()
        {
            // Arrange
            ODataOptions options = new ODataOptions();

            options.AddRouteComponents("odata", _model);

            IODataControllerActionConvention[] conventions = new IODataControllerActionConvention[]
            {
                new EntitySetRoutingConvention()
            };

            ODataRoutingApplicationModelProvider provider = CreateProvider(options, conventions);

            Type controllerType = typeof(CustomersController);
            ApplicationModelProviderContext providerContext = CreateProviderContext(controllerType);

            // Act
            provider.OnProvidersExecuting(providerContext);

            // Assert
            var controller = Assert.Single(providerContext.Result.Controllers);

            Assert.Collection(controller.Actions,
                              e =>
            {
                // Get()
                Assert.Equal("Get", e.ActionMethod.Name);
                Assert.Empty(e.Parameters);
                Assert.Single(e.Selectors);
            },
                              e =>
            {
                // Get(int key)
                Assert.Equal("Get", e.ActionMethod.Name);
                Assert.Single(e.Parameters);
                Assert.Single(e.Selectors);
            });
        }
示例#15
0
        public Task ApplyAsync(HttpContext httpContext, CandidateSet candidates)
        {
            if (httpContext == null)
            {
                throw new ArgumentNullException(nameof(httpContext));
            }

            IODataFeature odataFeature = httpContext.ODataFeature();

            if (odataFeature.Path != null)
            {
                // If we have the OData path setting, it means there's some Policy working.
                // Let's skip this default OData matcher policy.
                return(Task.CompletedTask);
            }

            for (var i = 0; i < candidates.Count; i++)
            {
                ref CandidateState candidate = ref candidates[i];
                if (!candidates.IsValidCandidate(i))
                {
                    continue;
                }

                IODataRoutingMetadata metadata = candidate.Endpoint.Metadata.OfType <IODataRoutingMetadata>().FirstOrDefault();
                if (metadata == null)
                {
                    continue;
                }

                // Get api-version query from HttpRequest?
                QueryStringApiVersionReader reader = new QueryStringApiVersionReader("api-version");
                string apiVersionStr = reader.Read(httpContext.Request);
                if (apiVersionStr == null)
                {
                    candidates.SetValidity(i, false);
                    continue;
                }
                ApiVersion apiVersion = ApiVersion.Parse(apiVersionStr);

                IEdmModel model = GetEdmModel(apiVersion);
                if (model == null)
                {
                    candidates.SetValidity(i, false);
                    continue;
                }

                if (!IsApiVersionMatch(candidate.Endpoint.Metadata, apiVersion))
                {
                    candidates.SetValidity(i, false);
                    continue;
                }

                ODataTemplateTranslateContext translatorContext
                    = new ODataTemplateTranslateContext(httpContext, candidate.Endpoint, candidate.Values, model);

                try
                {
                    ODataPath odataPath = _translator.Translate(metadata.Template, translatorContext);
                    if (odataPath != null)
                    {
                        odataFeature.RoutePrefix = metadata.Prefix;
                        odataFeature.Model       = model;
                        odataFeature.Path        = odataPath;

                        ODataOptions options = new ODataOptions();
                        UpdateQuerySetting(options);
                        options.AddRouteComponents(model);
                        odataFeature.Services = options.GetRouteServices(string.Empty);

                        MergeRouteValues(translatorContext.UpdatedValues, candidate.Values);
                    }
                    else
                    {
                        candidates.SetValidity(i, false);
                    }
                }
                catch
                {
                    candidates.SetValidity(i, false);
                }
            }