private void IndexHandler(ResourceModel resource, HandlerModel handler, ResourceMetadata metadata)
        {
            var exclusions = new List <string> {
                "ToString", "GetType", "GetHashCode", "Equals"
            };

            foreach (var uri in metadata.Uris)
            {
                var candidateMethods = handler.Type.StaticType.GetMethods()
                                       .Where(x => x.IsPublic)
                                       .Where(x => !exclusions.Contains(x.Name))
                                       .Where(x => !x.IsSpecialName)
                                       .Where(x => !IsMethodObsolete(x))
                                       .ToList();

                foreach (var publicMethod in candidateMethods)
                {
                    var operation = new OperationMetadata(uri, resource.ResourceKey as IType);

                    if (DiscoveryRules.All(x => x.Discover(publicMethod, operation)))
                    {
                        metadata.Add(operation);
                        operation.Group = _grouper.Group(resource, uri, operation);
                    }
                }
            }
        }
        public void SetUp()
        {
            _sut = new DiscoverReturnType();

            _returnType = new Mock<IMember>();
           
            _metadata = new OperationMetadata(new UriModel { Uri = "/some/uri" }, _returnType.Object);
        }
        public void NamesMatchCorrectly()
        {
            var method1 = typeof(SampleHandler).GetMethod("NameTest1");
            var method2 = typeof(SampleHandler).GetMethod("NameTest2");
            var metadata = new OperationMetadata(new UriModel { Uri = "/some/uri", Name = "NameTest1" }, null);

            Assert.IsTrue(_sut.Discover(method1, metadata));
            Assert.IsFalse(_sut.Discover(method2, metadata));
        }
        public void CanFindQueryParamForPrimativeType()
        {
            var methodToDetect = typeof(TestHandler).GetMethod("GetInt");

            var metadata = new OperationMetadata(new UriModel { Uri = "/some/uri?s={i}" });

            _sut.Discover(methodToDetect, metadata);

            Assert.That(metadata.InputParameters[0].LocationType, Is.EqualTo(InputParameter.LocationTypes.Query));
        }
        public void CanFindPathParam()
        {
            var methodToDetect = typeof(TestHandler).GetMethod("GetString");

            var metadata = new OperationMetadata(new UriModel { Uri = "/some/uri/{s}" });

            _sut.Discover(methodToDetect, metadata);

            Assert.That(metadata.InputParameters[0].LocationType, Is.EqualTo(InputParameter.LocationTypes.Path));
        }
        public OperationGroup Group(ResourceModel resourceModel, UriModel uriModel, OperationMetadata operation)
        {
            var operationCanBeGroupedByUri = _groupRegex.Match(uriModel.Uri);

            if (!operationCanBeGroupedByUri.Success)
            {
                return new OperationGroup { Name = "everything else", Path = "misc" };
            }

            string resourceName = operationCanBeGroupedByUri.Groups[1].Value.ToLower();

            return new OperationGroup
            {
                Name = string.Format("Operations about {0}", resourceName),
                Path = resourceName
            };
        }
        public void CanFindHeaderParams()
        {
            var methodToDetect = typeof(TestHandler).GetMethod("GetString");

            var metadata = new OperationMetadata(new UriModel { Uri = "/some" });

            _sut.Discover(methodToDetect, metadata);

            Assert.That(metadata.InputParameters[1].LocationType, Is.EqualTo(InputParameter.LocationTypes.Header));
            Assert.That(metadata.InputParameters[1].Name, Is.EqualTo("A required header name"));
            Assert.That(metadata.InputParameters[1].Type, Is.EqualTo(typeof(int)));
            Assert.That(metadata.InputParameters[1].IsRequired, Is.EqualTo(true));

            Assert.That(metadata.InputParameters[2].LocationType, Is.EqualTo(InputParameter.LocationTypes.Header));
            Assert.That(metadata.InputParameters[2].Name, Is.EqualTo("A header name"));
            Assert.That(metadata.InputParameters[2].Type, Is.EqualTo(typeof(string)));
            Assert.That(metadata.InputParameters[2].IsRequired, Is.EqualTo(false));
        }
        private void IndexHandler(ResourceModel resource, HandlerModel handler, ResourceMetadata metadata)
        {
            var exclusions = new List<string> { "ToString", "GetType", "GetHashCode", "Equals" };

            foreach (var uri in metadata.Uris)
            {
                var candidateMethods = handler.Type.StaticType.GetMethods()
                    .Where(x => x.IsPublic && !exclusions.Contains(x.Name) && !x.IsSpecialName);

                foreach (var publicMethod in candidateMethods)
                {
                    var operation = new OperationMetadata(uri, resource.ResourceKey as IType);

                    if (DiscoveryRules.All(x => x.Discover(publicMethod, operation)))
                    {
                        metadata.Add(operation);
                        operation.Group = _grouper.Group(resource, uri, operation);
                    }
                }
            }
        }
        public OperationGroup Group(ResourceModel resourceModel, UriModel uriModel, OperationMetadata operation)
        {
            if (IsUnknownReturnType(operation.ReturnType))
            {
                return new OperationGroup { Name = "Unknown", Path = "unknown" };                
            }

            if (IsEnumerableButNotAString(operation))
            {
                var collectionType = operation.ReturnType.GetElementType();
                if (operation.ReturnType.IsGenericType)
                {
                    collectionType = operation.ReturnType.GetGenericArguments()[0];
                }

                return new OperationGroup
                {
                    Name = "Collection of " + collectionType.Name,
                    Path = collectionType.Name.ToLower() + "[]"
                };
            }

            return new OperationGroup {Name = operation.ReturnType.Name, Path = operation.ReturnType.Name.ToLower()};
        }
        public void IfComplexTypeAndSpecifiedInPath()
        {
            var methodToDetect = typeof(TestHandler).GetMethod("GetRequest");

            var metadata = new OperationMetadata(new UriModel { Uri = "/some/uri/{req}" });

            _sut.Discover(methodToDetect, metadata);

            Assert.That(metadata.InputParameters[0].LocationType, Is.EqualTo(InputParameter.LocationTypes.Path));
            Assert.That(metadata.InputParameters[0].Type, Is.EqualTo(typeof(string)));
        }
        public void InfersSimpleParamToBeQueryStringWhenNotSpecified()
        {
            var methodToDetect = typeof(TestHandler).GetMethod("GetString");

            var metadata = new OperationMetadata(new UriModel { Uri = "/some/uri" });

            _sut.Discover(methodToDetect, metadata);

            Assert.That(metadata.InputParameters[0].LocationType, Is.EqualTo(InputParameter.LocationTypes.Query));
        }
        public void InfersComplexParamToBeBody()
        {
            var methodToDetect = typeof(TestHandler).GetMethod("GetRequest");

            var metadata = new OperationMetadata(new UriModel { Uri = "/some/uri" });

            _sut.Discover(methodToDetect, metadata);

            Assert.That(metadata.InputParameters[0].LocationType, Is.EqualTo(InputParameter.LocationTypes.Body));
        }
 public void SetUp()
 {
     _sut = new DiscoverHttpMethodVerbs();
     _metadata = new OperationMetadata(new UriModel { Uri = "/some/uri" });
 }
        public void ParamsMatch()
        {
            var method1 = typeof(TestHandler).GetMethod("ParamTest1");
            var method2 = typeof(TestHandler).GetMethod("ParamTest2");

            var metadata = new OperationMetadata(new UriModel { Uri = "/some/uri/{myString}" }, null);

            Assert.That(_sut.Discover(method1, metadata), Is.True);
            Assert.That(_sut.Discover(method2, metadata), Is.False);
        }
 public bool Discover(MethodInfo method, OperationMetadata methodMetdata)
 {
     Called = true;
     MethodInfo = method;
     return true;
 }
 private static bool IsEnumerableButNotAString(OperationMetadata operation)
 {
     return (operation.ReturnType != typeof(string)) && operation.ReturnType.Implements<IEnumerable>();
 }