package org.jooby.spec;
import static org.junit.Assert.assertEquals;
import org.jooby.internal.spec.AppCollector;
import org.jooby.internal.spec.RouteCollector;
import org.junit.Test;
import com.github.javaparser.ParseException;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.Node;
public class RouteCollectorTest extends ASTTest {
@Test
public void helloWorld() throws ParseException {
CompilationUnit unit = source("package myapp;",
"import org.jooby.Jooby;",
"public class App extends Jooby {",
" {",
" get(\"/\", () -> \"Hello World!\");",
" }",
"}");
Node app = new AppCollector().accept(unit, ctx());
routes(new RouteCollector().accept(app, ctx()))
.script((m, l) -> {
assertEquals("get(\"/\", () -> \"Hello World!\")", m.toString());
assertEquals("() -> \"Hello World!\"", l.toString());
});
}
@Test
public void useAll() throws ParseException {
CompilationUnit unit = source("package myapp;",
"import org.jooby.Jooby;",
"public class App extends Jooby {",
" {",
" use(\"/\").all(\"/all\", () -> \"Hello World!\");",
" }",
"}");
Node app = new AppCollector().accept(unit, ctx());
routes(new RouteCollector().accept(app, ctx()))
.script((m, l) -> {
assertEquals("use(\"/\").all(\"/all\", () -> \"Hello World!\")", m.toString());
assertEquals("() -> \"Hello World!\"", l.toString());
});
}
@Test
public void useAll2() throws ParseException {
CompilationUnit unit = source("package myapp;",
"import org.jooby.Jooby;",
"public class App extends Jooby {",
" {",
" use(\"/\").get(\"x\", () -> null).all(\"/all\", () -> \"Hello World!\");",
" }",
"}");
Node app = new AppCollector().accept(unit, ctx());
routes(new RouteCollector().accept(app, ctx()))
.script((m, l) -> {
assertEquals("use(\"/\").get(\"x\", () -> null)", m.toString());
assertEquals("() -> null", l.toString());
})
.script((m, l) -> {
assertEquals("use(\"/\").get(\"x\", () -> null).all(\"/all\", () -> \"Hello World!\")", m.toString());
assertEquals("() -> \"Hello World!\"", l.toString());
});
}
@Test
public void importApp() throws ParseException {
CompilationUnit unit = source("package myapp;",
"import org.jooby.Jooby;",
"import apps.BlogApi;",
"public class App extends Jooby {",
" {",
" use(\"/api/blogs\", new BlogApi());",
" }",
"}");
Node app = new AppCollector().accept(unit, ctx());
routes(new RouteCollector().accept(app, ctx()))
.script((m, l) -> {
assertEquals("get(\"/:id\", req -> {\n" +
" int id = req.param(\"id\").intValue();\n" +
" DB db = req.require(DB.class);\n" +
" Blog result = db.find(id);\n" +
" return result;\n" +
"})", m.toString());
assertEquals(" req -> {\n" +
" int id = req.param(\"id\").intValue();\n" +
" DB db = req.require(DB.class);\n" +
" Blog result = db.find(id);\n" +
" return result;\n" +
"}", l.toString());
});
}
@Test
public void apiLike() throws ParseException {
CompilationUnit unit = source("package myapp;",
"import org.jooby.Jooby;",
"public class App extends Jooby {",
" {",
" use(\"/api/pets\")",
" .get(req -> {",
" return \"Aaa\";",
" })",
" .get(\"/:id\", req -> {",
" return \"Bbb\";",
" });",
" }",
"}");
Node app = new AppCollector().accept(unit, ctx());
routes(new RouteCollector().accept(app, ctx()))
.script((m, l) -> {
assertEquals("use(\"/api/pets\").get( req -> {\n" +
" return \"Aaa\";\n" +
"})", m.toString());
assertEquals(" req -> {\n" +
" return \"Aaa\";\n" +
"}", l.toString());
})
.script((m, l) -> {
assertEquals("use(\"/api/pets\").get( req -> {\n" +
" return \"Aaa\";\n" +
"}).get(\"/:id\", req -> {\n" +
" return \"Bbb\";\n" +
"})", m.toString());
assertEquals(" req -> {\n" +
" return \"Bbb\";\n" +
"}", l.toString());
});
}
@Test
public void mixedApp() throws ParseException {
CompilationUnit unit = source("package myapp;",
"import org.jooby.Jooby;",
"import apps.MvcRoutes;",
"public class App extends Jooby {",
" {",
" use(\"/api/pets\")",
" .get(req -> {",
" return \"Aaa\";",
" })",
" .get(\"/:id\", req -> {",
" return \"Bbb\";",
" });",
"",
" use(MvcRoutes.class);",
" post(\"/\", () -> \"Hello World!\");",
" }",
"}");
Node app = new AppCollector().accept(unit, ctx());
routes(new RouteCollector().accept(app, ctx()))
.script((m, l) -> {
assertEquals("use(\"/api/pets\").get( req -> {\n" +
" return \"Aaa\";\n" +
"})", m.toString());
assertEquals(" req -> {\n" +
" return \"Aaa\";\n" +
"}", l.toString());
})
.script((m, l) -> {
assertEquals("use(\"/api/pets\").get( req -> {\n" +
" return \"Aaa\";\n" +
"}).get(\"/:id\", req -> {\n" +
" return \"Bbb\";\n" +
"})", m.toString());
assertEquals(" req -> {\n" +
" return \"Bbb\";\n" +
"}", l.toString());
})
.mvc((m, b) -> {
assertEquals("@Path(\"/:id\")\n" +
"@GET\n" +
"public Pet get(final int id) {\n" +
" return null;\n" +
"}", m.toString());
assertEquals("{\n" +
" return null;\n" +
"}", b.toString());
}).mvc((m, b) -> {
assertEquals("@GET\n" +
"public List<Pet> list(final Optional<Integer> start, final Optional<Integer> max) {\n" +
" return null;\n" +
"}", m.toString());
assertEquals("{\n" +
" return null;\n" +
"}", b.toString());
}).mvc((m, b) -> {
assertEquals("@POST\n" +
"public Pet create(@Body final Pet pet) {\n" +
" return null;\n" +
"}", m.toString());
assertEquals("{\n" +
" return null;\n" +
"}", b.toString());
}).script((m, l) -> {
assertEquals("post(\"/\", () -> \"Hello World!\")", m.toString());
assertEquals("() -> \"Hello World!\"", l.toString());
});
}
@Test
public void multipleScriptRoutes() throws ParseException {
CompilationUnit unit = source("package myapp;",
"import org.jooby.Jooby;",
"public class App extends Jooby {",
" {",
" get(\"/\", () -> \"Hello World!\");",
" use(\"/api/pets\")",
" .get(req -> {",
" return \"Aaa\";",
" })",
" .get(\"/:id\", req -> {",
" return \"Bbb\";",
" });",
" post(\"/\", () -> \"Hello World!\");",
" }",
"}");
Node app = new AppCollector().accept(unit, ctx());
routes(new RouteCollector().accept(app, ctx()))
.script((m, l) -> {
assertEquals("get(\"/\", () -> \"Hello World!\")", m.toString());
assertEquals("() -> \"Hello World!\"", l.toString());
})
.script((m, l) -> {
assertEquals("use(\"/api/pets\").get( req -> {\n" +
" return \"Aaa\";\n" +
"})", m.toString());
assertEquals(" req -> {\n" +
" return \"Aaa\";\n" +
"}", l.toString());
})
.script((m, l) -> {
assertEquals("use(\"/api/pets\").get( req -> {\n" +
" return \"Aaa\";\n" +
"}).get(\"/:id\", req -> {\n" +
" return \"Bbb\";\n" +
"})", m.toString());
assertEquals(" req -> {\n" +
" return \"Bbb\";\n" +
"}", l.toString());
})
.script((m, l) -> {
assertEquals("post(\"/\", () -> \"Hello World!\")", m.toString());
assertEquals("() -> \"Hello World!\"", l.toString());
});
}
}