package org.jooby; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.io.File; import java.io.InputStream; import java.nio.charset.Charset; import java.util.LinkedList; import java.util.Optional; import org.jooby.Cookie.Definition; import org.jooby.Route.After; import org.jooby.Route.Complete; import org.junit.Test; public class ResponseTest { public static class ResponseMock implements Response { @Override public void download(final String filename, final InputStream stream) throws Exception { throw new UnsupportedOperationException(); } @Override public void download(final String filename, final String location) throws Exception { } @Override public Response cookie(final Definition cookie) { throw new UnsupportedOperationException(); } @Override public Response cookie(final Cookie cookie) { throw new UnsupportedOperationException(); } @Override public Response clearCookie(final String name) { throw new UnsupportedOperationException(); } @Override public Mutant header(final String name) { throw new UnsupportedOperationException(); } @Override public Response header(final String name, final Object value) { throw new UnsupportedOperationException(); } @Override public Response header(final String name, final Iterable<Object> values) { throw new UnsupportedOperationException(); } @Override public Charset charset() { throw new UnsupportedOperationException(); } @Override public Response charset(final Charset charset) { throw new UnsupportedOperationException(); } @Override public Response length(final long length) { throw new UnsupportedOperationException(); } @Override public void end() { throw new UnsupportedOperationException(); } @Override public Optional<MediaType> type() { throw new UnsupportedOperationException(); } @Override public Response type(final MediaType type) { throw new UnsupportedOperationException(); } @Override public void send(final Result result) throws Exception { throw new UnsupportedOperationException(); } @Override public void redirect(final Status status, final String location) throws Exception { throw new UnsupportedOperationException(); } @Override public Optional<Status> status() { throw new UnsupportedOperationException(); } @Override public Response status(final Status status) { throw new UnsupportedOperationException(); } @Override public boolean committed() { throw new UnsupportedOperationException(); } @Override public void after(final After handler) { throw new UnsupportedOperationException(); } @Override public void complete(final Complete handler) { throw new UnsupportedOperationException(); } } @Test public void type() { LinkedList<MediaType> types = new LinkedList<>(); new ResponseMock() { @Override public Response type(final MediaType type) { types.add(type); return this; } }.type("json"); assertEquals(MediaType.json, types.getFirst()); } @Test public void sendObject() throws Throwable { Object data = new Object(); LinkedList<Object> dataList = new LinkedList<>(); new ResponseMock() { @Override public void send(final Result result) { assertNotNull(result); assertEquals(Status.OK, result.status().get()); assertEquals(MediaType.json, result.type().get()); dataList.add(result.ifGet().get()); } @Override public Optional<Status> status() { return Optional.of(Status.OK); } @Override public Optional<MediaType> type() { return Optional.of(MediaType.json); } }.send(data); assertEquals(data, dataList.getFirst()); } @Test public void sendBody() throws Throwable { Object data = Results.noContent(); LinkedList<Object> dataList = new LinkedList<>(); new ResponseMock() { @Override public void send(final Result body) throws Exception { assertNotNull(body); dataList.add(body); } @Override public Optional<Status> status() { return Optional.of(Status.OK); } @Override public Optional<MediaType> type() { return Optional.of(MediaType.json); } }.send(data); assertEquals(data, dataList.getFirst()); } @Test public void redirect() throws Throwable { LinkedList<Object> dataList = new LinkedList<>(); new ResponseMock() { @Override public void redirect(final Status status, final String location) throws Exception { assertEquals(Status.FOUND, status); dataList.add(location); } }.redirect("/red"); assertEquals("/red", dataList.getFirst()); } @Test public void statusCode() throws Exception { LinkedList<Object> dataList = new LinkedList<>(); new ResponseMock() { @Override public Response status(final Status status) { dataList.add(status); return this; } }.status(200); assertEquals(Status.OK, dataList.getFirst()); } @Test public void downloadFileWithName() throws Throwable { LinkedList<Object> dataList = new LinkedList<>(); File resource = file("src/test/resources/org/jooby/ResponseTest.js"); new ResponseMock() { @Override public void download(final String filename, final InputStream stream) throws Exception { assertNotNull(stream); stream.close(); dataList.add(filename); } @Override public Response length(final long length) { dataList.add(length); return this; } }.download("alias.js", resource); assertEquals("[20, alias.js]", dataList.toString()); } @Test public void cookieWithNameAndValue() throws Exception { LinkedList<Cookie.Definition> dataList = new LinkedList<>(); new ResponseMock() { @Override public Response cookie(final Cookie.Definition cookie) { dataList.add(cookie); return this; } }.cookie("name", "value"); assertEquals("name", dataList.getFirst().name().get()); assertEquals("value", dataList.getFirst().value().get()); } /** * Attempt to load a file from multiple location. required by unit and integration tests. * * @param location * @return */ private File file(final String location) { for (String candidate : new String[]{location, "jooby/" + location, "../jooby/" + location }) { File file = new File(candidate); if (file.exists()) { return file; } } return file(location); } }