package org.jooby.spec;
import static org.junit.Assert.assertEquals;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.SortedSet;
import org.jooby.Upload;
import org.jooby.internal.spec.RouteParamCollector;
import org.junit.Test;
import com.github.javaparser.ParseException;
import com.google.inject.util.Types;
import apps.Letter;
import apps.model.Pet;
public class RouteParamCollectorTest extends ASTTest {
@Test
public void paramCollector() throws ParseException {
params(new RouteParamCollector().accept(expr("req -> {",
"char ch = req.param(\"ch\").charValue();",
"req.param(\"bool\").booleanValue();",
"req.param(\"sh\").shortValue();",
"int id = req.param(\"id\").intValue();",
"req.param(\"l\").longValue();",
"req.param(\"f\").floatValue();",
"req.param(\"d\").doubleValue();",
"req.param(\"v\").value();",
"}"), ctx()))
.next(p -> {
assertEquals("ch", p.name());
assertEquals(char.class, p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("bool", p.name());
assertEquals(boolean.class, p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("sh", p.name());
assertEquals(short.class, p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("id", p.name());
assertEquals(int.class, p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("l", p.name());
assertEquals(long.class, p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("f", p.name());
assertEquals(float.class, p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("d", p.name());
assertEquals(double.class, p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("v", p.name());
assertEquals(String.class, p.type());
assertEquals(null, p.value());
});
}
@Test
public void paramWithDef() throws ParseException {
params(new RouteParamCollector().accept(expr("req -> {",
"req.param(\"bool\").booleanValue(true);",
"req.param(\"str\").value(\"str\");",
"req.param(\"i\").intValue(678);",
"req.param(\"ch\").intValue('c');",
"}"), ctx()))
.next(p -> {
assertEquals("bool", p.name());
assertEquals(boolean.class, p.type());
assertEquals(true, p.value());
})
.next(p -> {
assertEquals("str", p.name());
assertEquals(String.class, p.type());
assertEquals("str", p.value());
})
.next(p -> {
assertEquals("i", p.name());
assertEquals(int.class, p.type());
assertEquals(678, p.value());
})
.next(p -> {
assertEquals("ch", p.name());
assertEquals(int.class, p.type());
assertEquals('c', p.value());
});
};
@Test
public void paramToOptional() throws ParseException {
params(new RouteParamCollector().accept(expr("req -> {",
"req.param(\"opt\").toOptional();",
"req.param(\"iopt\").toOptional(Integer.class);",
"}"), ctx()))
.next(p -> {
assertEquals("opt", p.name());
assertEquals(Types.newParameterizedType(Optional.class, String.class), p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("iopt", p.name());
assertEquals(Types.newParameterizedType(Optional.class, Integer.class), p.type());
assertEquals(null, p.value());
});
};
@Test
public void paramToList() throws ParseException {
params(new RouteParamCollector().accept(expr("req -> {",
"req.param(\"p1\").toList();",
"req.param(\"p2\").toList(Integer.class);",
"req.param(\"p3\").toList(apps.model.Pet.class);",
"}"), ctx()))
.next(p -> {
assertEquals("p1", p.name());
assertEquals(Types.newParameterizedType(List.class, String.class), p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("p2", p.name());
assertEquals(Types.newParameterizedType(List.class, Integer.class), p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("p3", p.name());
assertEquals(Types.newParameterizedType(List.class, Pet.class), p.type());
assertEquals(null, p.value());
});
};
@Test
public void paramToSet() throws ParseException {
params(new RouteParamCollector().accept(expr("req -> {",
"req.param(\"p1\").toSet();",
"req.param(\"p2\").toSet(String.class);",
"req.param(\"p3\").toSet(apps.model.Pet.class);",
"}"), ctx()))
.next(p -> {
assertEquals("p1", p.name());
assertEquals(Types.newParameterizedType(Set.class, String.class), p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("p2", p.name());
assertEquals(Types.newParameterizedType(Set.class, String.class), p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("p3", p.name());
assertEquals(Types.newParameterizedType(Set.class, Pet.class), p.type());
assertEquals(null, p.value());
});
};
@Test
public void paramToSortedSet() throws ParseException {
params(new RouteParamCollector().accept(expr("req -> {",
"req.param(\"p1\").toSortedSet();",
"req.param(\"p2\").toSortedSet(String.class);",
"req.param(\"p3\").toSortedSet(apps.model.Pet.class);",
"}"), ctx()))
.next(p -> {
assertEquals("p1", p.name());
assertEquals(Types.newParameterizedType(SortedSet.class, String.class), p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("p2", p.name());
assertEquals(Types.newParameterizedType(SortedSet.class, String.class), p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("p3", p.name());
assertEquals(Types.newParameterizedType(SortedSet.class, Pet.class), p.type());
assertEquals(null, p.value());
});
};
@Test
public void paramToUpload() throws ParseException {
params(new RouteParamCollector().accept(expr("req -> {",
"req.param(\"p1\").toUpload();",
"req.param(\"p2\").toList(org.jooby.Upload.class);",
"}"), ctx()))
.next(p -> {
assertEquals("p1", p.name());
assertEquals(Upload.class, p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("p2", p.name());
assertEquals(Types.newParameterizedType(List.class, Upload.class), p.type());
assertEquals(null, p.value());
});
};
@Test
public void paramToEnum() throws ParseException {
params(new RouteParamCollector().accept(expr("req -> {",
"req.param(\"p1\").toEnum(apps.Letter.class);",
"req.param(\"p2\").toEnum(apps.Letter.A);",
"}"), ctx()))
.next(p -> {
assertEquals("p1", p.name());
assertEquals(Letter.class, p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("p2", p.name());
assertEquals(Letter.class, p.type());
assertEquals("A", p.value());
});
};
@Test
public void paramTo() throws ParseException {
params(new RouteParamCollector().accept(expr("req -> {",
"req.param(\"p1\").to(String.class);",
"req.param(\"p2\").to(apps.model.Pet.class);",
"}"), ctx()))
.next(p -> {
assertEquals("p1", p.name());
assertEquals(String.class, p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("p2", p.name());
assertEquals(Pet.class, p.type());
assertEquals(null, p.value());
});
};
@Test
public void header() throws ParseException {
params(new RouteParamCollector().accept(expr("req -> {",
"req.header(\"h1\").intValue();",
"}"), ctx()))
.next(p -> {
assertEquals("h1", p.name());
assertEquals(int.class, p.type());
assertEquals(null, p.value());
assertEquals(RouteParamType.HEADER, p.paramType());
});
};
@Test
public void bodyTo() throws ParseException {
params(new RouteParamCollector().accept(expr("req -> {",
"req.body().to(apps.model.Pet.class);",
"req.body().toList(apps.model.Pet.class);",
"}"), ctx()))
.next(p -> {
assertEquals("<body>", p.name());
assertEquals(Pet.class, p.type());
assertEquals(null, p.value());
})
.next(p -> {
assertEquals("<body>", p.name());
assertEquals(Types.newParameterizedType(List.class, Pet.class), p.type());
assertEquals(null, p.value());
});
};
}