org.restexpress.RestExpressTest.java Source code

Java tutorial

Introduction

Here is the source code for org.restexpress.RestExpressTest.java

Source

/*
Copyright 2011, 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;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;

import java.io.IOException;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpHead;
import org.apache.http.client.methods.HttpOptions;
import org.apache.http.client.methods.HttpPatch;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.junit.AfterClass;
import org.junit.Test;
import org.restexpress.exception.NoRoutesDefinedException;

import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.codec.http.HttpMethod;

/**
 * @author toddf
 * @since Jan 28, 2011
 */
public class RestExpressTest {
    private static final CloseableHttpClient CLIENT = new DefaultHttpClient();
    private static final String TEST_PATH = "/restexpress/test1";
    private static final int TEST_PORT = 8901;
    private static final String TEST_URL_PATTERN = "http://localhost:%s" + TEST_PATH;

    private static int nextPort = TEST_PORT;

    @AfterClass
    public static void afterTest() throws IOException {
        CLIENT.close();
    }

    @Test
    public void shouldNotUseSystemOut() {
        RestExpress re = new RestExpress();
        re.noSystemOut();
        assertFalse(re.shouldUseSystemOut());
    }

    @Test
    public void shouldCallDefaultMethods() throws ClientProtocolException, IOException {
        int port = nextPort();
        String testUrl = createUrl(TEST_URL_PATTERN, port);
        RestExpress re = new RestExpress();
        NoopController controller = new NoopController();
        re.uri(TEST_PATH, controller);
        re.bind(port);

        waitForStartup();

        HttpGet get = new HttpGet(testUrl);
        try {
            HttpResponse response = (HttpResponse) CLIENT.execute(get);
            assertEquals(200, response.getStatusLine().getStatusCode());
            assertEquals(1, controller.read);
            assertEquals(0, controller.create);
            assertEquals(0, controller.update);
            assertEquals(0, controller.delete);
            assertEquals(0, controller.options);
            assertEquals(0, controller.head);
            assertEquals(0, controller.patch);
        } finally {
            get.releaseConnection();
        }

        HttpPost post = new HttpPost(testUrl);
        try {
            HttpResponse response = (HttpResponse) CLIENT.execute(post);
            assertEquals(201, response.getStatusLine().getStatusCode());
            assertEquals(1, controller.create);
            assertEquals(1, controller.read);
            assertEquals(0, controller.update);
            assertEquals(0, controller.delete);
            assertEquals(0, controller.options);
            assertEquals(0, controller.head);
            assertEquals(0, controller.patch);
        } finally {
            post.releaseConnection();
        }

        HttpPut put = new HttpPut(testUrl);
        try {
            HttpResponse response = (HttpResponse) CLIENT.execute(put);
            assertEquals(200, response.getStatusLine().getStatusCode());
            assertEquals(1, controller.update);
            assertEquals(1, controller.read);
            assertEquals(1, controller.create);
            assertEquals(0, controller.delete);
            assertEquals(0, controller.options);
            assertEquals(0, controller.head);
            assertEquals(0, controller.patch);
        } finally {
            put.releaseConnection();
        }

        HttpDelete delete = new HttpDelete(testUrl);
        try {
            HttpResponse response = (HttpResponse) CLIENT.execute(delete);
            assertEquals(200, response.getStatusLine().getStatusCode());
            assertEquals(1, controller.delete);
            assertEquals(1, controller.read);
            assertEquals(1, controller.create);
            assertEquals(1, controller.update);
            assertEquals(0, controller.options);
            assertEquals(0, controller.head);
            assertEquals(0, controller.patch);
        } finally {
            delete.releaseConnection();
        }

        HttpOptions options = new HttpOptions(testUrl);
        try {
            HttpResponse response = (HttpResponse) CLIENT.execute(options);
            assertEquals(405, response.getStatusLine().getStatusCode());
        } finally {
            options.releaseConnection();
        }

        re.shutdown(true);
    }

    @Test
    public void shouldCallAltMethods() throws ClientProtocolException, IOException {
        int port = nextPort();
        String testUrl = createUrl(TEST_URL_PATTERN, port);
        RestExpress re = new RestExpress();
        NoopController controller = new NoopController();
        re.uri(TEST_PATH, controller).method(HttpMethod.HEAD, HttpMethod.OPTIONS, HttpMethod.PATCH);
        re.bind(port);

        waitForStartup();

        HttpGet get = new HttpGet(testUrl);
        try {
            HttpResponse response = (HttpResponse) CLIENT.execute(get);
            assertEquals(405, response.getStatusLine().getStatusCode());
        } finally {
            get.releaseConnection();
        }

        HttpOptions options = new HttpOptions(testUrl);
        try {
            HttpResponse response = (HttpResponse) CLIENT.execute(options);
            assertEquals(200, response.getStatusLine().getStatusCode());
            assertEquals(0, controller.delete);
            assertEquals(0, controller.read);
            assertEquals(0, controller.create);
            assertEquals(0, controller.update);
            assertEquals(1, controller.options);
            assertEquals(0, controller.head);
            assertEquals(0, controller.patch);
        } finally {
            options.releaseConnection();
        }

        HttpHead head = new HttpHead(testUrl);
        try {
            HttpResponse response = (HttpResponse) CLIENT.execute(head);
            assertEquals(200, response.getStatusLine().getStatusCode());
            assertEquals(0, controller.delete);
            assertEquals(0, controller.read);
            assertEquals(0, controller.create);
            assertEquals(0, controller.update);
            assertEquals(1, controller.options);
            assertEquals(1, controller.head);
            assertEquals(0, controller.patch);
        } finally {
            head.releaseConnection();
        }

        HttpPatch patch = new HttpPatch(testUrl);
        try {
            HttpResponse response = (HttpResponse) CLIENT.execute(patch);
            assertEquals(200, response.getStatusLine().getStatusCode());
            assertEquals(0, controller.delete);
            assertEquals(0, controller.read);
            assertEquals(0, controller.create);
            assertEquals(0, controller.update);
            assertEquals(1, controller.options);
            assertEquals(1, controller.head);
            assertEquals(1, controller.patch);
        } finally {
            patch.releaseConnection();
        }

        re.shutdown(true);
    }

    @Test
    public void shouldCallAltNamedMethods() throws ClientProtocolException, IOException {
        int port = nextPort();
        String testUrl = createUrl(TEST_URL_PATTERN, port);
        RestExpress re = new RestExpress();
        AltController controller = new AltController();
        re.uri(TEST_PATH, controller).action("altHead", HttpMethod.HEAD).action("altOptions", HttpMethod.OPTIONS)
                .action("altPatch", HttpMethod.PATCH);
        re.bind(port);

        waitForStartup();

        HttpGet get = new HttpGet(testUrl);
        try {
            HttpResponse response = (HttpResponse) CLIENT.execute(get);
            assertEquals(405, response.getStatusLine().getStatusCode());
        } finally {
            get.releaseConnection();
        }

        HttpOptions options = new HttpOptions(testUrl);
        try {
            HttpResponse response = (HttpResponse) CLIENT.execute(options);
            assertEquals(200, response.getStatusLine().getStatusCode());
            assertEquals(1, controller.options);
            assertEquals(0, controller.head);
            assertEquals(0, controller.patch);
        } finally {
            options.releaseConnection();
        }

        HttpHead head = new HttpHead(testUrl);
        try {
            HttpResponse response = (HttpResponse) CLIENT.execute(head);
            assertEquals(200, response.getStatusLine().getStatusCode());
            assertEquals(1, controller.options);
            assertEquals(1, controller.head);
            assertEquals(0, controller.patch);
        } finally {
            head.releaseConnection();
        }

        HttpPatch patch = new HttpPatch(testUrl);
        try {
            HttpResponse response = (HttpResponse) CLIENT.execute(patch);
            assertEquals(200, response.getStatusLine().getStatusCode());
            assertEquals(1, controller.options);
            assertEquals(1, controller.head);
            assertEquals(1, controller.patch);
        } finally {
            patch.releaseConnection();
        }

        re.shutdown(true);
    }

    @Test
    public void shouldSetOutputMediaType() throws ClientProtocolException, IOException {
        int port = nextPort();
        String testUrl = createUrl(TEST_URL_PATTERN, port);
        RestExpress re = new RestExpress();
        NoopController controller = new NoopController();
        re.uri(TEST_PATH, controller);
        re.bind(port);

        waitForStartup();

        HttpPost post = new HttpPost(testUrl);
        try {
            post.addHeader(HttpHeaders.Names.ACCEPT, "application/json");
            HttpResponse response = (HttpResponse) CLIENT.execute(post);
            assertEquals(201, response.getStatusLine().getStatusCode());
            assertEquals(ContentType.JSON, controller.outputMediaType);
        } finally {
            post.releaseConnection();
        }

        HttpGet get = new HttpGet(testUrl);
        try {
            get.addHeader(HttpHeaders.Names.ACCEPT, "application/json");
            HttpResponse response = (HttpResponse) CLIENT.execute(get);
            assertEquals(200, response.getStatusLine().getStatusCode());
            assertEquals(ContentType.JSON, controller.outputMediaType);
        } finally {
            get.releaseConnection();
        }

        HttpPut put = new HttpPut(testUrl);
        try {
            put.addHeader(HttpHeaders.Names.ACCEPT, "application/json");
            HttpResponse response = (HttpResponse) CLIENT.execute(put);
            assertEquals(200, response.getStatusLine().getStatusCode());
            assertEquals(ContentType.JSON, controller.outputMediaType);
        } finally {
            put.releaseConnection();
        }

        HttpDelete delete = new HttpDelete(testUrl);
        try {
            delete.addHeader(HttpHeaders.Names.ACCEPT, "application/json");
            HttpResponse response = (HttpResponse) CLIENT.execute(delete);
            assertEquals(200, response.getStatusLine().getStatusCode());
            assertEquals(ContentType.JSON, controller.outputMediaType);
        } finally {
            delete.releaseConnection();
        }

        re.shutdown();
    }

    @Test(expected = NoRoutesDefinedException.class)
    public void shouldThrowNoRoutesDefinedException() {
        RestExpress re = null;

        try {
            re = new RestExpress();
            re.bind(nextPort());
        } finally {
            re.shutdown();
        }
    }

    public class NoopController {
        int create, read, update, delete, options, head, patch = 0;
        String outputMediaType;

        public void create(Request req, Response res) {
            ++create;
            res.setResponseCreated();
            outputMediaType = res.getSerializationSettings().getMediaType();
        }

        public void read(Request req, Response res) {
            ++read;
            outputMediaType = res.getSerializationSettings().getMediaType();
        }

        public void update(Request req, Response res) {
            ++update;
            outputMediaType = res.getSerializationSettings().getMediaType();
        }

        public void delete(Request req, Response res) {
            ++delete;
            outputMediaType = res.getSerializationSettings().getMediaType();
        }

        public void options(Request req, Response res) {
            ++options;
        }

        public void head(Request req, Response res) {
            ++head;
        }

        public void patch(Request req, Response res) {
            ++patch;
        }
    }

    public class AltController {
        int options, head, patch = 0;
        String outputMediaType;

        public void altOptions(Request req, Response res) {
            ++options;
        }

        public void altHead(Request req, Response res) {
            ++head;
        }

        public void altPatch(Request req, Response res) {
            ++patch;
        }
    }

    private synchronized int nextPort() {
        return nextPort++;
    }

    private String createUrl(String testUrl, int port) {
        return String.format(testUrl, port);
    }

    private void waitForStartup() {
        try {
            Thread.sleep(500L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}