package org.jooby.issues; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; import org.jooby.test.ServerFeature; import org.junit.Test; public class Issue315 extends ServerFeature { { AtomicInteger inc = new AtomicInteger(1); complete("/err", (req, rsp, cause) -> { assertTrue(cause.isPresent()); }); get("/err", () -> { throw new IllegalStateException(); }); err((req, rsp, err) -> { rsp.send("err"); }); get("direct-inc", () -> inc.get()); before("/rsp", (req, rsp) -> { rsp.send("before"); }); StringBuilder buff = new StringBuilder(); get("/direct-buff", () -> buff); before("/buff", (req, rsp) -> { buff.append("a"); }); complete("/buff", (req, rsp, cause) -> { buff.append("b"); }); get("/buff", () -> buff); after("/chain", (req, rsp, result) -> { String v = result.get(); result.set("<" + v + ">"); return result; }); after("/chain", (req, rsp, result) -> { String v = result.get(); result.set("-" + v + "-"); return result; }); get("/chain", () -> "v"); complete("/async", (req, rsp, cause) -> { assertEquals(false, cause.isPresent()); }); ExecutorService executor = Executors.newSingleThreadExecutor(); get("/async", promise(deferred -> { executor.execute(() -> deferred.resolve("async")); })); before((req, rsp) -> { inc.incrementAndGet(); }); after((req, rsp, result) -> { Integer i = result.get(); result.set(i + 2); return result; }); complete((req, rsp, cause) -> { inc.incrementAndGet(); }); get("/inc", () -> inc.get()); } @Test public void shouldInvokeBeforeAfterHandlers() throws Exception { request() .get("/inc") .expect("4"); request() .get("/direct-inc") .expect("3"); } @Test public void shouldGenerateAResponseFromBeforeSend() throws Exception { request() .get("/rsp") .expect("before"); } @Test public void beforeChain() throws Exception { request() .get("/chain") .expect("<-v->"); } @Test public void sendWithAfter() throws Exception { request() .get("/buff") .expect("a"); request() .get("/direct-buff") .expect("ab"); } @Test public void async() throws Exception { request() .get("/async") .expect("async"); } @Test public void afterWithErr() throws Exception { request() .get("/err") .expect("err"); } }