/* * Copyright 2013- Yan Bonnel * * 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 fr.ybonnel.simpleweb4j; import fr.ybonnel.simpleweb4j.exception.HttpErrorException; import fr.ybonnel.simpleweb4j.handlers.Response; import fr.ybonnel.simpleweb4j.util.SimpleWebTestUtil; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.nio.charset.Charset; import java.util.HashMap; import java.util.Random; import static fr.ybonnel.simpleweb4j.SimpleWeb4j.*; import static org.junit.Assert.*; public class GenericIntegrationTest { public static final String CONTENT_TYPE = "application/json;charset=" + Charset.defaultCharset().displayName(); private Random random = new Random(); private SimpleWebTestUtil testUtil; @Before public void startServer() { resetDefaultValues(); int port = Integer.getInteger("test.http.port", random.nextInt(10000) + 10000); setPort(port); testUtil = new SimpleWebTestUtil(port); jsonp("CALLBACK", "/jsonp", () -> new Response<>("Hello World")); jsonp("CALLBACK", "/jsonp/:name", (param, routeParameters) -> new Response<>("Hello " + routeParameters.getParam("name"))); get("/resource", () -> new Response<>("Hello World")); get("/resource/:name", (param, routeParams) -> { if (routeParams.getParam("name").equals("notfound")) { throw new HttpErrorException(404); } return new Response<>("Hello " + routeParams.getParam("name")); }); post("/resource/:name", (param, routeParams) -> new Response<>("Hello " + routeParams.getParam("name"))); post("/resource", String.class, (param, routeParams) -> new Response<>("Hello " + param)); post("/resource-ss-params", () -> new Response<>("resource-ss-params")); get("/othercode", (param, routeParams) -> new Response<>("I m a teapot", 418)); put("/resource/put", String.class, (param, routeParams) -> new Response<>("Hello " + param)); put("/resource/put/:name", (param, routeParams) -> new Response<>("Hello " + routeParams.getParam("name"))); put("/put-ss-param", () -> new Response<>("put-ss-param")); delete("/resource/delete", () -> new Response<>("deleted")); delete("/resource/deleteparam/:name", (param, routeParams) -> new Response<>("deleted " + routeParams.getParam("name"))); delete("/resource/delete/param", String.class, (param, routeParams) -> new Response<>("deleted " + param)); start(false); } @After public void stopServer() { stop(); } @Test public void should_serve_basic_html_file() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("GET", "/test.html"); assertEquals(200, response.status); assertEquals("just a test", response.body); } @Test public void should_answer_to_simple_get() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("GET", "/resource"); assertEquals(200, response.status); assertEquals(CONTENT_TYPE, response.contentType); assertEquals("\"Hello World\"", response.body); } @Test public void should_answer_to_get_with_param() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("GET", "/resource/myName"); assertEquals(200, response.status); assertEquals(CONTENT_TYPE, response.contentType); assertEquals("\"Hello myName\"", response.body); } @Test public void can_send_http_error() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("GET", "/resource/notfound"); assertEquals(404, response.status); } @Test public void can_post_json() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("POST", "/resource", "\"myName\""); assertEquals(201, response.status); assertEquals(CONTENT_TYPE, response.contentType); assertEquals("\"Hello myName\"", response.body); } @Test public void can_post_with_no_param() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("POST", "/resource-ss-params"); assertEquals(201, response.status); assertEquals(CONTENT_TYPE, response.contentType); assertEquals("\"resource-ss-params\"", response.body); } @Test public void can_post_with_param() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("POST", "/resource/me"); assertEquals(201, response.status); assertEquals(CONTENT_TYPE, response.contentType); assertEquals("\"Hello me\"", response.body); } @Test public void can_answer_specific_http_code() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("GET", "/othercode"); assertEquals(418, response.status); assertEquals(CONTENT_TYPE, response.contentType); assertEquals("\"I m a teapot\"", response.body); } @Test public void can_answer_to_put_method() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("PUT", "/resource/put", "\"myName\""); assertEquals(200, response.status); assertEquals(CONTENT_TYPE, response.contentType); assertEquals("\"Hello myName\"", response.body); } @Test public void can_answer_to_put_method_with_param() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("PUT", "/resource/put/me"); assertEquals(200, response.status); assertEquals(CONTENT_TYPE, response.contentType); assertEquals("\"Hello me\"", response.body); } @Test public void can_answer_to_put_method_with_no_param() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("PUT", "/put-ss-param"); assertEquals(200, response.status); assertEquals(CONTENT_TYPE, response.contentType); assertEquals("\"put-ss-param\"", response.body); } @Test public void can_answer_to_delete_method() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("DELETE", "/resource/delete"); assertEquals(200, response.status); assertEquals(CONTENT_TYPE, response.contentType); assertEquals("\"deleted\"", response.body); } @Test public void can_answer_to_delete_method_with_param_in_path() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("DELETE", "/resource/deleteparam/me"); assertEquals(200, response.status); assertEquals(CONTENT_TYPE, response.contentType); assertEquals("\"deleted me\"", response.body); } @Test public void can_answer_to_delete_method_with_param() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("DELETE", "/resource/delete/param", "\"myName\""); assertEquals(200, response.status); assertEquals(CONTENT_TYPE, response.contentType); assertEquals("\"deleted myName\"", response.body); } @Test public void should_answer_to_simple_get_with_jsonp() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("GET", "/jsonp?CALLBACK=foo"); assertEquals(200, response.status); assertEquals(CONTENT_TYPE, response.contentType); assertEquals("foo(\"Hello World\");", response.body); } @Test public void should_answer_to_simple_get_with_jsonp_and_param() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("GET", "/jsonp/me?CALLBACK=foo"); assertEquals(200, response.status); assertEquals(CONTENT_TYPE, response.contentType); assertEquals("foo(\"Hello me\");", response.body); } @Test public void should_answer_with_gzip_response_when_its_possible() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("GET", "/resource", new HashMap<String, String>() {{ put("Accept-Encoding", "deflate,gzip,sdch"); }}); assertEquals(200, response.status); assertEquals("gzip", response.headers.get("Content-Encoding").get(0)); assertEquals(CONTENT_TYPE, response.contentType); assertEquals("\"Hello World\"", response.body); assertTrue(response.isGzipped); } @Test public void should_not_answer_with_gzip_response_when_its_not_possible() throws Exception { SimpleWebTestUtil.UrlResponse response = testUtil.doMethod("GET", "/resource", new HashMap<String, String>() {{ put("Accept-Encoding", "deflate,sdch"); }}); assertEquals(200, response.status); assertNull(response.headers.get("Content-Encoding")); assertEquals(CONTENT_TYPE, response.contentType); assertEquals("\"Hello World\"", response.body); assertFalse(response.isGzipped); } }