package org.jooby;
import static org.junit.Assert.assertEquals;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import org.jooby.mvc.POST;
import org.jooby.mvc.Path;
import org.jooby.test.ServerFeature;
import org.junit.Test;
public class MultipartFormParamFeature extends ServerFeature {
@Path("/r")
public static class Resource {
@Path("/form")
@POST
public String form(final String name, final int age, final Upload myfile) throws IOException {
try (Upload upload = myfile) {
assertEquals(true, myfile.file().exists());
return name + " " + age + " " + upload.name() + " " + myfile.type().name();
} finally {
assertEquals(false, myfile.file().exists());
}
}
@Path("/form/files")
@POST
public String multiplesFiles(final List<Upload> uploads) throws IOException {
StringBuilder buffer = new StringBuilder();
for (Upload upload : uploads) {
try (Upload u = upload) {
assertEquals(true, upload.file().exists());
buffer.append(u.name()).append(" ");
} finally {
assertEquals(false, upload.file().exists());
}
}
return buffer.toString();
}
@Path("/form/optional")
@POST
public String optional(final Optional<Upload> upload) throws IOException {
if (upload.isPresent()) {
try (Upload u = upload.get()) {
return u.name();
}
}
return upload.toString();
}
}
{
post("/form", (req, resp) -> {
String name = req.param("name").value();
int age = req.param("age").intValue();
Upload upload = req.param("myfile").toUpload();
resp.send(name + " " + age + " " + upload.name() + " " + upload.type());
});
post("/form/files", (req, rsp) -> {
List<Upload> uploads = req.files("uploads");
StringBuilder buffer = new StringBuilder();
for (Upload upload : uploads) {
try (Upload u = upload) {
buffer.append(u.name()).append(" ");
}
}
rsp.send(buffer);
});
post("/form/use/file", (req, rsp) -> {
Upload upload = req.file("myfile");
File file = upload.file();
try (Upload u = upload) {
assertEquals("p=1", Files.readAllLines(file.toPath()).stream()
.collect(Collectors.joining("\n"))
);
}
rsp.status(200);
});
post("/file/header", (req, rsp) -> {
Upload upload = req.param("myfile").to(Upload.class);
rsp.send(upload.header("content-type").value());
});
post("/form/optional", (req, rsp) -> {
Optional<Upload> upload = req.param("upload").toOptional(Upload.class);
if (upload.isPresent()) {
try (Upload u = upload.get()) {
rsp.send(u.name());
}
} else {
rsp.send(upload);
}
});
use(Resource.class);
}
@Test
public void multipart() throws Exception {
request()
.post("/form")
.multipart()
.add("name", "edgar")
.add("age", 34)
.file("myfile", "<xml></xml>".getBytes(), "application/xml", "pom.xml")
.expect("edgar 34 pom.xml application/xml");
request()
.post("/r/form")
.multipart()
.add("name", "edgar")
.add("age", 34)
.file("myfile", "<xml></xml>".getBytes(), "application/xml", "pom.xml")
.expect("edgar 34 pom.xml application/xml");
}
@Test
public void multipleFiles() throws Exception {
request()
.post("/form/files")
.multipart()
.file("uploads", "p=1".getBytes(), "application/octet-stream", "application.conf")
.file("uploads", "p=2".getBytes(), "application/octet-stream", "m1.conf")
.expect("application.conf m1.conf ");
request()
.post("/r/form/files")
.multipart()
.file("uploads", "p=1".getBytes(), "application/octet-stream", "application.conf")
.file("uploads", "p=2".getBytes(), "application/octet-stream", "m1.conf")
.expect("application.conf m1.conf ");
}
@Test
public void useFile() throws Exception {
request()
.post("/form/use/file")
.multipart()
.file("myfile", "p=1".getBytes(), "application/octet-stream", "application.conf")
.expect(200)
.empty();
}
@Test
public void fileHeader() throws Exception {
request()
.post("/file/header")
.multipart()
.file("myfile", "{}".getBytes(), "application/json;charset=UTF-8", "f.json")
.expect(200)
.expect("application/json; charset=UTF-8");
}
@Test
public void optionalFile() throws Exception {
request()
.post("/form/optional")
.multipart()
.file("upload", "<xml></xml>".getBytes(), "application/xml", "pom.xml")
.expect(200)
.expect("pom.xml");
request()
.post("/r/form/optional")
.multipart()
.file("upload", "<xml></xml>".getBytes(), "application/xml", "pom.xml")
.expect(200)
.expect("pom.xml");
request()
.post("/form/optional")
.multipart()
.file("upload", "".getBytes(), "application/xml", "pom.xml")
.expect(200)
.expect("pom.xml");
request()
.post("/r/form/optional")
.multipart()
.file("upload", "".getBytes(), "application/xml", "pom.xml")
.expect(200)
.expect("pom.xml");
}
}