org.restexpress.route.RouteResolverTest.java Source code

Java tutorial

Introduction

Here is the source code for org.restexpress.route.RouteResolverTest.java

Source

/*
Copyright 2012, Strategic Gains, Inc.
    
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at
    
  http://www.apache.org/licenses/LICENSE-2.0
    
   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/
package org.restexpress.route;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.util.List;

import io.netty.handler.codec.http.DefaultFullHttpRequest;
import io.netty.handler.codec.http.DefaultHttpRequest;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpMethod;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.HttpVersion;
import org.junit.BeforeClass;
import org.junit.Test;
import org.restexpress.Request;
import org.restexpress.Response;
import org.restexpress.exception.MethodNotAllowedException;
import org.restexpress.route.Action;
import org.restexpress.route.RouteDeclaration;
import org.restexpress.route.RouteMapping;
import org.restexpress.route.RouteResolver;
import org.restexpress.settings.RouteDefaults;

/**
 * @author toddf
 * @since May 16, 2012
 */
public class RouteResolverTest {
    private static RouteResolver resolver;
    private static RouteDeclaration routeDeclarations;
    private static RouteMapping routeMapping;

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        routeDeclarations = new Routes();
        ((Routes) routeDeclarations).defineRoutes();
        routeMapping = routeDeclarations.createRouteMapping(new RouteDefaults());
        resolver = new RouteResolver(routeMapping);
    }

    @Test
    public void shouldResolveGetRoute() {
        FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET,
                "/foo/bar/bar432.json?value=ignored");
        httpRequest.headers().add("Host", "testing-host");
        Request request = new Request(httpRequest, null);
        Action action = resolver.resolve(request);
        assertNotNull(action);
        assertEquals(HttpMethod.GET, action.getRoute().getMethod());
        assertEquals("/foo/bar/{barId}", action.getRoute().getPattern());
    }

    @Test
    public void shouldResolveAliasBarGetRoute() {
        FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET,
                "/bar/bar432.json?value=ignored");
        httpRequest.headers().add("Host", "testing-host");
        Request request = new Request(httpRequest, null);
        Action action = resolver.resolve(request);
        assertNotNull(action);
        assertEquals(HttpMethod.GET, action.getRoute().getMethod());
        assertEquals("/foo/bar/{barId}", action.getRoute().getPattern());
    }

    @Test
    public void shouldResolvePostRoute() {
        FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST,
                "/foo.json?value=ignored");
        httpRequest.headers().add("Host", "testing-host");
        Request request = new Request(httpRequest, null);
        Action action = resolver.resolve(request);
        assertNotNull(action);
        assertEquals(HttpMethod.POST, action.getRoute().getMethod());
        assertEquals("/foo", action.getRoute().getPattern());
    }

    @Test
    public void shouldResolveAliasFooPostRoute() {
        FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST,
                "/yada/yada.json?value=ignored");
        httpRequest.headers().add("Host", "testing-host");
        Request request = new Request(httpRequest, null);
        Action action = resolver.resolve(request);
        assertNotNull(action);
        assertEquals(HttpMethod.POST, action.getRoute().getMethod());
        assertEquals("/foo", action.getRoute().getPattern());
    }

    @Test
    public void shouldResolveCrudRouteForGet() {
        FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET,
                "/foo/foo23.json?value=ignored");
        httpRequest.headers().add("Host", "testing-host");
        Request request = new Request(httpRequest, null);
        Action action = resolver.resolve(request);
        assertNotNull(action);
        assertEquals(HttpMethod.GET, action.getRoute().getMethod());
        assertEquals("/foo/{fooId}", action.getRoute().getPattern());
    }

    @Test
    public void shouldResolveAliasCrudRouteForGet() {
        FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET,
                "/blah/foo/foo23.json?value=ignored");
        httpRequest.headers().add("Host", "testing-host");
        Request request = new Request(httpRequest, null);
        Action action = resolver.resolve(request);
        assertNotNull(action);
        assertEquals(HttpMethod.GET, action.getRoute().getMethod());
        assertEquals("/foo/{fooId}", action.getRoute().getPattern());
    }

    @Test
    public void shouldResolveCrudRouteForPut() {
        FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.PUT,
                "/foo/foo23.json?value=ignored");
        httpRequest.headers().add("Host", "testing-host");
        Request request = new Request(httpRequest, null);
        Action action = resolver.resolve(request);
        assertNotNull(action);
        assertEquals(HttpMethod.PUT, action.getRoute().getMethod());
        assertEquals("/foo/{fooId}", action.getRoute().getPattern());
    }

    @Test
    public void shouldResolveAliasCrudRouteForPut() {
        FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.PUT,
                "/blah/foo/foo23.json?value=ignored");
        httpRequest.headers().add("Host", "testing-host");
        Request request = new Request(httpRequest, null);
        Action action = resolver.resolve(request);
        assertNotNull(action);
        assertEquals(HttpMethod.PUT, action.getRoute().getMethod());
        assertEquals("/foo/{fooId}", action.getRoute().getPattern());
    }

    @Test
    public void shouldResolveCrudRouteForPost() {
        FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST,
                "/foo/foo23.json?value=ignored");
        httpRequest.headers().add("Host", "testing-host");
        Request request = new Request(httpRequest, null);
        Action action = resolver.resolve(request);
        assertNotNull(action);
        assertEquals(HttpMethod.POST, action.getRoute().getMethod());
        assertEquals("/foo/{fooId}", action.getRoute().getPattern());
    }

    @Test
    public void shouldResolveAliasCrudRouteForPost() {
        FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST,
                "/blah/foo/foo23.json?value=ignored");
        httpRequest.headers().add("Host", "testing-host");
        Request request = new Request(httpRequest, null);
        Action action = resolver.resolve(request);
        assertNotNull(action);
        assertEquals(HttpMethod.POST, action.getRoute().getMethod());
        assertEquals("/foo/{fooId}", action.getRoute().getPattern());
    }

    @Test
    public void shouldResolveCrudRouteForDelete() {
        FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.DELETE,
                "/foo/foo23.json?value=ignored");
        httpRequest.headers().add("Host", "testing-host");
        Request request = new Request(httpRequest, null);
        Action action = resolver.resolve(request);
        assertNotNull(action);
        assertEquals(HttpMethod.DELETE, action.getRoute().getMethod());
        assertEquals("/foo/{fooId}", action.getRoute().getPattern());
    }

    @Test
    public void shouldResolveAliasCrudRouteForDelete() {
        FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.DELETE,
                "/blah/foo/foo23.json?value=ignored");
        httpRequest.headers().add("Host", "testing-host");
        Request request = new Request(httpRequest, null);
        Action action = resolver.resolve(request);
        assertNotNull(action);
        assertEquals(HttpMethod.DELETE, action.getRoute().getMethod());
        assertEquals("/foo/{fooId}", action.getRoute().getPattern());
    }

    @Test(expected = MethodNotAllowedException.class)
    public void shouldThrowMethodNotAllowed() {
        FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.OPTIONS,
                "/foo/foo23.json?value=ignored");
        httpRequest.headers().add("Host", "testing-host");
        Request request = new Request(httpRequest, null);
        resolver.resolve(request);
    }

    @Test
    public void shouldSendAllowedMethodsForCrudRoute() {
        FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.OPTIONS,
                "/foo/foo23.json?value=ignored");
        httpRequest.headers().add("Host", "testing-host");
        Request request = new Request(httpRequest, null);
        try {
            resolver.resolve(request);
        } catch (MethodNotAllowedException e) {
            List<HttpMethod> allowed = e.getAllowedMethods();
            assertEquals(4, allowed.size());
            assertTrue(allowed.contains(HttpMethod.GET));
            assertTrue(allowed.contains(HttpMethod.PUT));
            assertTrue(allowed.contains(HttpMethod.POST));
            assertTrue(allowed.contains(HttpMethod.DELETE));
        }
    }

    @Test
    public void shouldSendAllowedMethodsForPostRoute() {
        FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.OPTIONS,
                "/foo.json?value=ignored");
        httpRequest.headers().add("Host", "testing-host");
        Request request = new Request(httpRequest, null);
        try {
            resolver.resolve(request);
        } catch (MethodNotAllowedException e) {
            List<HttpMethod> allowed = e.getAllowedMethods();
            assertEquals(1, allowed.size());
            assertTrue(allowed.contains(HttpMethod.POST));
        }
    }

    @Test
    public void shouldSendAllowedMethodsForGetRoute() {
        FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.OPTIONS,
                "/foo/bar/bar23.json?value=ignored");
        httpRequest.headers().add("Host", "testing-host");
        Request request = new Request(httpRequest, null);
        try {
            resolver.resolve(request);
        } catch (MethodNotAllowedException e) {
            List<HttpMethod> allowed = e.getAllowedMethods();
            assertEquals(1, allowed.size());
            assertTrue(allowed.contains(HttpMethod.GET));
        }
    }

    private static class Routes extends RouteDeclaration {
        private InnerService service;
        private RouteDefaults defaults = new RouteDefaults();

        public Routes() {
            super();
            service = new InnerService();
        }

        public void defineRoutes() {
            uri("/foo/bar/{barId}.{format}", service, defaults).alias("/bar/{barId}.{format}")
                    .name("BAR_CRUD_ROUTE").action("readBar", HttpMethod.GET);

            uri("/foo.{format}", service, defaults).alias("/yada/yada.{format}").method(HttpMethod.POST);

            uri("/foo/{fooId}.{format}", service, defaults).alias("/blah/foo/{fooId}.{format}").name("CRUD_ROUTE");
        }
    }

    private static class InnerService {
        @SuppressWarnings("unused")
        public Object create(Request request, Response response) {
            return null;
        }

        @SuppressWarnings("unused")
        public Object read(Request request, Response response) {
            return null;
        }

        @SuppressWarnings("unused")
        public void update(Request request, Response response) {
        }

        @SuppressWarnings("unused")
        public void delete(Request request, Response response) {
        }

        @SuppressWarnings("unused")
        public Object readBar(Request request, Response response) {
            return null;
        }
    }
}