package org.jooby.spec; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; import java.nio.file.Path; import java.util.List; import java.util.Optional; import org.jooby.Jooby; import org.junit.Test; import apps.App; import apps.BodyParam; import apps.DefBool; import apps.DefDouble; import apps.DefInt; import apps.DefStr; import apps.NoArgHandler; import apps.ParamTo; import apps.ParamToCollection; import apps.ParamToOptional; import apps.ReturnNewGenericObjectVar; import apps.ReturnNewObjectInline; import apps.ReturnNewObjectVar; import apps.RouteGroup; public class RouteProcessorTest { private Path basedir = new File(System.getProperty("user.dir")).toPath().resolve("src") .resolve("test").resolve("java"); @Test public void bodyParam() throws Exception { Jooby app = new BodyParam(); RouteProcessor processor = new RouteProcessor(); List<RouteSpec> routes = processor.process(app, basedir); assertEquals(1, routes.size()); RouteSpec route = routes.get(0); assertEquals("POST", route.method()); assertEquals("/create", route.pattern()); assertEquals(1, route.params().size()); assertEquals("<body>", route.params().get(0).name()); assertEquals(RouteParamType.BODY, route.params().get(0).paramType()); assertEquals("apps.LocalType", route.params().get(0).type().getTypeName()); } @Test public void noArgHandler() throws Exception { RouteProcessor processor = new RouteProcessor(); Jooby app = new NoArgHandler(); List<RouteSpec> routes = processor.process(app, basedir); assertEquals(1, routes.size()); RouteSpec route = routes.get(0); assertEquals("GET", route.method()); assertEquals("/", route.pattern()); assertEquals("int", route.response().type().getTypeName()); assertEquals(0, route.params().size()); } @Test public void routeGroup() throws Exception { RouteProcessor processor = new RouteProcessor(); Jooby app = new RouteGroup(); List<RouteSpec> routes = processor.process(app, basedir); assertEquals(1, routes.size()); RouteSpec route = routes.get(0); assertEquals("GET", route.method()); assertEquals("/group", route.pattern()); assertEquals("int", route.response().type().getTypeName()); assertEquals(0, route.params().size()); } @Test public void returnNewObjectInline() throws Exception { RouteProcessor processor = new RouteProcessor(); Jooby app = new ReturnNewObjectInline(); List<RouteSpec> routes = processor.process(app, basedir); assertEquals(1, routes.size()); RouteSpec route = routes.get(0); assertEquals("GET", route.method()); assertEquals("/", route.pattern()); assertEquals("apps.model.Pet", route.response().type().getTypeName()); assertEquals(0, route.params().size()); } @Test public void returnNewObjectVar() throws Exception { RouteProcessor processor = new RouteProcessor(); Jooby app = new ReturnNewObjectVar(); List<RouteSpec> routes = processor.process(app, basedir); assertEquals(1, routes.size()); RouteSpec route = routes.get(0); assertEquals("GET", route.method()); assertEquals("/", route.pattern()); assertEquals("apps.LocalType", route.response().type().getTypeName()); assertEquals(0, route.params().size()); } @Test public void returnNewGenericObjectVar() throws Exception { RouteProcessor processor = new RouteProcessor(); Jooby app = new ReturnNewGenericObjectVar(); List<RouteSpec> routes = processor.process(app, basedir); assertEquals(1, routes.size()); RouteSpec route = routes.get(0); assertEquals("GET", route.method()); assertEquals("/", route.pattern()); assertEquals("java.util.List<apps.LocalType>", route.response().type().getTypeName()); assertEquals(0, route.params().size()); } @Test public void defInt() throws Exception { RouteProcessor processor = new RouteProcessor(); Jooby app = new DefInt(); List<RouteSpec> routes = processor.process(app, basedir); assertEquals(1, routes.size()); RouteSpec route = routes.get(0); assertEquals("GET", route.method()); assertEquals("/", route.pattern()); assertEquals("int", route.response().type().getTypeName()); assertEquals(2, route.params().size()); assertEquals("start", route.params().get(0).name()); assertEquals(RouteParamType.QUERY, route.params().get(0).paramType()); assertEquals("int", route.params().get(0).type().getTypeName()); assertEquals(0, route.params().get(0).value()); assertTrue(route.params().get(0).optional()); assertEquals("max", route.params().get(1).name()); assertEquals(RouteParamType.QUERY, route.params().get(1).paramType()); assertEquals("int", route.params().get(1).type().getTypeName()); assertEquals(200, route.params().get(1).value()); assertTrue(route.params().get(1).optional()); } @Test public void defStr() throws Exception { RouteProcessor processor = new RouteProcessor(); Jooby app = new DefStr(); List<RouteSpec> routes = processor.process(app, basedir); assertEquals(1, routes.size()); RouteSpec route = routes.get(0); assertEquals("GET", route.method()); assertEquals("/", route.pattern()); assertEquals("java.lang.String", route.response().type().getTypeName()); assertEquals(1, route.params().size()); assertEquals("value", route.params().get(0).name()); assertEquals(RouteParamType.QUERY, route.params().get(0).paramType()); assertEquals("java.lang.String", route.params().get(0).type().getTypeName()); assertEquals("value", route.params().get(0).value()); assertTrue(route.params().get(0).optional()); } @Test public void defBool() throws Exception { RouteProcessor processor = new RouteProcessor(); Jooby app = new DefBool(); List<RouteSpec> routes = processor.process(app, basedir); assertEquals(1, routes.size()); RouteSpec route = routes.get(0); assertEquals("GET", route.method()); assertEquals("/", route.pattern()); assertEquals("boolean", route.response().type().getTypeName()); assertEquals(2, route.params().size()); assertEquals("t", route.params().get(0).name()); assertEquals(RouteParamType.QUERY, route.params().get(0).paramType()); assertEquals("boolean", route.params().get(0).type().getTypeName()); assertEquals(true, route.params().get(0).value()); assertTrue(route.params().get(0).optional()); assertEquals("f", route.params().get(1).name()); assertEquals(RouteParamType.QUERY, route.params().get(1).paramType()); assertEquals("boolean", route.params().get(1).type().getTypeName()); assertEquals(false, route.params().get(1).value()); assertTrue(route.params().get(1).optional()); } @Test public void defDouble() throws Exception { RouteProcessor processor = new RouteProcessor(); Jooby app = new DefDouble(); List<RouteSpec> routes = processor.process(app, basedir); assertEquals(1, routes.size()); RouteSpec route = routes.get(0); assertEquals("GET", route.method()); assertEquals("/", route.pattern()); assertEquals("double", route.response().type().getTypeName()); assertEquals(1, route.params().size()); assertEquals("d", route.params().get(0).name()); assertEquals(RouteParamType.QUERY, route.params().get(0).paramType()); assertEquals("double", route.params().get(0).type().getTypeName()); assertEquals(3.7, route.params().get(0).value()); assertTrue(route.params().get(0).optional()); } @Test public void paramToOptional() throws Exception { RouteProcessor processor = new RouteProcessor(); Jooby app = new ParamToOptional(); List<RouteSpec> routes = processor.process(app, basedir); assertEquals(1, routes.size()); RouteSpec route = routes.get(0); assertEquals("GET", route.method()); assertEquals("/SingleGetOptionalParam", route.pattern()); assertEquals("java.lang.String", route.response().type().getTypeName()); assertEquals(Optional.empty(), route.doc()); assertEquals(3, route.params().size()); assertEquals("i", route.params().get(0).name()); assertEquals(RouteParamType.QUERY, route.params().get(0).paramType()); assertEquals("java.util.Optional<java.lang.Integer>", route.params().get(0).type().getTypeName()); assertTrue(route.params().get(0).optional()); assertEquals("s", route.params().get(1).name()); assertEquals(RouteParamType.QUERY, route.params().get(1).paramType()); assertEquals("java.util.Optional<java.lang.String>", route.params().get(1).type().getTypeName()); assertTrue(route.params().get(1).optional()); assertEquals("l", route.params().get(2).name()); assertEquals(RouteParamType.QUERY, route.params().get(2).paramType()); assertEquals("java.util.Optional<apps.LocalType>", route.params().get(2).type().getTypeName()); assertTrue(route.params().get(2).optional()); } @Test public void paramTo() throws Exception { RouteProcessor processor = new RouteProcessor(); Jooby app = new ParamTo(); List<RouteSpec> routes = processor.process(app, basedir); assertEquals(1, routes.size()); RouteSpec route = routes.get(0); assertEquals("GET", route.method()); assertEquals("/SingleGetParam", route.pattern()); assertEquals(Optional.empty(), route.doc()); assertEquals("java.lang.String", route.response().type().getTypeName()); assertEquals(5, route.params().size()); assertEquals("i", route.params().get(0).name()); assertEquals(RouteParamType.QUERY, route.params().get(0).paramType()); assertEquals("java.lang.Integer", route.params().get(0).type().getTypeName()); assertEquals("s", route.params().get(1).name()); assertEquals(RouteParamType.QUERY, route.params().get(1).paramType()); assertEquals("java.lang.String", route.params().get(1).type().getTypeName()); assertEquals("l", route.params().get(2).name()); assertEquals(RouteParamType.QUERY, route.params().get(2).paramType()); assertEquals("apps.LocalType", route.params().get(2).type().getTypeName()); assertEquals("q", route.params().get(3).name()); assertEquals(RouteParamType.QUERY, route.params().get(3).paramType()); assertEquals("java.util.Calendar", route.params().get(3).type().getTypeName()); assertEquals("u", route.params().get(4).name()); assertEquals(RouteParamType.FILE, route.params().get(4).paramType()); assertEquals("org.jooby.Upload", route.params().get(4).type().getTypeName()); } @Test public void paramToCollection() throws Exception { RouteProcessor processor = new RouteProcessor(); Jooby app = new ParamToCollection(); List<RouteSpec> routes = processor.process(app, basedir); assertEquals(1, routes.size()); RouteSpec route = routes.get(0); assertEquals("GET", route.method()); assertEquals("/SingleGetCollectionParam", route.pattern()); assertEquals("java.lang.String", route.response().type().getTypeName()); assertEquals(Optional.empty(), route.doc()); assertEquals(8, route.params().size()); assertEquals("li", route.params().get(0).name()); assertEquals(RouteParamType.QUERY, route.params().get(0).paramType()); assertEquals("java.util.List<java.lang.Integer>", route.params().get(0).type().getTypeName()); assertEquals("ls", route.params().get(1).name()); assertEquals(RouteParamType.QUERY, route.params().get(1).paramType()); assertEquals("java.util.List<java.lang.String>", route.params().get(1).type().getTypeName()); assertEquals("ll", route.params().get(2).name()); assertEquals(RouteParamType.QUERY, route.params().get(2).paramType()); assertEquals("java.util.List<apps.LocalType>", route.params().get(2).type().getTypeName()); assertEquals("si", route.params().get(3).name()); assertEquals(RouteParamType.QUERY, route.params().get(3).paramType()); assertEquals("java.util.Set<java.lang.Integer>", route.params().get(3).type().getTypeName()); assertEquals("ss", route.params().get(4).name()); assertEquals(RouteParamType.QUERY, route.params().get(4).paramType()); assertEquals("java.util.Set<java.lang.String>", route.params().get(4).type().getTypeName()); assertEquals("sl", route.params().get(5).name()); assertEquals(RouteParamType.QUERY, route.params().get(5).paramType()); assertEquals("java.util.Set<apps.LocalType>", route.params().get(5).type().getTypeName()); assertEquals("ssi", route.params().get(6).name()); assertEquals(RouteParamType.QUERY, route.params().get(6).paramType()); assertEquals("java.util.SortedSet<java.lang.Integer>", route.params().get(6).type().getTypeName()); assertEquals("sss", route.params().get(7).name()); assertEquals(RouteParamType.QUERY, route.params().get(7).paramType()); assertEquals("java.util.SortedSet<java.lang.String>", route.params().get(7).type().getTypeName()); } @Test public void app() throws Exception { RouteProcessor processor = new RouteProcessor(); Jooby app = new App(); List<RouteSpec> specs = processor.process(app, basedir); assertEquals(5, specs.size()); RouteSpec route = specs.get(0); assertEquals("GET", route.method()); assertEquals("/", route.pattern()); assertEquals(0, route.params().size()); route = specs.get(1); assertEquals("GET", route.method()); assertEquals("/api/pets/:id", route.pattern()); assertEquals("apps.LocalType", route.response().type().getTypeName()); assertEquals(1, route.params().size()); assertEquals("id", route.params().get(0).name()); assertEquals(RouteParamType.PATH, route.params().get(0).paramType()); assertEquals("int", route.params().get(0).type().getTypeName()); assertEquals(null, route.params().get(0).value()); route = specs.get(2); assertEquals("GET", route.method()); assertEquals("/api/pets", route.pattern()); assertEquals("java.util.List<apps.LocalType>", route.response().type().getTypeName()); assertEquals(2, route.params().size()); assertEquals("start", route.params().get(0).name()); assertEquals(RouteParamType.QUERY, route.params().get(0).paramType()); assertEquals("int", route.params().get(0).type().getTypeName()); assertEquals(0, route.params().get(0).value()); assertEquals("max", route.params().get(1).name()); assertEquals(RouteParamType.QUERY, route.params().get(1).paramType()); assertEquals("int", route.params().get(1).type().getTypeName()); assertEquals(200, route.params().get(1).value()); route = specs.get(3); assertEquals("POST", route.method()); assertEquals("/api/pets", route.pattern()); assertEquals("apps.LocalType", route.response().type().getTypeName()); assertEquals(1, route.params().size()); assertEquals("<body>", route.params().get(0).name()); assertEquals(RouteParamType.BODY, route.params().get(0).paramType()); assertEquals("apps.LocalType", route.params().get(0).type().getTypeName()); route = specs.get(4); assertEquals("DELETE", route.method()); assertEquals("/api/pets/:id", route.pattern()); assertEquals("apps.LocalType", route.response().type().getTypeName()); assertEquals(1, route.params().size()); assertEquals("id", route.params().get(0).name()); assertEquals(RouteParamType.PATH, route.params().get(0).paramType()); assertEquals("int", route.params().get(0).type().getTypeName()); assertEquals(null, route.params().get(0).value()); } }