package org.jooby.issues;
import static org.junit.Assert.assertEquals;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeUnit;
import org.jooby.MediaType;
import org.jooby.json.Jackson;
import org.jooby.test.SseFeature;
import org.junit.Test;
import com.google.common.collect.ImmutableMap;
import javaslang.control.Try;
public class Issue308 extends SseFeature {
{
use(new Jackson());
sse("/sse", sse -> {
sse.send("d1");
sse.event("d2").name("e2").send();
sse.event("d3").name("e3").id("i3").type("plain").send();
sse.event("d4").name("e4").id("i4").retry(5000L).send();
sse.event("d5").name("e5").id("i5").retry(1, TimeUnit.MINUTES).send().onSuccess(id -> {
assertEquals("i5", id.get());
Try.run(() -> sse.close());
});
}).produces(MediaType.plain);
sse("/sse-json-local", sse -> {
sse.send(ImmutableMap.of("username", "bobby", "text", "Hi everyone."), MediaType.plain);
sse.send(ImmutableMap.of("username", "bobby", "text", "Hi everyone."), "json")
.onSuccess(value -> {
Try.run(() -> sse.close());
});
});
sse("/sse-json-global", sse -> {
sse.send(ImmutableMap.of("username", "bobby", "text", "Hi everyone."))
.onSuccess(value -> {
Try.run(() -> sse.close());
});
}).produces(MediaType.json);
sse("/sse-multiline", sse -> {
sse.send("<html>\n<body>\n\n</body>\n</html>\n")
.onSuccess(value -> {
Try.run(() -> sse.close());
});
}).produces(MediaType.plain);
sse("/sse-bytebuffer", (req, sse) -> {
boolean array = req.param("array").booleanValue(false);
byte[] bytebuffer = "bytebuffer".getBytes(StandardCharsets.UTF_8);
ByteBuffer buffer = array
? ByteBuffer.wrap(bytebuffer)
: ByteBuffer.allocateDirect(bytebuffer.length).put(bytebuffer);
buffer.flip();
sse.send(buffer)
.onSuccess(value -> {
Try.run(() -> sse.close());
});
}).produces(MediaType.plain);
sse("/sse-comment", sse -> {
sse.keepAlive(10, TimeUnit.MILLISECONDS);
sse.event("data").comment("this is a comment").send().onSuccess(value -> {
Try.run(() -> sse.close());
});
}).produces(MediaType.plain);
sse("/sse-last-event-id", sse -> {
sse.send(sse.lastEventId().get()).onSuccess(value -> {
Try.run(() -> sse.close());
});
}).produces(MediaType.plain);
}
@Test
public void sse() throws Exception {
assertEquals("data:d1\n" +
"\n" +
"event:e2\n" +
"data:d2\n" +
"\n" +
"id:i3\n" +
"event:e3\n" +
"data:d3\n" +
"\n" +
"id:i4\n" +
"event:e4\n" +
"retry:5000\n" +
"data:d4\n" +
"\n" +
"id:i5\n" +
"event:e5\n" +
"retry:60000\n" +
"data:d5\n" +
"\n" +
"", sse("/sse", 1));
}
@Test
public void ssejson() throws Exception {
assertEquals("data:{username=bobby, text=Hi everyone.}\n\n" +
"data:{\"username\":\"bobby\",\"text\":\"Hi everyone.\"}\n\n",
sse("/sse-json-local", 1));
assertEquals("data:{\"username\":\"bobby\",\"text\":\"Hi everyone.\"}\n\n",
sse("/sse-json-global", 1));
}
@Test
public void sseml() throws Exception {
assertEquals("data:<html>\n" +
"data:<body>\n" +
"data:</body>\n" +
"data:</html>\n" +
"\n", sse("/sse-multiline", 1));
}
@Test
public void bytebuffer() throws Exception {
assertEquals("data:bytebuffer\n\n", sse("/sse-bytebuffer", 1));
assertEquals("data:bytebuffer\n\n", sse("/sse-bytebuffer?array=true", 1));
}
@Test
public void comments() throws Exception {
assertEquals(":this is a comment\n" +
"data:data\n" +
"\n" +
"", sse("/sse-comment", 1));
}
@Test
public void lastEventId() throws Exception {
assertEquals("data:1\n\n", sse("/sse-last-event-id", 1));
}
}