Skip to content

Commit

Permalink
java.util.List contains null if query param doesn't specified fix #1806
Browse files Browse the repository at this point in the history
  • Loading branch information
jknack committed Jun 21, 2020
1 parent 633e098 commit f58e433
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 4 deletions.
17 changes: 17 additions & 0 deletions jooby/src/main/java/io/jooby/internal/MissingValue.java
Expand Up @@ -12,6 +12,7 @@
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

public class MissingValue implements ValueNode {
Expand Down Expand Up @@ -41,6 +42,10 @@ public MissingValue(String name) {
throw new MissingValueException(name);
}

@Nonnull @Override public Map<String, String> toMap() {
return Collections.emptyMap();
}

@Override public Map<String, List<String>> toMultimap() {
return Collections.emptyMap();
}
Expand All @@ -49,10 +54,22 @@ public MissingValue(String name) {
return Collections.emptyList();
}

@Nonnull @Override public Optional<String> toOptional() {
return Optional.empty();
}

@Nonnull @Override public <T> List<T> toList(@Nonnull Class<T> type) {
return Collections.emptyList();
}

@Nonnull @Override public Set<String> toSet() {
return Collections.emptySet();
}

@Nonnull @Override public <T> Set<T> toSet(@Nonnull Class<T> type) {
return Collections.emptySet();
}

@Override public String toString() {
return "<missing>";
}
Expand Down
Expand Up @@ -20,6 +20,7 @@
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

import static org.junit.Assert.assertTrue;

Expand All @@ -46,7 +47,7 @@ public MvcModuleCompilerRunner(Object instance, boolean debug) throws Exception
private String[] sourceNames(Class input) {
List<String> result = new ArrayList<>();
while (input != Object.class) {
result.add(input.getSimpleName() + ".java");
result.add(input.getName());
input = input.getSuperclass();
}
return result.toArray(new String[result.size()]);
Expand Down Expand Up @@ -97,10 +98,14 @@ private MvcModuleCompilerRunner module(boolean debug, SneakyThrows.Consumer<Joob
}

private static List<JavaFileObject> sources(String... names) throws MalformedURLException {
Path basedir = basedir().resolve("src").resolve("test").resolve("java").resolve("source");
Path basedir = basedir().resolve("src").resolve("test").resolve("java");
List<JavaFileObject> sources = new ArrayList<>();
for (String name : names) {
Path path = basedir.resolve(name);
String[] segments = name.split("\\.");
Path path = Stream.of(segments)
.limit(segments.length - 1)
.reduce(basedir, Path::resolve, Path::resolve);
path = path.resolve(segments[segments.length - 1] + ".java");
assertTrue(path.toString(), Files.exists(path));
sources.add(JavaFileObjects.forResource(path.toUri().toURL()));
}
Expand Down
1 change: 0 additions & 1 deletion modules/jooby-apt/src/test/java/tests/Expected1786b.java
@@ -1,6 +1,5 @@
package tests;

import io.jooby.Context;
import io.jooby.Extension;
import io.jooby.MvcFactory;
import io.jooby.exception.MissingValueException;
Expand Down
14 changes: 14 additions & 0 deletions modules/jooby-apt/src/test/java/tests/i1806/C1806.java
@@ -0,0 +1,14 @@
package tests.i1806;

import io.jooby.annotations.GET;
import io.jooby.annotations.QueryParam;

import java.util.List;

public class C1806 {
@GET("/1806/c")
public List<String> sayHi(@QueryParam List<String> names) {
return names;
}

}
22 changes: 22 additions & 0 deletions modules/jooby-apt/src/test/java/tests/i1806/Issue1806.java
@@ -0,0 +1,22 @@
package tests.i1806;

import io.jooby.MockRouter;
import io.jooby.apt.MvcModuleCompilerRunner;
import org.junit.jupiter.api.Test;

import java.util.Collections;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class Issue1806 {

@Test
public void shouldNotGetListWithNullValue() throws Exception {
new MvcModuleCompilerRunner(new C1806())
.debugModule(app -> {
MockRouter router = new MockRouter(app);
assertEquals(Collections.emptyList(), router.get("/1806/c").value());
});
}

}
13 changes: 13 additions & 0 deletions tests/src/test/java/io/jooby/i1806/C1806.java
@@ -0,0 +1,13 @@
package io.jooby.i1806;

import io.jooby.annotations.GET;
import io.jooby.annotations.QueryParam;

import java.util.List;

public class C1806 {
@GET("/1806/c")
public List<String> sayHi(@QueryParam List<String> names) {
return names;
}
}
23 changes: 23 additions & 0 deletions tests/src/test/java/io/jooby/i1806/Issue1806.java
@@ -0,0 +1,23 @@
package io.jooby.i1806;

import io.jooby.junit.ServerTest;
import io.jooby.junit.ServerTestRunner;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class Issue1806 {
@ServerTest
public void shouldNotGetListWithNullValue(ServerTestRunner runner) {
runner.define(app -> {
app.mvc(new C1806());
app.get("/1806/s", ctx -> ctx.query("names").toList(String.class));
}).ready(client -> {
client.get("/1806/s", rsp -> {
assertEquals("[]", rsp.body().string());
});
client.get("/1806/c", rsp -> {
assertEquals("[]", rsp.body().string());
});
});
}
}

0 comments on commit f58e433

Please sign in to comment.