|
|
@ -37,6 +37,8 @@ import org.springframework.web.bind.annotation.RestController |
|
|
|
import org.springframework.web.client.HttpServerErrorException |
|
|
|
import org.springframework.web.client.HttpServerErrorException |
|
|
|
import org.springframework.web.reactive.config.EnableWebFlux |
|
|
|
import org.springframework.web.reactive.config.EnableWebFlux |
|
|
|
import org.springframework.web.testfixture.http.server.reactive.bootstrap.HttpServer |
|
|
|
import org.springframework.web.testfixture.http.server.reactive.bootstrap.HttpServer |
|
|
|
|
|
|
|
import reactor.core.publisher.Flux |
|
|
|
|
|
|
|
import java.time.Duration |
|
|
|
|
|
|
|
|
|
|
|
class CoroutinesIntegrationTests : AbstractRequestMappingIntegrationTests() { |
|
|
|
class CoroutinesIntegrationTests : AbstractRequestMappingIntegrationTests() { |
|
|
|
|
|
|
|
|
|
|
@ -111,6 +113,25 @@ class CoroutinesIntegrationTests : AbstractRequestMappingIntegrationTests() { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ParameterizedHttpServerTest |
|
|
|
|
|
|
|
fun `Suspending handler method returning ResponseEntity of Flux `(httpServer: HttpServer) { |
|
|
|
|
|
|
|
startServer(httpServer) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val entity = performGet<String>("/entity-flux", HttpHeaders.EMPTY, String::class.java) |
|
|
|
|
|
|
|
assertThat(entity.statusCode).isEqualTo(HttpStatus.OK) |
|
|
|
|
|
|
|
assertThat(entity.body).isEqualTo("01234") |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ParameterizedHttpServerTest |
|
|
|
|
|
|
|
fun `Suspending handler method returning ResponseEntity of Flow`(httpServer: HttpServer) { |
|
|
|
|
|
|
|
startServer(httpServer) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val entity = performGet<String>("/entity-flow", HttpHeaders.EMPTY, String::class.java) |
|
|
|
|
|
|
|
assertThat(entity.statusCode).isEqualTo(HttpStatus.OK) |
|
|
|
|
|
|
|
assertThat(entity.body).isEqualTo("foobar") |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration |
|
|
|
@Configuration |
|
|
|
@EnableWebFlux |
|
|
|
@EnableWebFlux |
|
|
|
@ComponentScan(resourcePattern = "**/CoroutinesIntegrationTests*") |
|
|
|
@ComponentScan(resourcePattern = "**/CoroutinesIntegrationTests*") |
|
|
@ -169,6 +190,25 @@ class CoroutinesIntegrationTests : AbstractRequestMappingIntegrationTests() { |
|
|
|
throw IllegalStateException() |
|
|
|
throw IllegalStateException() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@GetMapping("/entity-flux") |
|
|
|
|
|
|
|
suspend fun entityFlux() : ResponseEntity<Flux<String>> { |
|
|
|
|
|
|
|
val strings = Flux.interval(Duration.ofMillis(100)).take(5) |
|
|
|
|
|
|
|
.map { l -> l.toString() } |
|
|
|
|
|
|
|
delay(1) |
|
|
|
|
|
|
|
return ResponseEntity.ok().body(strings) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@GetMapping("/entity-flow") |
|
|
|
|
|
|
|
suspend fun entityFlow() : ResponseEntity<Flow<String>> { |
|
|
|
|
|
|
|
val strings = flow { |
|
|
|
|
|
|
|
emit("foo") |
|
|
|
|
|
|
|
delay(1) |
|
|
|
|
|
|
|
emit("bar") |
|
|
|
|
|
|
|
delay(1) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return ResponseEntity.ok().body(strings) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|