public void QueryStringScraper_should_support_types(
            string method,
            string name,
            Type type)
        {
            // arrange
            var routeInformation = new RouteInformation
            {
                RouteTemplate = "route"
            };

            // will not support for get a list as querystring
            var description = new ControllerActionDescriptor
            {
                MethodInfo = typeof(FakeController).GetMethod(method)
            };

            // act
            QueryStringScraper.CompleteQueryStringRequiredParams(routeInformation, description);

            // assert
            Assert.Single(routeInformation.QueryParams);
            Assert.Equal(name, routeInformation.QueryParams.First().Key);
            Assert.Equal(type, routeInformation.QueryParams.First().Value);
        }
        public void QueryStringScraper_should_ignore_complex_nested_items_in_a_complex_item()
        {
            // arrange
            var routeInformation = new RouteInformation
            {
                RouteTemplate = "NestedComplexFilter"
            };

            var description = new ControllerActionDescriptor
            {
                MethodInfo = typeof(FakeController).GetMethod("NestedComplexFilter")
            };

            // act
            QueryStringScraper.CompleteQueryStringRequiredParams(routeInformation, description);

            // assert
            Assert.Equal(3, routeInformation.QueryParams.Count);
        }
        public void QueryStringScraper_should_ignore_route_constraints()
        {
            // arrange
            var routeInformation = new RouteInformation
            {
                RouteTemplate = "/api{id}"
            };

            var description = new ControllerActionDescriptor
            {
                MethodInfo = typeof(FakeController).GetMethod("SingleRouteParamInt")
            };

            // act
            QueryStringScraper.CompleteQueryStringRequiredParams(routeInformation, description);

            // assert
            Assert.Empty(routeInformation.QueryParams);
        }
        public void QueryStringScraper_should_ignore_if_type_is_not_supported()
        {
            // arrange
            var routeInformation = new RouteInformation
            {
                RouteTemplate = "UnsupportedQueryString"
            };

            // will not support for get a list as querystring
            var description = new ControllerActionDescriptor
            {
                MethodInfo = typeof(FakeController).GetMethod("UnsupportedQueryString")
            };

            // act
            QueryStringScraper.CompleteQueryStringRequiredParams(routeInformation, description);

            // assert
            Assert.Empty(routeInformation.QueryParams);
        }
        public void QueryStringScraper_should_support_complex_get_params_marked_with_from_query()
        {
            // arrange
            var routeInformation = new RouteInformation
            {
                RouteTemplate = "ComplexFilter"
            };

            var description = new ControllerActionDescriptor
            {
                MethodInfo = typeof(FakeController).GetMethod("ComplexFilter")
            };

            // act
            QueryStringScraper.CompleteQueryStringRequiredParams(routeInformation, description);

            // assert
            Assert.Equal(3, routeInformation.QueryParams.Count); // property count of ComplexFilter
            Assert.Single(routeInformation.QueryParams.Where(r => r.Key == "Name" && r.Value == typeof(string)));
            Assert.Single(routeInformation.QueryParams.Where(r => r.Key == "Id" && r.Value == typeof(int)));
            Assert.Single(routeInformation.QueryParams.Where(r => r.Key == "Date" && r.Value == typeof(DateTime)));
        }
        public void QueryStringScraper_should_ignore_if_attribute_is_saved_as_query_param()
        {
            // arrange
            var routeInformation = new RouteInformation
            {
                RouteTemplate = "/api/{id}",
                QueryParams   = new Dictionary <string, Type>
                {
                    ["id"] = typeof(string)
                }
            };

            var description = new ControllerActionDescriptor
            {
                MethodInfo = typeof(FakeController).GetMethod("SingleRouteParamInt")
            };

            // act
            QueryStringScraper.CompleteQueryStringRequiredParams(routeInformation, description);

            // assert
            Assert.Single(routeInformation.QueryParams);
        }