private <T> void testWrite(Publisher<T> source, MockServerHttpResponse response, Class<T> clazz) { testWrite(source, MediaType.TEXT_EVENT_STREAM, response, clazz); }
@Test public void writeServerSentEvent() { ServerSentEvent<?> event = ServerSentEvent.builder().data("bar").id("c42").event("foo") .comment("bla\nbla bla\nbla bla bla").retry(Duration.ofMillis(123L)).build(); Mono<ServerSentEvent> source = Mono.just(event); testWrite(source, outputMessage, ServerSentEvent.class); StepVerifier.create(outputMessage.getBody()) .consumeNextWith(stringConsumer("id:c42\nevent:foo\nretry:123\n:bla\n:bla bla\n:bla bla bla\ndata:")) .consumeNextWith(stringConsumer("bar\n")) .consumeNextWith(stringConsumer("\n")) .expectComplete() .verify(); }
@Test public void writeString() { Flux<String> source = Flux.just("foo", "bar"); testWrite(source, outputMessage, String.class); StepVerifier.create(outputMessage.getBody()) .consumeNextWith(stringConsumer("data:")) .consumeNextWith(stringConsumer("foo\n")) .consumeNextWith(stringConsumer("\n")) .consumeNextWith(stringConsumer("data:")) .consumeNextWith(stringConsumer("bar\n")) .consumeNextWith(stringConsumer("\n")) .expectComplete() .verify(); }
@Test public void writeMultiLineString() { Flux<String> source = Flux.just("foo\nbar", "foo\nbaz"); testWrite(source, outputMessage, String.class); StepVerifier.create(outputMessage.getBody()) .consumeNextWith(stringConsumer("data:")) .consumeNextWith(stringConsumer("foo\ndata:bar\n")) .consumeNextWith(stringConsumer("\n")) .consumeNextWith(stringConsumer("data:")) .consumeNextWith(stringConsumer("foo\ndata:baz\n")) .consumeNextWith(stringConsumer("\n")) .expectComplete() .verify(); }
@Test // SPR-16516 public void writeStringWithCustomCharset() { Flux<String> source = Flux.just("\u00A3"); Charset charset = StandardCharsets.ISO_8859_1; MediaType mediaType = new MediaType("text", "event-stream", charset); testWrite(source, mediaType, outputMessage, String.class); assertEquals(mediaType, outputMessage.getHeaders().getContentType()); StepVerifier.create(outputMessage.getBody()) .consumeNextWith(stringConsumer("data:")) .consumeNextWith(dataBuffer -> { String value = DataBufferTestUtils.dumpString(dataBuffer, charset); DataBufferUtils.release(dataBuffer); assertEquals("\u00A3\n", value); }) .consumeNextWith(stringConsumer("\n")) .expectComplete() .verify(); }
@Test public void writePojo() { Flux<Pojo> source = Flux.just(new Pojo("foofoo", "barbar"), new Pojo("foofoofoo", "barbarbar")); testWrite(source, outputMessage, Pojo.class); StepVerifier.create(outputMessage.getBody()) .consumeNextWith(stringConsumer("data:")) .consumeNextWith(stringConsumer("{\"foo\":\"foofoo\",\"bar\":\"barbar\"}")) .consumeNextWith(stringConsumer("\n")) .consumeNextWith(stringConsumer("\n")) .consumeNextWith(stringConsumer("data:")) .consumeNextWith(stringConsumer("{\"foo\":\"foofoofoo\",\"bar\":\"barbarbar\"}")) .consumeNextWith(stringConsumer("\n")) .consumeNextWith(stringConsumer("\n")) .expectComplete() .verify(); }
Charset charset = StandardCharsets.UTF_16LE; MediaType mediaType = new MediaType("text", "event-stream", charset); testWrite(source, mediaType, outputMessage, Pojo.class);
@Test // SPR-14899 public void writePojoWithPrettyPrint() { ObjectMapper mapper = Jackson2ObjectMapperBuilder.json().indentOutput(true).build(); this.messageWriter = new ServerSentEventHttpMessageWriter(new Jackson2JsonEncoder(mapper)); Flux<Pojo> source = Flux.just(new Pojo("foofoo", "barbar"), new Pojo("foofoofoo", "barbarbar")); testWrite(source, outputMessage, Pojo.class); StepVerifier.create(outputMessage.getBody()) .consumeNextWith(stringConsumer("data:")) .consumeNextWith(stringConsumer("{\n" + "data: \"foo\" : \"foofoo\",\n" + "data: \"bar\" : \"barbar\"\n" + "data:}")) .consumeNextWith(stringConsumer("\n")) .consumeNextWith(stringConsumer("\n")) .consumeNextWith(stringConsumer("data:")) .consumeNextWith(stringConsumer("{\n" + "data: \"foo\" : \"foofoofoo\",\n" + "data: \"bar\" : \"barbarbar\"\n" + "data:}")) .consumeNextWith(stringConsumer("\n")) .consumeNextWith(stringConsumer("\n")) .expectComplete() .verify(); }