Esempio n. 1
0
        public void Should_return_first_route_with_when_multiple_matches_are_available_and_contains_same_number_of_parameter_captures()
        {
            // Given
            var request = new FakeRequest("get", "/foo/bar");
            var context = new NancyContext();

            context.Request = request;
            var routeCache = new FakeRouteCache(x =>
            {
                x.AddGetRoute("/foo/{bar}", "first-module-key-parameters");
                x.AddGetRoute("/foo/{bar}", "second-module-key-parameters");
            });

            this.expectedModule = new FakeNancyModule(x =>
            {
                x.AddGetRoute("/foo/{bar}", this.expectedAction);
            });

            A.CallTo(() => this.matcher.Match(request.Uri, "/foo/{bar}")).Returns(
                new FakeRoutePatternMatchResult(x => x.IsMatch(true).AddParameter("bar", "fake value")));

            // When
            this.resolver.Resolve(context, routeCache);

            // Then
            A.CallTo(() => this.catalog.GetModuleByKey("first-module-key-parameters", context)).MustHaveHappened();
        }
Esempio n. 2
0
        public void Should_return_route_with_most_parameter_captures_when_multiple_matches_with_parameters_are_available()
        {
            // Given
            var request = new FakeRequest("get", "/foo/bar/foo");
            var context = new NancyContext {
                Request = request
            };
            var routeCache = new FakeRouteCache(x =>
            {
                x.AddGetRoute("/foo/{bar}/{foo}", "module-key-two-parameters");
                x.AddGetRoute("/foo/{bar}", "module-key-one-parameter");
            });

            A.CallTo(() => this.matcher.Match(request.Path, "/foo/{bar}")).Returns(
                new FakeRoutePatternMatchResult(x => x.IsMatch(true).AddParameter("bar", "fake value")));

            A.CallTo(() => this.matcher.Match(request.Path, "/foo/{bar}/{foo}")).Returns(
                new FakeRoutePatternMatchResult(x => x.IsMatch(true)
                                                .AddParameter("foo", "fake value")
                                                .AddParameter("bar", "fake value 2")));

            // When
            this.resolver.Resolve(context, routeCache);

            // Then
            A.CallTo(() => this.catalog.GetModuleByKey("module-key-two-parameters", context)).MustHaveHappened();
        }
        public void Should_fail_to_resolve_route_because_it_does_have_an_invalid_condition()
        {
            // Given
            var cache = new FakeRouteCache(with => {
                with.AddGetRoute("/invalidcondition", "modulekey", ctx => false);
            });

            var bootstrapper = new ConfigurableBootstrapper(with =>{
                with.RouteCache(cache);
            });

            var browser = new Browser(bootstrapper);

            // When
            var timer = new Stopwatch();
            timer.Start();

            for (var i = 0; i < numberOfTimesToResolveRoute; i++)
            {
                var result = browser.Get("/invalidcondition");
                result.StatusCode.ShouldEqual(HttpStatusCode.NotFound);
            }

            timer.Stop();

            // Then
            Debug.WriteLine(" took {0} to execute {1} times", timer.Elapsed, numberOfTimesToResolveRoute);
        }
        private DefaultRouteResolver CreateResolver(Action <FakeRouteCache.FakeRouteCacheConfigurator> closure)
        {
            var cache =
                new FakeRouteCache(closure);

            return(CreateResolver(cache));
        }
Esempio n. 5
0
        public void Should_return_the_first_route_that_is_an_exact_match_over_any_other()
        {
            // Given
            var request = new FakeRequest("get", "/foo/bar");
            var context = new NancyContext {
                Request = request
            };
            var routeCache = new FakeRouteCache(x =>
            {
                x.AddGetRoute("/foo/{bar}", "module-key-parameters");
                x.AddGetRoute("/{foo}/{bar}", "module-key-two-parameters");
                x.AddGetRoute("/foo/bar", "module-key-no-parameters");
                x.AddGetRoute("/foo/bar", "module-key-no-parameters-second");
                x.AddGetRoute("/foo/{bar}", "module-key-parameters");
                x.AddGetRoute("/{foo}/{bar}", "module-key-two-parameters");
            });

            A.CallTo(() => this.matcher.Match(request.Path, "/foo/bar")).Returns(
                new FakeRoutePatternMatchResult(x => x.IsMatch(true)));

            A.CallTo(() => this.matcher.Match(request.Path, "/foo/{bar}")).Returns(
                new FakeRoutePatternMatchResult(x => x.IsMatch(true).AddParameter("bar", "fake value")));

            A.CallTo(() => this.matcher.Match(request.Path, "/foo/{bar}")).Returns(
                new FakeRoutePatternMatchResult(x => x.IsMatch(true)
                                                .AddParameter("foo", "fake value")
                                                .AddParameter("bar", "fake value")));
            // When
            this.resolver.Resolve(context, routeCache);

            // Then
            A.CallTo(() => this.catalog.GetModuleByKey("module-key-no-parameters", context)).MustHaveHappened();
        }
Esempio n. 6
0
        public void Should_invoke_module_builder_with_context_and_resolved_module()
        {
            // Given
            var request = new FakeRequest("GET", "/foo/bar");
            var context = new NancyContext {
                Request = request
            };
            var routeCache = new FakeRouteCache(x => x.AddGetRoute("/foo/bar"));

            // When
            this.resolver.Resolve(context, routeCache);

            // Then
            A.CallTo(() => this.moduleBuilder.BuildModule(this.expectedModule, context)).MustHaveHappened();
        }
Esempio n. 7
0
        public void Should_invoke_pattern_matcher_with_request_uri()
        {
            // Given
            var request = new FakeRequest("get", "/foo/bar");
            var context = new NancyContext();

            context.Request = request;
            var routeCache = new FakeRouteCache(x =>
            {
                x.AddGetRoute("/foo/bar");
            });

            // When
            this.resolver.Resolve(context, routeCache);

            // Then
            A.CallTo(() => this.matcher.Match(request.Uri, A <string> .Ignored)).MustHaveHappened();
        }
Esempio n. 8
0
        public void Should_return_route_with_path_set_to_request_uri_when_single_route_could_be_resolved()
        {
            // Given
            var request = new FakeRequest("GET", "/foo/bar");
            var context = new NancyContext();

            context.Request = request;
            var routeCache = new FakeRouteCache(x =>
            {
                x.AddGetRoute("/foo/bar");
            });

            // When
            var resolvedRoute = this.resolver.Resolve(context, routeCache);

            // Then
            resolvedRoute.ShouldNotBeOfType <NotFoundRoute>();
            resolvedRoute.Item1.Description.Path.ShouldEqual(request.Uri);
        }
Esempio n. 9
0
        public void Should_ignore_method_casing_when_resolving_routes()
        {
            var request = new FakeRequest("GeT", "/foo/bar");
            var context = new NancyContext();

            context.Request = request;
            var routeCache = new FakeRouteCache(x =>
            {
                x.AddGetRoute("/foo/bar");
            });

            // When
            var resolvedRoute = this.resolver.Resolve(context, routeCache);

            // Then
            resolvedRoute.ShouldNotBeNull();
            resolvedRoute.ShouldNotBeOfType <NotFoundRoute>();
            resolvedRoute.ShouldNotBeOfType <MethodNotAllowedRoute>();
        }
Esempio n. 10
0
        public void Should_return_methodnotallowedroute_with_path_set_to_request_uri_when_matched_route_was_for_wrong_request_method()
        {
            // Given
            var request = new FakeRequest("POST", "/foo/bar");
            var context = new NancyContext();

            context.Request = request;
            var routeCache = new FakeRouteCache(x =>
            {
                x.AddGetRoute("/foo/bar");
            });

            // When
            var route = this.resolver.Resolve(context, routeCache).Item1;

            // Then
            route.ShouldNotBeNull();
            route.ShouldBeOfType <MethodNotAllowedRoute>();
            route.Description.Path.ShouldEqual(request.Uri);
        }
Esempio n. 11
0
        public void Should_set_action_on_resolved_route()
        {
            // Given
            var request = new FakeRequest("get", "/foo/bar");
            var context = new NancyContext();

            context.Request = request;
            var routeCache = new FakeRouteCache(x =>
            {
                x.AddGetRoute("/foo/bar", "module-key");
            });

            // When
            var resolvedRoute = this.resolver.Resolve(context, routeCache).Item1;

            // Then
            resolvedRoute.ShouldNotBeOfType <NotFoundRoute>();
            resolvedRoute.ShouldNotBeOfType <MethodNotAllowedRoute>();
            resolvedRoute.Action.ShouldBeSameAs(this.expectedAction);
        }
Esempio n. 12
0
        public void Should_allow_head_request_when_route_is_defined_for_get()
        {
            // Given
            var request = new FakeRequest("HEAD", "/foo/bar");
            var context = new NancyContext();

            context.Request = request;
            var routeCache = new FakeRouteCache(x =>
            {
                x.AddGetRoute("/foo/bar");
            });

            // When
            var resolvedRoute = this.resolver.Resolve(context, routeCache);

            // Then
            resolvedRoute.ShouldNotBeNull();
            resolvedRoute.ShouldNotBeOfType <NotFoundRoute>();
            resolvedRoute.ShouldNotBeOfType <MethodNotAllowedRoute>();
        }
Esempio n. 13
0
        public void Should_set_parameters_on_resolved_route_to_parameteres_that_was_matched()
        {
            // Given
            var request = new FakeRequest("get", "/foo/bar");
            var context = new NancyContext();

            context.Request = request;
            var routeCache = new FakeRouteCache(x =>
            {
                x.AddGetRoute("/foo/bar", "module-key");
            });

            // When
            var resolvedRoute = this.resolver.Resolve(context, routeCache);

            // Then
            resolvedRoute.ShouldNotBeOfType <NotFoundRoute>();
            resolvedRoute.ShouldNotBeOfType <MethodNotAllowedRoute>();
            ((string)resolvedRoute.Item2["foo"]).ShouldEqual("bar");
        }
Esempio n. 14
0
        public void Should_return_route_with_module_returned_by_module_builder()
        {
            // Given
            var request = new FakeRequest("GET", "/foo/bar");
            var context = new NancyContext {
                Request = request
            };
            var routeCache = new FakeRouteCache(x => x.AddGetRoute("/foo/bar"));

            var moduleReturnedByBuilder = new FakeNancyModule(x => x.AddGetRoute("/bar/foo"));

            A.CallTo(() => this.moduleBuilder.BuildModule(A <NancyModule> .Ignored, A <NancyContext> .Ignored)).Returns(
                moduleReturnedByBuilder);

            // When
            var route = this.resolver.Resolve(context, routeCache);

            // Then
            route.Item1.Description.Path.ShouldEqual("/bar/foo");
        }
Esempio n. 15
0
        public void Should_return_methodnotallowedroute_with_allow_header_set_to_allowed_methods_matching_request_route()
        {
            // Given
            var request = new FakeRequest("POST", "/foo/bar");
            var context = new NancyContext();

            context.Request = request;
            var routeCache = new FakeRouteCache(x =>
            {
                x.AddGetRoute("/foo/bar");
                x.AddPutRoute("/foo/bar");
            });

            // When
            var route = this.resolver.Resolve(context, routeCache).Item1;

            // Then
            route.ShouldNotBeNull();
            route.ShouldBeOfType <MethodNotAllowedRoute>();
            route.Invoke(new DynamicDictionary()).Headers["Allow"].ShouldEqual("GET, PUT");
        }
Esempio n. 16
0
        public void Should_return_notfoundroute_with_path_set_to_request_uri_when_route_could_not_be_resolved()
        {
            // Given
            var request = new FakeRequest("GET", "/foo/bar");
            var context = new NancyContext();

            context.Request = request;
            var routeCache = new FakeRouteCache(x =>
            {
                x.AddGetRoute("/bar/foo");
            });

            A.CallTo(() => this.matcher.Match("/foo/bar", "/bar/foo")).Returns(
                new FakeRoutePatternMatchResult(x => x.IsMatch(false)));

            // When
            var resolvedRoute = this.resolver.Resolve(context, routeCache).Item1;

            // Then
            resolvedRoute.ShouldBeOfType <NotFoundRoute>();
            resolvedRoute.Description.Path.ShouldEqual(request.Uri);
        }
Esempio n. 17
0
        public void Should_invoke_pattern_matcher_for_all_entries_in_route_cache()
        {
            // Given
            var request = new FakeRequest("get", "/foo/bar");
            var context = new NancyContext();

            context.Request = request;
            var routeCache = new FakeRouteCache(x =>
            {
                x.AddGetRoute("/foo/bar");
                x.AddGetRoute("/bar/foo");
                x.AddGetRoute("/foobar");
            });

            // When
            this.resolver.Resolve(context, routeCache);

            // Then
            A.CallTo(() => this.matcher.Match(A <string> .Ignored, "/foo/bar")).MustHaveHappened();
            A.CallTo(() => this.matcher.Match(A <string> .Ignored, "/bar/foo")).MustHaveHappened();
            A.CallTo(() => this.matcher.Match(A <string> .Ignored, "/foobar")).MustHaveHappened();
        }
        public void Should_find_exact_match()
        {
            // Given
            var catalog = A.Fake<INancyModuleCatalog>();
            A.CallTo(() => catalog.GetModuleByKey(A<string>._, A<NancyContext>._)).Returns(new FakeNancyModule());

            var cache = new FakeRouteCache(with =>
            {
                with.AddGetRoute("/foo", "modulekey");
            });

            var module = new FakeNancyModule(with => {
                with.AddGetRoute("/foo");
            });

            var bootstrapper = new ConfigurableBootstrapper(with =>{
                with.Module(module, "modulekey");
                with.RouteCache(cache);
            });

            var browser = new Browser(bootstrapper);

            // When
            var timer = new Stopwatch();
            timer.Start();

            for (var i = 0; i < numberOfTimesToResolveRoute; i++)
            {
                var result = browser.Get("/foo");
                result.StatusCode.ShouldEqual(HttpStatusCode.OK);
            }

            timer.Stop();

            // Then
            Debug.WriteLine(" took {0} to execute {1} times", timer.Elapsed, numberOfTimesToResolveRoute);
        }
Esempio n. 19
0
        public void Should_return_the_route_with_the_most_specific_path_matches()
        {
            // The most specific path match is the one with the most matching segments (delimited by '/') and the
            // least parameter captures (i.e. the most exact matching segments)
            // Given
            var request = new FakeRequest("get", "/foo/bar/me");
            var context = new NancyContext {
                Request = request
            };
            var routeCache = new FakeRouteCache(x =>
            {
                x.AddGetRoute("/foo/{bar}", "module-key-first");
                x.AddGetRoute("/foo/{bar}/{two}", "module-key-third");
                x.AddGetRoute("/foo/bar/{two}", "module-key-second");
                x.AddGetRoute("/foo/{bar}/{two}", "module-key-third");
            });

            this.expectedModule = new FakeNancyModule(x => x.AddGetRoute("/foo/bar/{two}", this.expectedAction));

            A.CallTo(() => this.matcher.Match(request.Path, "/foo/bar/{two}")).Returns(
                new FakeRoutePatternMatchResult(x => x.IsMatch(true).AddParameter("two", "fake values")));

            A.CallTo(() => this.matcher.Match(request.Path, "/foo/{bar}/{two}")).Returns(
                new FakeRoutePatternMatchResult(x => x.IsMatch(true)
                                                .AddParameter("bar", "fake values")
                                                .AddParameter("two", "fake values")));

            A.CallTo(() => this.matcher.Match(request.Path, "/foo/{bar}")).Returns(
                new FakeRoutePatternMatchResult(x => x.IsMatch(true).AddParameter("bar", "fake value")));

            // When
            this.resolver.Resolve(context, routeCache);

            // Then
            A.CallTo(() => this.catalog.GetModuleByKey("module-key-second", context)).MustHaveHappened();
        }
Esempio n. 20
0
        public void Should_choose_root_route_over_one_with_capture_if_requesting_root_uri()
        {
            var request = new FakeRequest("get", "/");
            var context = new NancyContext {
                Request = request
            };
            var routeCache = new FakeRouteCache(x =>
            {
                x.AddGetRoute("/{name}", "module-key-second");
                x.AddGetRoute("/", "module-key-first");
                x.AddGetRoute("/{name}", "module-key-second");
            });

            A.CallTo(() => this.matcher.Match(request.Path, "/")).Returns(
                new FakeRoutePatternMatchResult(x => x.IsMatch(true)));
            A.CallTo(() => this.matcher.Match(request.Path, "/{name}")).Returns(
                new FakeRoutePatternMatchResult(x => x.IsMatch(true).AddParameter("name", "fake values")));

            // When
            this.resolver.Resolve(context, routeCache);

            // Then
            A.CallTo(() => this.catalog.GetModuleByKey("module-key-first", context)).MustHaveHappened();
        }
        public void Should_not_find_matching_method()
        {
            // Given
            var cache = new FakeRouteCache(with =>
            {
                with.AddGetRoute("/path", "modulekey");
            });

            var bootstrapper = new ConfigurableBootstrapper(with =>
            {
                with.RouteCache(cache);
            });

            var browser = new Browser(bootstrapper);

            // When
            var timer = new Stopwatch();
            timer.Start();

            for (var i = 0; i < numberOfTimesToResolveRoute; i++)
            {
                var result = browser.Post("/path");
                result.StatusCode.ShouldEqual(HttpStatusCode.MethodNotAllowed);
            }

            timer.Stop();

            // Then
            Debug.WriteLine(" took {0} to execute {1} times", timer.Elapsed, numberOfTimesToResolveRoute);
        }