package org.jooby.spec; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.io.File; import java.io.IOException; import java.lang.reflect.Type; import java.util.List; import java.util.Optional; import org.jooby.internal.spec.Context; import org.jooby.internal.spec.ContextImpl; import org.jooby.internal.spec.SourceResolverImpl; import org.jooby.internal.spec.TypeResolverImpl; import org.junit.Test; import com.google.common.collect.ImmutableMap; public class ParseSpecTest { @Test public void parse() throws IOException, ClassNotFoundException { Context ctx = new ContextImpl(new TypeResolverImpl(getClass().getClassLoader()), new SourceResolverImpl(new File(System.getProperty("user.dir")).toPath())); List<RouteSpec> specs = ctx.parseSpec(new Type() { @Override public String getTypeName() { return "apps.App"; } }).get(); assertNotNull(specs); assertEquals(5, specs.size()); RouteSpec route = specs.get(0); assertEquals("GET", route.method()); assertEquals("/", route.pattern()); assertEquals("Home page.", route.doc().get()); assertEquals(Optional.empty(), route.summary()); assertEquals(0, route.params().size()); assertEquals(java.lang.String.class, route.response().type()); route = specs.get(1); assertEquals("GET", route.method()); assertEquals("/api/pets/:id", route.pattern()); assertEquals("apps.LocalType", route.response().type().getTypeName()); assertEquals("Get a pet by ID.", route.doc().get()); assertEquals("Api summary.", route.summary().get()); assertEquals(ImmutableMap.of(200, "Success", 404, "Not Found"), route.response().statusCodes()); 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("A pet ID.", route.params().get(0).doc().get()); 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("List all pets.", route.doc().get()); assertEquals("Api summary.", route.summary().get()); 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("Start offset. Optional", route.params().get(0).doc().get()); assertEquals(0, route.params().get(0).value()); assertEquals("max", route.params().get(1).name()); assertEquals(RouteParamType.QUERY, route.params().get(1).paramType()); assertEquals("Max number of results. Optional", route.params().get(1).doc().get()); 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("Api summary.", route.summary().get()); 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("Api summary.", route.summary().get()); 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()); } }