package restx.server.simple; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.kevinsawicki.http.HttpRequest; import com.google.common.base.Optional; import com.google.common.collect.ImmutableMap; import org.assertj.core.util.Files; import org.junit.Test; import restx.*; import restx.entity.MatchedEntityOutputRoute; import restx.entity.MatchedEntityRoute; import restx.http.HttpStatus; import restx.server.WebServers; import restx.server.simple.simple.SimpleWebServer; import java.io.File; import java.io.IOException; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; /** * Date: 27/11/13 * Time: 21:24 */ public class SimpleWebServerTest { private static final ObjectMapper mapper = new ObjectMapper(); @Test @SuppressWarnings("unchecked") public void should_handle_simple_routes() throws Exception { SimpleWebServer server = SimpleWebServer.builder().setRouter(StdRestxMainRouter.builder() .addRouter(RestxRouter.builder() .withMapper(mapper) .GET("/route1/{id}", Map.class, new MatchedEntityOutputRoute() { @Override public Optional route(RestxRequest restxRequest, RestxRequestMatch match) { return Optional.of(ImmutableMap.of("id", match.getPathParam("id"))); } }) .PUT("/route4", Map.class, Map.class, new MatchedEntityRoute<Map, Map>() { @Override public Optional<Map> route(RestxRequest restxRequest, RestxRequestMatch match, Map input) throws IOException { input.put("size", input.size()); return Optional.of(input); } }) .build()) .build()) .setRouterPath("/api").setPort(WebServers.findAvailablePort()).build(); server.start(); try { HttpRequest httpRequest = HttpRequest.get(server.baseUrl() + "/api/route1/xavier"); assertThat(httpRequest.code()).isEqualTo(200); assertThat(httpRequest.body().trim()).isEqualTo("{\"id\":\"xavier\"}"); httpRequest = HttpRequest.put(server.baseUrl() + "/api/route4").send("{\"test\":\"val1\"}"); assertThat(httpRequest.code()).isEqualTo(200); assertThat(httpRequest.body().trim()).isEqualTo("{\"test\":\"val1\",\"size\":1}"); } finally { server.stop(); } } @Test public void should_handle_fs_route() throws Exception { SimpleWebServer server = SimpleWebServer.builder().setRouter(StdRestxMainRouter.builder() .addRouter(FSRouter.mount("src/test/resources").readonly().on("/test")) .build()) .setRouterPath("/api").setPort(WebServers.findAvailablePort()).build(); server.start(); try { HttpRequest httpRequest = HttpRequest.get(server.baseUrl() + "/api/test/test.txt"); assertThat(httpRequest.code()).isEqualTo(200); assertThat(httpRequest.contentType()).isEqualTo("text/plain; charset=UTF-8"); assertThat(httpRequest.body().trim()).isEqualTo("hello"); httpRequest = HttpRequest.put(server.baseUrl() + "/api/test/test.txt").send("bonjour"); assertThat(httpRequest.code()).isEqualTo(HttpStatus.NOT_FOUND.getCode()); } finally { server.stop(); } } @Test public void should_handle_fs_route_dir_listing() throws Exception { SimpleWebServer server = SimpleWebServer.builder().setRouter(StdRestxMainRouter.builder() .addRouter(FSRouter.mount("src/test/resources") .allowDirectoryListing().readonly().on("/test")) .build()) .setRouterPath("/api").setPort(WebServers.findAvailablePort()).build(); server.start(); try { HttpRequest httpRequest = HttpRequest.get(server.baseUrl() + "/api/test/"); assertThat(httpRequest.code()).isEqualTo(200); assertThat(httpRequest.body().trim()).isEqualTo("[\n" + "\"test.txt\"\n" + "]"); } finally { server.stop(); } } @Test public void should_handle_fs_route_write_file() throws Exception { if ("true".equals(System.getenv("DRONE"))) { // writing to FS causes problem on drone return; } File tmp = Files.newTemporaryFolder(); SimpleWebServer server = SimpleWebServer.builder().setRouter(StdRestxMainRouter.builder() .addRouter(FSRouter.mount(tmp.getPath()) .allowDirectoryListing().on("/test")) .build()) .setRouterPath("/api").setPort(WebServers.findAvailablePort()).build(); server.start(); try { HttpRequest httpRequest = HttpRequest.get(server.baseUrl() + "/api/test/"); assertThat(httpRequest.code()).isEqualTo(200); assertThat(httpRequest.body().trim()).isEqualTo("[\n]"); httpRequest = HttpRequest.put(server.baseUrl() + "/api/test/test.txt").send("bonjour"); assertThat(httpRequest.code()).isEqualTo(HttpStatus.CREATED.getCode()); httpRequest = HttpRequest.get(server.baseUrl() + "/api/test/test.txt"); assertThat(httpRequest.code()).isEqualTo(200); assertThat(httpRequest.body().trim()).isEqualTo("bonjour"); httpRequest = HttpRequest.get(server.baseUrl() + "/api/test/"); assertThat(httpRequest.code()).isEqualTo(200); assertThat(httpRequest.body().trim()).isEqualTo("[\n" + "\"test.txt\"\n" + "]"); httpRequest = HttpRequest.put(server.baseUrl() + "/api/test/test.txt").send("hello"); assertThat(httpRequest.code()).isEqualTo(HttpStatus.ACCEPTED.getCode()); httpRequest = HttpRequest.get(server.baseUrl() + "/api/test/test.txt"); assertThat(httpRequest.code()).isEqualTo(200); assertThat(httpRequest.body().trim()).isEqualTo("hello"); httpRequest = HttpRequest.put(server.baseUrl() + "/api/test/test2.txt").send("bonjour"); assertThat(httpRequest.code()).isEqualTo(HttpStatus.CREATED.getCode()); httpRequest = HttpRequest.get(server.baseUrl() + "/api/test/"); assertThat(httpRequest.code()).isEqualTo(200); assertThat(httpRequest.body().trim()).isIn("[\n" + "\"test.txt\",\n" + "\"test2.txt\"\n" + "]", "[\n" + "\"test2.txt\",\n" + "\"test.txt\"\n" + "]"); httpRequest = HttpRequest.delete(server.baseUrl() + "/api/test/test.txt"); assertThat(httpRequest.code()).isEqualTo(HttpStatus.NO_CONTENT.getCode()); httpRequest = HttpRequest.delete(server.baseUrl() + "/api/test/test2.txt"); assertThat(httpRequest.code()).isEqualTo(HttpStatus.NO_CONTENT.getCode()); httpRequest = HttpRequest.get(server.baseUrl() + "/api/test/"); assertThat(httpRequest.code()).isEqualTo(200); assertThat(httpRequest.body().trim()).isEqualTo("[\n]"); httpRequest = HttpRequest.put(server.baseUrl() + "/api/test/dir/").send("[]"); assertThat(httpRequest.code()).isEqualTo(HttpStatus.CREATED.getCode()); httpRequest = HttpRequest.get(server.baseUrl() + "/api/test/"); assertThat(httpRequest.code()).isEqualTo(200); assertThat(httpRequest.body().trim()).isEqualTo("[\n" + "\"dir/\"\n" + "]"); httpRequest = HttpRequest.get(server.baseUrl() + "/api/test/dir/"); assertThat(httpRequest.code()).isEqualTo(200); assertThat(httpRequest.body().trim()).isEqualTo("[\n]"); httpRequest = HttpRequest.delete(server.baseUrl() + "/api/test/dir/"); assertThat(httpRequest.code()).isEqualTo(HttpStatus.NO_CONTENT.getCode()); httpRequest = HttpRequest.get(server.baseUrl() + "/api/test/"); assertThat(httpRequest.code()).isEqualTo(200); assertThat(httpRequest.body().trim()).isEqualTo("[\n]"); httpRequest = HttpRequest.put(server.baseUrl() + "/api/test/dir/test.txt").send("bonjour"); assertThat(httpRequest.code()).isEqualTo(HttpStatus.CREATED.getCode()); httpRequest = HttpRequest.get(server.baseUrl() + "/api/test/dir/test.txt"); assertThat(httpRequest.code()).isEqualTo(200); assertThat(httpRequest.body().trim()).isEqualTo("bonjour"); } finally { server.stop(); } } }