public void OnProvidersExecuted_AddODataRoutingSelector_WhenAttributeRoutingConvention()
        {
            // Arrange
            ODataOptions options = new ODataOptions();

            options.AddModel("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);
            Assert.Equal(2, action.Selectors.Count);
            Assert.Equal(new[] { "odata/Customers({key})/Name", "odata/Customers/{key}/Name" }, action.Selectors.Select(s => s.AttributeRouteModel.Template));
        }
示例#2
0
        public void ParseODataUriTemplate_ForFunctionImport(string template, int parameterCount)
        {
            // Arrange
            EdmFunction getSalaray = new EdmFunction("NS", "GetWholeSalaryImport", IntType, isBound: false, entitySetPathExpression: null, isComposable: false);

            getSalaray.AddParameter("minSalary", IntType);
            getSalaray.AddOptionalParameter("maxSalary", IntType);
            getSalaray.AddOptionalParameter("aveSalary", IntType, "129");
            _edmModel.AddElement(getSalaray);

            EdmEntityContainer container = _edmModel.SchemaElements.OfType <EdmEntityContainer>().First();

            container.AddFunctionImport(getSalaray);

            IODataPathTemplateParser parser = new DefaultODataPathTemplateParser();

            // Act
            ODataPathTemplate path = parser.Parse(_edmModel, template, null);

            // Assert
            Assert.NotNull(path);
            ODataSegmentTemplate          segmentTemplate       = Assert.Single(path);
            FunctionImportSegmentTemplate functionImportSegment = Assert.IsType <FunctionImportSegmentTemplate>(segmentTemplate);

            if (parameterCount == 2)
            {
                Assert.Equal(new[] { "minSalary", "maxSalary" }, functionImportSegment.ParameterMappings.Keys);
                Assert.Equal(new[] { "min", "max" }, functionImportSegment.ParameterMappings.Values);
            }
            else
            {
                Assert.Equal(new[] { "minSalary", "maxSalary", "aveSalary" }, functionImportSegment.ParameterMappings.Keys);
                Assert.Equal(new[] { "min", "max", "ave" }, functionImportSegment.ParameterMappings.Values);
            }
        }
示例#3
0
        public void ParseODataUriTemplate_ForCompositeKeys(string template)
        {
            // Arrange
            // function with optional parameters
            EdmEntityType         person    = new EdmEntityType("NS", "Person");
            EdmStructuralProperty firstName = person.AddStructuralProperty("firstName", EdmPrimitiveTypeKind.String);
            EdmStructuralProperty lastName  = person.AddStructuralProperty("lastName", EdmPrimitiveTypeKind.String);

            person.AddKeys(firstName, lastName);
            _edmModel.AddElement(person);

            EdmEntityContainer container = _edmModel.SchemaElements.OfType <EdmEntityContainer>().First();

            container.AddEntitySet("People", person);

            IODataPathTemplateParser parser = new DefaultODataPathTemplateParser();

            // Act
            ODataPathTemplate path = parser.Parse(_edmModel, template, null);

            // Assert
            Assert.NotNull(path);
            Assert.Equal(2, path.Count);
            KeySegmentTemplate keySegment = Assert.IsType <KeySegmentTemplate>(path[1]);

            Assert.Equal(2, keySegment.KeyMappings.Count);

            Assert.Equal(new[] { "firstName", "lastName" }, keySegment.KeyMappings.Keys);
            Assert.Equal(new[] { "first", "last" }, keySegment.KeyMappings.Values);
        }
示例#4
0
        public void ParseODataUriTemplate_ForActionImport()
        {
            // Arrange
            EdmAction setSalaray = new EdmAction("NS", "SetWholeSalaryImport", IntType, isBound: false, entitySetPathExpression: null);

            setSalaray.AddParameter("minSalary", IntType);
            setSalaray.AddOptionalParameter("maxSalary", IntType);
            setSalaray.AddOptionalParameter("aveSalary", IntType, "129");
            _edmModel.AddElement(setSalaray);

            EdmEntityContainer container = _edmModel.SchemaElements.OfType <EdmEntityContainer>().First();

            container.AddActionImport(setSalaray);

            IODataPathTemplateParser parser = new DefaultODataPathTemplateParser();

            // Act
            ODataPathTemplate path = parser.Parse(_edmModel, "SetWholeSalaryImport", null);

            // Assert
            Assert.NotNull(path);
            ODataSegmentTemplate        segmentTemplate     = Assert.Single(path);
            ActionImportSegmentTemplate actionImportSegment = Assert.IsType <ActionImportSegmentTemplate>(segmentTemplate);

            Assert.Equal("SetWholeSalaryImport", actionImportSegment.ActionImport.Name);
        }
示例#5
0
        public void ParseODataUriTemplate_ForActions(string template)
        {
            // Arrange
            // function with optional parameters
            EdmAction setSalaray = new EdmAction("NS", "SetWholeSalary", IntType, isBound: true, entitySetPathExpression: null);

            setSalaray.AddParameter("entityset", new EdmCollectionTypeReference(new EdmCollectionType(new EdmEntityTypeReference(_customerType, false))));
            setSalaray.AddParameter("minSalary", IntType);
            setSalaray.AddOptionalParameter("maxSalary", IntType);
            setSalaray.AddOptionalParameter("aveSalary", IntType, "129");
            _edmModel.AddElement(setSalaray);

            IODataPathTemplateParser parser = new DefaultODataPathTemplateParser();
            MockServiceProvider      sp     = null;

            if (!template.Contains("NS."))
            {
                sp = new MockServiceProvider(_edmModel);
            }

            // Act
            ODataPathTemplate path = parser.Parse(_edmModel, template, sp);

            // Assert
            Assert.NotNull(path);
            Assert.Equal(2, path.Count);
            ActionSegmentTemplate actionSegment = Assert.IsType <ActionSegmentTemplate>(path[1]);

            Assert.Equal("NS.SetWholeSalary", actionSegment.Action.FullName());
        }
示例#6
0
        public void ParseODataUriTemplateWorksAsExpected(string template, string expectedActionName)
        {
            // Arrange
            IEdmModel model = GetEdmModel();
            IODataPathTemplateParser parser = new DefaultODataPathTemplateParser();

            // Act
            ODataPathTemplate path = parser.Parse(model, template, null);

            // Assert
            Assert.NotNull(expectedActionName);
            Assert.NotNull(path);
        }
示例#7
0
        public void ParseODataUriTemplate_ForSingleton()
        {
            // Arrange
            IODataPathTemplateParser parser = new DefaultODataPathTemplateParser();

            // Act
            ODataPathTemplate path = parser.Parse(_edmModel, "VipCustomer", null);

            // Assert
            Assert.NotNull(path);
            ODataSegmentTemplate     pathSegment      = Assert.Single(path);
            SingletonSegmentTemplate singletonSegment = Assert.IsType <SingletonSegmentTemplate>(pathSegment);

            Assert.Equal("VipCustomer", singletonSegment.Singleton.Name);
        }
示例#8
0
        public void ParseODataUriTemplate_ForEntitySet()
        {
            // Arrange
            IODataPathTemplateParser parser = new DefaultODataPathTemplateParser();

            // Act
            ODataPathTemplate path = parser.Parse(_edmModel, "Customers", null);

            // Assert
            Assert.NotNull(path);
            ODataSegmentTemplate     pathSegment = Assert.Single(path);
            EntitySetSegmentTemplate setSegment  = Assert.IsType <EntitySetSegmentTemplate>(pathSegment);

            Assert.Equal("Customers", setSegment.EntitySet.Name);
        }
示例#9
0
        public void ParseODataUriTemplate_ForNavigationPropertyLink(string template, int count)
        {
            // Arrange
            IODataPathTemplateParser parser = new DefaultODataPathTemplateParser();

            // Act
            ODataPathTemplate path = parser.Parse(_edmModel, template, null);

            // Assert
            Assert.NotNull(path);
            Assert.Equal(count, path.Count);
            NavigationLinkSegmentTemplate navigationSegment = Assert.IsType <NavigationLinkSegmentTemplate>(path[count - 1]);

            Assert.Equal("Orders", navigationSegment.NavigationProperty.Name);
        }
示例#10
0
        public void ParseODataUriTemplate_ForProperty(string template, int count)
        {
            // Arrange
            IODataPathTemplateParser parser = new DefaultODataPathTemplateParser();

            // Act
            ODataPathTemplate path = parser.Parse(_edmModel, template, null);

            // Assert
            Assert.NotNull(path);
            Assert.Equal(count, path.Count);
            PropertySegmentTemplate propertySegment = Assert.IsType <PropertySegmentTemplate>(path[count - 1]);

            Assert.Equal("Name", propertySegment.Property.Name);
        }
示例#11
0
        public void ParseODataUriTemplate_ForBasicKey(string template)
        {
            // Arrange
            IODataPathTemplateParser parser = new DefaultODataPathTemplateParser();

            // Act
            ODataPathTemplate path = parser.Parse(_edmModel, template, null);

            // Assert
            Assert.NotNull(path);
            Assert.Equal(2, path.Count);
            KeySegmentTemplate keySegment = Assert.IsType <KeySegmentTemplate>(path[1]);
            var keyMap = Assert.Single(keySegment.KeyMappings);

            Assert.Equal("Id", keyMap.Key);
            Assert.Equal("idKey", keyMap.Value);
        }
示例#12
0
        public void ParseODataUriTemplate_ForFunctions(string template, int count)
        {
            // Arrange
            // function with optional parameters
            EdmFunction getSalaray = new EdmFunction("NS", "GetWholeSalary", IntType, isBound: true, entitySetPathExpression: null, isComposable: false);

            getSalaray.AddParameter("entityset", new EdmCollectionTypeReference(new EdmCollectionType(new EdmEntityTypeReference(_customerType, false))));
            getSalaray.AddParameter("minSalary", IntType);
            getSalaray.AddOptionalParameter("maxSalary", IntType);
            getSalaray.AddOptionalParameter("aveSalary", IntType, "129");
            _edmModel.AddElement(getSalaray);

            IODataPathTemplateParser parser = new DefaultODataPathTemplateParser();
            MockServiceProvider      sp     = null;

            if (!template.Contains("NS."))
            {
                sp = new MockServiceProvider(_edmModel);
            }

            // Act
            ODataPathTemplate path = parser.Parse(_edmModel, template, sp);

            // Assert
            Assert.NotNull(path);
            Assert.Equal(2, path.Count);
            FunctionSegmentTemplate functionSegment = Assert.IsType <FunctionSegmentTemplate>(path[1]);

            Assert.Equal(count, functionSegment.ParameterMappings.Count);

            if (count == 2)
            {
                Assert.Equal(new[] { "minSalary", "maxSalary" }, functionSegment.ParameterMappings.Keys);
                Assert.Equal(new[] { "min", "max" }, functionSegment.ParameterMappings.Values);
            }
            else
            {
                Assert.Equal(new[] { "minSalary", "maxSalary", "aveSalary" }, functionSegment.ParameterMappings.Keys);
                Assert.Equal(new[] { "min", "max", "ave" }, functionSegment.ParameterMappings.Values);
            }
        }