package org.jooby;
import java.util.Optional;
import org.jooby.mvc.Consumes;
import org.jooby.mvc.DELETE;
import org.jooby.mvc.GET;
import org.jooby.mvc.PATCH;
import org.jooby.mvc.POST;
import org.jooby.mvc.PUT;
import org.jooby.mvc.Path;
import org.jooby.mvc.Produces;
import org.jooby.test.ServerFeature;
import org.junit.Test;
public class HandlersFeature extends ServerFeature {
@Path("/r")
public static class Resource {
@Path({"/id", "/id/:id" })
@GET
@Produces("text/plain")
@Consumes("text/plain")
public Object optionalVar(final Request req, final Optional<String> id) {
return id + ";consumes" + req.route().consumes() + ";produces="
+ req.route().produces();
}
@Path({"/p1", "/p2", "/p3" })
@GET
@POST
@PUT
@DELETE
@PATCH
public Object get(final Request req) {
return req.path();
}
}
{
renderer((object, ctx) -> {
if (ctx.accepts("text/plain")) {
ctx.send(object.toString());
}
});
get("/id", "/id/:id", req ->
req.param("id").toOptional(String.class) + ";consumes" + req.route().consumes()
+ ";produces=" + req.route().produces() + ";name=" + req.route().name())
.consumes(MediaType.plain)
.consumes(MediaType.plain.name())
.produces(MediaType.plain)
.produces(MediaType.plain.name())
.name("xId");
/**
* GETs
*/
get("/zp1", "/zp2", () -> require(Request.class).path());
get("/zp1", "/zp2", "zp3", () -> require(Request.class).path());
get("/p1", "/p2", req -> req.path());
get("/p1", "/p2", "/p3", req -> req.path());
get("/rr1", "/rr2", (req, rsp) -> rsp.send(req.path()));
get("/rr1", "/rr2", "/rr3", (req, rsp) -> rsp.send(req.path()));
get("/f1", "/f2", (req, rsp, chain) -> rsp.send(req.path()));
get("/f1", "/f2", "/f3", (req, rsp, chain) -> rsp.send(req.path()));
/**
* POSTs
*/
post("/zp1", "/zp2", () -> require(Request.class).path());
post("/zp1", "/zp2", "zp3", () -> require(Request.class).path());
post("/p1", "/p2", req -> req.path());
post("/p1", "/p2", "/p3", req -> req.path());
post("/rr1", "/rr2", (req, rsp) -> rsp.send(req.path()));
post("/rr1", "/rr2", "/rr3", (req, rsp) -> rsp.send(req.path()));
post("/f1", "/f2", (req, rsp, chain) -> rsp.send(req.path()));
post("/f1", "/f2", "/f3", (req, rsp, chain) -> rsp.send(req.path()));
/**
* PUTs
*/
put("/zp1", "/zp2", () -> require(Request.class).path());
put("/zp1", "/zp2", "zp3", () -> require(Request.class).path());
put("/p1", "/p2", req -> req.path());
put("/p1", "/p2", "/p3", req -> req.path());
put("/rr1", "/rr2", (req, rsp) -> rsp.send(req.path()));
put("/rr1", "/rr2", "/rr3", (req, rsp) -> rsp.send(req.path()));
put("/f1", "/f2", (req, rsp, chain) -> rsp.send(req.path()));
put("/f1", "/f2", "/f3", (req, rsp, chain) -> rsp.send(req.path()));
/**
* PATCHs
*/
patch("/zp1", "/zp2", () -> require(Request.class).path());
patch("/zp1", "/zp2", "zp3", () -> require(Request.class).path());
patch("/p1", "/p2", req -> req.path());
patch("/p1", "/p2", "/p3", req -> req.path());
patch("/rr1", "/rr2", (req, rsp) -> rsp.send(req.path()));
patch("/rr1", "/rr2", "/rr3", (req, rsp) -> rsp.send(req.path()));
patch("/f1", "/f2", (req, rsp, chain) -> rsp.send(req.path()));
patch("/f1", "/f2", "/f3", (req, rsp, chain) -> rsp.send(req.path()));
/**
* DELETEs
*/
delete("/zp1", "/zp2", () -> require(Request.class).path());
delete("/zp1", "/zp2", "zp3", () -> require(Request.class).path());
delete("/p1", "/p2", req -> req.path());
delete("/p1", "/p2", "/p3", req -> req.path());
delete("/rr1", "/rr2", (req, rsp) -> rsp.send(req.path()));
delete("/rr1", "/rr2", "/rr3", (req, rsp) -> rsp.send(req.path()));
delete("/f1", "/f2", (req, rsp, chain) -> rsp.send(req.path()));
delete("/f1", "/f2", "/f3", (req, rsp, chain) -> rsp.send(req.path()));
use(Resource.class);
}
@Test
public void shouldSupportOptionalPathVar() throws Exception {
request()
.get("/id")
.header("Content-Type", "text/plain")
.expect("Optional.empty;consumes[text/plain];produces=[text/plain];name=/xId");
request()
.get("/id/678")
.header("Content-Type", "text/plain")
.expect("Optional[678];consumes[text/plain];produces=[text/plain];name=/xId");
request()
.get("/r/id")
.header("Content-Type", "text/plain")
.expect("Optional.empty;consumes[text/plain];produces=[text/plain]");
request()
.get("/r/id/678")
.header("Content-Type", "text/plain")
.expect("Optional[678];consumes[text/plain];produces=[text/plain]");
}
@Test
public void get() throws Exception {
request()
.get("/p1")
.expect("/p1");
request()
.get("/p2")
.expect("/p2");
request()
.get("/p3")
.expect("/p3");
request()
.get("/zp1")
.expect("/zp1");
request()
.get("/zp2")
.expect("/zp2");
request()
.get("/zp3")
.expect("/zp3");
request()
.get("/rr1")
.expect("/rr1");
request()
.get("/rr2")
.expect("/rr2");
request()
.get("/rr3")
.expect("/rr3");
request()
.get("/r/p1")
.expect("/r/p1");
request()
.get("/r/p2")
.expect("/r/p2");
request()
.get("/r/p3")
.expect("/r/p3");
}
@Test
public void post() throws Exception {
request()
.post("/p1")
.expect("/p1");
request()
.post("/p2")
.expect("/p2");
request()
.post("/p3")
.expect("/p3");
request()
.post("/zp1")
.expect("/zp1");
request()
.post("/zp2")
.expect("/zp2");
request()
.post("/zp3")
.expect("/zp3");
request()
.post("/rr1")
.expect("/rr1");
request()
.post("/rr2")
.expect("/rr2");
request()
.post("/rr3")
.expect("/rr3");
request()
.post("/r/p1")
.expect("/r/p1");
request()
.post("/r/p2")
.expect("/r/p2");
request()
.post("/r/p3")
.expect("/r/p3");
}
@Test
public void put() throws Exception {
request()
.put("/p1")
.expect("/p1");
request()
.put("/p2")
.expect("/p2");
request()
.put("/p3")
.expect("/p3");
request()
.put("/zp1")
.expect("/zp1");
request()
.put("/zp2")
.expect("/zp2");
request()
.put("/zp3")
.expect("/zp3");
request()
.put("/rr1")
.expect("/rr1");
request()
.put("/rr2")
.expect("/rr2");
request()
.put("/rr3")
.expect("/rr3");
request()
.put("/r/p1")
.expect("/r/p1");
request()
.put("/r/p2")
.expect("/r/p2");
request()
.put("/r/p3")
.expect("/r/p3");
}
@Test
public void delete() throws Exception {
request()
.delete("/p1")
.expect("/p1");
request()
.delete("/p2")
.expect("/p2");
request()
.delete("/p3")
.expect("/p3");
request()
.delete("/zp1")
.expect("/zp1");
request()
.delete("/zp2")
.expect("/zp2");
request()
.delete("/zp3")
.expect("/zp3");
request()
.delete("/rr1")
.expect("/rr1");
request()
.delete("/rr2")
.expect("/rr2");
request()
.delete("/rr3")
.expect("/rr3");
request()
.delete("/r/p1")
.expect("/r/p1");
request()
.delete("/r/p2")
.expect("/r/p2");
request()
.delete("/r/p3")
.expect("/r/p3");
}
@Test
public void patch() throws Exception {
request()
.patch("/p1")
.expect("/p1");
request()
.patch("/p2")
.expect("/p2");
request()
.patch("/p3")
.expect("/p3");
request()
.patch("/zp1")
.expect("/zp1");
request()
.patch("/zp2")
.expect("/zp2");
request()
.patch("/zp3")
.expect("/zp3");
request()
.patch("/rr1")
.expect("/rr1");
request()
.patch("/rr2")
.expect("/rr2");
request()
.patch("/rr3")
.expect("/rr3");
request()
.patch("/r/p1")
.expect("/r/p1");
request()
.patch("/r/p2")
.expect("/r/p2");
request()
.patch("/r/p3")
.expect("/r/p3");
}
}