org.springframework.test.web.reactive.server.WebTestClientExtensions.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of spring-test Show documentation
Show all versions of spring-test Show documentation
Spring TestContext Framework
/*
* Copyright 2002-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.test.web.reactive.server
import org.reactivestreams.Publisher
import org.springframework.test.util.AssertionErrors.assertEquals
import org.springframework.test.web.reactive.server.WebTestClient.*
/**
* Extension for [RequestBodySpec.body] providing a variant without explicit class
* parameter thanks to Kotlin reified type parameters.
*
* @author Sebastien Deleuze
* @since 5.0
*/
inline fun > RequestBodySpec.body(publisher: S): RequestHeadersSpec<*>
= body(publisher, T::class.java)
/**
* Extension for [ResponseSpec.expectBody] providing an `expectBody()` variant and
* a workaround for [KT-5464](https://youtrack.jetbrains.com/issue/KT-5464) which
* prevents to use `WebTestClient.BodySpec` in Kotlin.
*
* @author Sebastien Deleuze
* @since 5.0
*/
@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
inline fun ResponseSpec.expectBody(): KotlinBodySpec =
expectBody(B::class.java).returnResult().let {
object : KotlinBodySpec {
override fun isEqualTo(expected: B): KotlinBodySpec = it
.assertWithDiagnostics({ assertEquals("Response body", expected, it.responseBody) })
.let { this }
override fun consumeWith(consumer: (EntityExchangeResult) -> Unit): KotlinBodySpec =
it
.assertWithDiagnostics({ consumer.invoke(it) })
.let { this }
override fun returnResult(): EntityExchangeResult = it
}
}
/**
* Kotlin compliant `WebTestClient.BodySpec` for expectations on the response body decoded
* to a single Object, see [KT-5464](https://youtrack.jetbrains.com/issue/KT-5464) for
* more details.
* @since 5.0.6
*/
interface KotlinBodySpec {
/**
* Assert the extracted body is equal to the given value.
*/
fun isEqualTo(expected: B): KotlinBodySpec
/**
* Assert the exchange result with the given consumer.
*/
fun consumeWith(consumer: (EntityExchangeResult) -> Unit): KotlinBodySpec
/**
* Exit the chained API and return an `ExchangeResult` with the
* decoded response content.
*/
fun returnResult(): EntityExchangeResult
}
/**
* Extension for [ResponseSpec.expectBodyList] providing a `expectBodyList()` variant.
*
* @author Sebastien Deleuze
* @since 5.0
*/
inline fun ResponseSpec.expectBodyList(): ListBodySpec =
expectBodyList(E::class.java)
/**
* Extension for [ResponseSpec.returnResult] providing a `returnResult()` variant.
*
* @author Sebastien Deleuze
* @since 5.0
*/
@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
inline fun ResponseSpec.returnResult(): FluxExchangeResult =
returnResult(T::class.java)