package com.github.rmannibucau.boon.jaxrs; import org.junit.BeforeClass; import org.junit.Test; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Writer; import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; public class TestBoonJsonMessageBodyWriter { @BeforeClass // 1.8.0 is not handled, merged on master public static void forceJava() { System.setProperty("java.version", "1.7.0_0"); } @Test public void sizeIsMinusOne() { assertThat(new BoonJsonMessageBodyWriter<Object>().getSize(null, null, null, null, null)).isEqualTo(-1); } @Test public void isWritableJson() { assertThat(new BoonJsonMessageBodyWriter<Object>().isWriteable(Object.class, Object.class, new Annotation[0], MediaType.APPLICATION_JSON_TYPE)).isTrue(); } @Test public void isNotWritableInputStream() { assertThat(new BoonJsonMessageBodyWriter<Object>().isWriteable(InputStream.class, InputStream.class, new Annotation[0], MediaType.APPLICATION_XML_TYPE)).isFalse(); assertThat(new BoonJsonMessageBodyWriter<Object>().isWriteable(InputStream.class, InputStream.class, new Annotation[0], MediaType.APPLICATION_JSON_TYPE)).isFalse(); } @Test public void isNotWritableOutputStream() { assertThat(new BoonJsonMessageBodyWriter<Object>().isWriteable(OutputStream.class, OutputStream.class, new Annotation[0], MediaType.APPLICATION_XML_TYPE)).isFalse(); assertThat(new BoonJsonMessageBodyWriter<Object>().isWriteable(OutputStream.class, OutputStream.class, new Annotation[0], MediaType.APPLICATION_JSON_TYPE)).isFalse(); } @Test public void isNotWritableWriter() { assertThat(new BoonJsonMessageBodyWriter<Object>().isWriteable(Writer.class, Writer.class, new Annotation[0], MediaType.APPLICATION_XML_TYPE)).isFalse(); assertThat(new BoonJsonMessageBodyWriter<Object>().isWriteable(Writer.class, Writer.class, new Annotation[0], MediaType.APPLICATION_JSON_TYPE)).isFalse(); } @Test public void isNotWritableStreamingOutput() { assertThat(new BoonJsonMessageBodyWriter<Object>().isWriteable(StreamingOutput.class, StreamingOutput.class, new Annotation[0], MediaType.APPLICATION_XML_TYPE)).isFalse(); assertThat(new BoonJsonMessageBodyWriter<Object>().isWriteable(StreamingOutput.class, StreamingOutput.class, new Annotation[0], MediaType.APPLICATION_JSON_TYPE)).isFalse(); } @Test public void isNotWritableResponse() { assertThat(new BoonJsonMessageBodyWriter<Object>().isWriteable(Response.class, Response.class, new Annotation[0], MediaType.APPLICATION_XML_TYPE)).isFalse(); assertThat(new BoonJsonMessageBodyWriter<Object>().isWriteable(Response.class, Response.class, new Annotation[0], MediaType.APPLICATION_JSON_TYPE)).isFalse(); } @Test public void marshallingPojo() throws IOException { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); new BoonJsonMessageBodyWriter<WritablePojo>().writeTo( new WritablePojo("a", "the name", 25), WritablePojo.class, WritablePojo.class, new Annotation[0], MediaType.APPLICATION_JSON_TYPE, null, baos ); assertThat(new String(baos.toByteArray())).isEqualTo("{\"id\":\"a\",\"name\":\"the name\",\"age\":25}"); } @Test public void marshallingList() throws IOException { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); new BoonJsonMessageBodyWriter<List>().writeTo( new ArrayList<String>(asList("a", "b", "c")), List.class, List.class, new Annotation[0], MediaType.APPLICATION_JSON_TYPE, null, baos ); assertThat(new String(baos.toByteArray())).isEqualTo("[\"a\",\"b\",\"c\"]"); } @Test public void marshallingMap() throws IOException { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); new BoonJsonMessageBodyWriter<Map>().writeTo( new TreeMap<String, String>(new HashMap<String, String>() {{ // inner classes are not well serialized put("id", "a"); put("name", "the name"); put("age", "25"); }}), Map.class, Map.class, new Annotation[0], MediaType.APPLICATION_JSON_TYPE, null, baos ); assertThat(new String(baos.toByteArray())).isEqualTo("{\"age\":\"25\",\"id\":\"a\",\"name\":\"the name\"}"); } public static class WritablePojo { private String id; private String name; private int age; public WritablePojo(final String id, final String name, final int age) { this.id = id; this.name = name; this.age = age; } @Override public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; final WritablePojo that = WritablePojo.class.cast(o); return age == that.age && id.equals(that.id) && name.equals(that.name); } @Override public int hashCode() { int result = id.hashCode(); result = 31 * result + name.hashCode(); result = 31 * result + age; return result; } } }