@Test public void readString() { MockServerHttpRequest request = MockServerHttpRequest.post("/") .body(Mono.just(stringBuffer("data:foo\ndata:bar\n\ndata:baz\n\n"))); Flux<String> data = messageReader.read(ResolvableType.forClass(String.class), request, Collections.emptyMap()).cast(String.class); StepVerifier.create(data) .expectNextMatches(elem -> elem.equals("foo\nbar")) .expectNextMatches(elem -> elem.equals("baz")) .expectComplete() .verify(); }
@Test public void readError() { Flux<DataBuffer> body = Flux.just(stringBuffer("data:foo\ndata:bar\n\ndata:baz\n\n")) .concatWith(Flux.error(new RuntimeException())); MockServerHttpRequest request = MockServerHttpRequest.post("/") .body(body); Flux<String> data = messageReader.read(ResolvableType.forClass(String.class), request, Collections.emptyMap()).cast(String.class); StepVerifier.create(data) .expectNextMatches(elem -> elem.equals("foo\nbar")) .expectNextMatches(elem -> elem.equals("baz")) .expectError() .verify(); }
@Test public void defaultFused() { AtomicLong counter = new AtomicLong(2); StepVerifier.create( Flux.range(0, 1000) .index() ) .expectFusion() .expectNext(Tuples.of(0L, 0)) .expectNextMatches(t -> t.getT1() == t.getT2().longValue()) .thenConsumeWhile(t -> t.getT1() == t.getT2().longValue(), it -> counter.incrementAndGet()) .expectComplete() .verify(); assertThat(counter.get()).isEqualTo(1000); }
@Test public void customFusedConditional() { AtomicLong counter = new AtomicLong(2); StepVerifier.create( Flux.range(0, 1000) .index((i, v) -> Tuples.of("#" + (i + 1), v)) .filter(it -> true) ) .expectFusion() .expectNext(Tuples.of("#1", 0)) .expectNextMatches(t -> t.getT1().equals("#" + (t.getT2() + 1))) .thenConsumeWhile(t -> t.getT1().equals("#" + (t.getT2() + 1)), it -> counter.incrementAndGet()) .expectComplete() .verify(); assertThat(counter.get()).isEqualTo(1000); }
@Test public void defaultFusedConditional() { AtomicLong counter = new AtomicLong(2); StepVerifier.create( Flux.range(0, 1000) .index() .filter(it -> true) ) .expectFusion() .expectNext(Tuples.of(0L, 0)) .expectNextMatches(t -> t.getT1() == t.getT2().longValue()) .thenConsumeWhile(t -> t.getT1() == t.getT2().longValue(), it -> counter.incrementAndGet()) .expectComplete() .verify(); assertThat(counter.get()).isEqualTo(1000); }
@Test public void cacheFluxHistoryTTL() { Flux<Tuple2<Long, Integer>> source = Flux.just(1, 2, 3) .delayElements(Duration.ofMillis(1000)) .replay(2, Duration.ofMillis(2000)) .autoConnect() .elapsed(); StepVerifier.create(source) .then(() -> vts.advanceTimeBy(Duration.ofSeconds(3))) .expectNextMatches(t -> t.getT1() == 1000 && t.getT2() == 1) .expectNextMatches(t -> t.getT1() == 1000 && t.getT2() == 2) .expectNextMatches(t -> t.getT1() == 1000 && t.getT2() == 3) .verifyComplete(); StepVerifier.create(source) .then(() -> vts.advanceTimeBy(Duration.ofSeconds(3))) .expectNextMatches(t -> t.getT1() == 0 && t.getT2() == 2) .expectNextMatches(t -> t.getT1() == 0 && t.getT2() == 3) .verifyComplete(); }
@Test public void defaultConditional() { AtomicLong counter = new AtomicLong(2); StepVerifier.create( Flux.range(0, 1000) .hide() .index() .filter(it -> true) ) .expectNoFusionSupport() .expectNext(Tuples.of(0L, 0)) .expectNextMatches(t -> t.getT1() == t.getT2().longValue()) .thenConsumeWhile(t -> t.getT1() == t.getT2().longValue(), it -> counter.incrementAndGet()) .expectComplete() .verify(); assertThat(counter.get()).isEqualTo(1000); }
@Test public void defaultNormal() { AtomicLong counter = new AtomicLong(2); StepVerifier.create( Flux.range(0, 1000) .hide() .index() ) .expectNoFusionSupport() .expectNext(Tuples.of(0L, 0)) .expectNextMatches(t -> t.getT1() == t.getT2().longValue()) .thenConsumeWhile(t -> t.getT1() == t.getT2().longValue(), it -> counter.incrementAndGet()) .expectComplete() .verify(); assertThat(counter.get()).isEqualTo(1000); }
@Test public void customFused() { AtomicLong counter = new AtomicLong(2); StepVerifier.create( Flux.range(0, 1000) .index((i, v) -> Tuples.of("#" + (i + 1), v)) ) .expectFusion() .expectNext(Tuples.of("#1", 0)) .expectNextMatches(t -> t.getT1().equals("#" + (t.getT2() + 1))) .thenConsumeWhile(t -> t.getT1().equals("#" + (t.getT2() + 1)), it -> counter.incrementAndGet()) .expectComplete() .verify(); assertThat(counter.get()).isEqualTo(1000); }
@Test public void customNormal() { AtomicLong counter = new AtomicLong(2); StepVerifier.create( Flux.range(0, 1000) .hide() .index((i, v) -> Tuples.of("#" + (i + 1), v)) ) .expectNoFusionSupport() .expectNext(Tuples.of("#1", 0)) .expectNextMatches(t -> t.getT1().equals("#" + (t.getT2() + 1))) .thenConsumeWhile(t -> t.getT1().equals("#" + (t.getT2() + 1)), it -> counter.incrementAndGet()) .expectComplete() .verify(); assertThat(counter.get()).isEqualTo(1000); }
@Test public void aFluxCanBeBenchmarked(){ StepVerifier.withVirtualTime(this::scenario_aFluxCanBeBenchmarked,0) .thenAwait(Duration.ofSeconds(2)) .thenRequest(1) .expectNextMatches(t -> t.getT1() == 2000 && t.getT2().equals("test")) .verifyComplete(); }
@Test public void aFluxCanBeBenchmarked(){ StepVerifier.withVirtualTime(this::scenario_aFluxCanBeBenchmarked,0) .thenAwait(Duration.ofSeconds(2)) .thenRequest(1) .expectNextMatches(t -> t.getT1() == 2000 && t.getT2().equals("test")) .verifyComplete(); }
@Test public void expectNextMatches() { Flux<String> flux = Flux.just("foo", "bar"); StepVerifier.create(flux) .expectNextMatches("foo"::equals) .expectNextMatches("bar"::equals) .expectComplete() .verify(); }
@Test public void materialize2() { StepVerifier.create(Flux.just("Three", "Two") .concatWith(Flux.error(new RuntimeException("test"))) .materialize()) .expectNextMatches(s -> s.isOnNext() && "Three".equals(s.get())) .expectNextMatches(s -> s.isOnNext() && "Two".equals(s.get())) .expectNextMatches(s -> s.isOnError() && s.getThrowable() != null && "test".equals(s.getThrowable().getMessage())) .verifyComplete(); }
@Test public void materialize() { StepVerifier.create(Flux.just("Three", "Two", "One") .materialize()) .expectNextMatches(s -> s.isOnNext() && "Three".equals(s.get())) .expectNextMatches(s -> s.isOnNext() && "Two".equals(s.get())) .expectNextMatches(s -> s.isOnNext() && "One".equals(s.get())) .expectNextMatches(Signal::isOnComplete) .verifyComplete(); }
@Test public void aMonoCanBeTimestamped(){ StepVerifier.withVirtualTime(this::scenario_aMonoCanBeTimestamped, 0) .thenAwait(Duration.ofSeconds(2)) .thenRequest(1) .expectNextMatches(t -> t.getT1() == 2000 && t.getT2().equals("test")) .verifyComplete(); } }
@Test public void expectInvalidNextMatches() { Flux<String> flux = Flux.just("foo", "bar"); assertThatExceptionOfType(AssertionError.class) .isThrownBy(() -> StepVerifier.create(flux) .expectNextMatches("foo"::equals) .expectNextMatches("baz"::equals) .expectComplete() .verify()) .withMessage("expectation \"expectNextMatches\" failed (predicate failed on value: bar)"); }
@Test(timeout = 1000L) public void expectNextMatchesLowRequestShortcircuits() { StepVerifier.Step<String> validSoFar = StepVerifier.create(Flux.just("foo", "bar"), 1) .expectNext("foo"); assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> validSoFar.expectNextMatches("bar"::equals)) .withMessageStartingWith("The scenario will hang at expectNextMatches due to too little request being performed for the expectations to finish") .withMessageEndingWith("request remaining since last step: 0, expected: 1"); }
@Test public void expectNextCountAfterExpectNextMatches() { StepVerifier.create(Flux.range(1, 5)) .expectNextMatches(i -> true) .expectNextMatches(i -> true) .expectNextCount(3) .verifyComplete(); }
@Test public void aFluxCanBeTimestamped(){ StepVerifier.withVirtualTime(this::scenario_aFluxCanBeTimestamped, 0) .thenAwait(Duration.ofSeconds(2)) .thenRequest(1) .expectNextMatches(t -> t.getT1() == 2000 && t.getT2().equals("test")) .verifyComplete(); } }