package org.jooby; import org.jooby.mvc.Consumes; import org.jooby.mvc.GET; import org.jooby.mvc.Path; import org.jooby.mvc.Produces; import org.jooby.test.ServerFeature; import org.junit.Test; public class ContentNegotiationFeature extends ServerFeature { @Path("/r") public static class Resource { @Path("/any") @GET public Result any() { return Results .when("text/html", () -> Results.html("test").put("this", "body")) .when("*/*", () -> "body"); } @Path("/html") @GET @Produces("text/html") public View html() { return Results.html("test").put("this", "body"); } @Path("/json") @GET @Produces("application/json") @Consumes("application/json") public String json() { return "body"; } } { renderer(BodyConverters.toHtml); renderer(BodyConverters.toJson); get("/any", req -> Results .when("text/html", () -> Results.html("test").put("this", "body")) .when("*/*", () -> "body")); get("/status", req -> Results .when("*", () -> Status.NOT_ACCEPTABLE)); get("/like", req -> Results .when("text/html", () -> Results.html("test").put("this", "body")) .when("application/json", () -> "body")); get("/html", (req, resp) -> resp.send(Results.html("test").put("this", "body"))) .produces(MediaType.html); get("/json", (req, resp) -> resp.send("body")) .produces(MediaType.json) .consumes(MediaType.json); use(Resource.class); } private static final String CHROME_ACCEPT = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"; @Test public void chromeAccept() throws Exception { request() .get("/any") .header("Accept", CHROME_ACCEPT) .expect("<html><body>test: {this=body}</body></html>"); request() .get("/r/any") .header("Accept", CHROME_ACCEPT) .expect("<html><body>test: {this=body}</body></html>"); } @Test public void htmlAccept() throws Exception { request() .get("/any") .header("Accept", "text/html") .expect("<html><body>test: {this=body}</body></html>"); request() .get("/r/any") .header("Accept", "text/html") .expect("<html><body>test: {this=body}</body></html>"); request() .get("/html") .header("Accept", CHROME_ACCEPT) .expect("<html><body>test: {this=body}</body></html>"); request() .get("/r/html") .header("Accept", CHROME_ACCEPT) .expect("<html><body>test: {this=body}</body></html>"); request() .get("/json") .header("Accept", "text/html") .expect(406); request() .get("/r/json") .header("Accept", "text/html") .expect(406); } @Test public void jsonAccept() throws Exception { request() .get("/any") .header("Accept", "application/json") .expect("{\"body\": \"body\"}"); request() .get("/r/any") .header("Accept", "application/json") .expect("{\"body\": \"body\"}"); request() .get("/json") .header("Accept", "application/json") .expect("{\"body\": \"body\"}"); request() .get("/r/json") .header("Accept", "application/json") .expect("{\"body\": \"body\"}"); request() .get("/json") .header("Accept", CHROME_ACCEPT) .expect("{\"body\": \"body\"}"); request() .get("/r/json") .header("Accept", CHROME_ACCEPT) .expect("{\"body\": \"body\"}"); request() .get("/html") .header("Accept", "application/json") .expect(406); request() .get("/r/html") .header("Accept", "application/json") .expect(406); request() .get("/json") .header("Accept", "text/html") .expect(406); request() .get("/r/json") .header("Accept", "text/html") .expect(406); } @Test public void jsonConsume() throws Exception { request() .get("/json") .header("Content-Type", "application/json") .header("Accept", "application/json") .expect("{\"body\": \"body\"}"); request() .get("/r/json") .header("Content-Type", "application/json") .header("Accept", "application/json") .expect("{\"body\": \"body\"}"); request() .get("/json") .header("Content-Type", "application/xml") .header("Accept", "application/json") .expect(415); request() .get("/r/json") .header("Content-Type", "application/xml") .header("Accept", "application/json") .expect(415); } @Test public void fallback() throws Exception { request() .get("/any") .header("Accept", "application/json") .expect("{\"body\": \"body\"}"); } @Test public void like() throws Exception { // request() // .get("/like") // .header("Accept", "application/*+json") // .expect("{\"body\": \"body\"}"); request() .get("/like") .header("Accept", "application/xml") .expect(406); } @Test public void status() throws Exception { request() .get("/status") .header("Content-Type", "application/xml") .expect(406); } }