diff --git a/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ReactiveSelectOperationExtensions.kt b/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ReactiveSelectOperationExtensions.kt index 97b1630d6..c0d3a8e02 100644 --- a/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ReactiveSelectOperationExtensions.kt +++ b/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ReactiveSelectOperationExtensions.kt @@ -53,21 +53,39 @@ inline fun ReactiveSelectOperation.SelectWithProjection<*>.asT `as`(T::class.java) /** - * Coroutines variant of [ReactiveSelectOperation.TerminatingSelect.one]. + * Non-nullable Coroutines variant of [ReactiveSelectOperation.TerminatingSelect.one]. * * @author Mark Paluch * @since 2.2 */ -suspend inline fun ReactiveSelectOperation.TerminatingSelect.awaitOne(): T? = +suspend inline fun ReactiveSelectOperation.TerminatingSelect.awaitOne(): T = + one().awaitSingle() + +/** + * Nullable Coroutines variant of [ReactiveSelectOperation.TerminatingSelect.one]. + * + * @author Mark Paluch + * @since 2.2 + */ +suspend inline fun ReactiveSelectOperation.TerminatingSelect.awaitOneOrNull(): T? = one().awaitFirstOrNull() /** - * Coroutines variant of [ReactiveSelectOperation.TerminatingSelect.first]. + * Non-nullable Coroutines variant of [ReactiveSelectOperation.TerminatingSelect.first]. * * @author Mark Paluch * @since 2.2 */ -suspend inline fun ReactiveSelectOperation.TerminatingSelect.awaitFirst(): T? = +suspend inline fun ReactiveSelectOperation.TerminatingSelect.awaitFirst(): T = + first().awaitSingle() + +/** + * Nullable Coroutines variant of [ReactiveSelectOperation.TerminatingSelect.first]. + * + * @author Mark Paluch + * @since 2.2 + */ +suspend inline fun ReactiveSelectOperation.TerminatingSelect.awaitFirstOrNull(): T? = first().awaitFirstOrNull() /** diff --git a/spring-data-cassandra/src/test/kotlin/org/springframework/data/cassandra/core/ReactiveSelectOperationExtensionsUnitTests.kt b/spring-data-cassandra/src/test/kotlin/org/springframework/data/cassandra/core/ReactiveSelectOperationExtensionsUnitTests.kt index 77d3b305f..a63481ae8 100644 --- a/spring-data-cassandra/src/test/kotlin/org/springframework/data/cassandra/core/ReactiveSelectOperationExtensionsUnitTests.kt +++ b/spring-data-cassandra/src/test/kotlin/org/springframework/data/cassandra/core/ReactiveSelectOperationExtensionsUnitTests.kt @@ -65,7 +65,7 @@ class ReactiveSelectOperationExtensionsUnitTests { } @Test // DATACASS-632 - fun terminatingFindAwaitOne() { + fun terminatingFindAwaitOneWithValue() { val find = mockk>() every { find.one() } returns Mono.just("foo") @@ -80,7 +80,52 @@ class ReactiveSelectOperationExtensionsUnitTests { } @Test // DATACASS-632 - fun terminatingFindAwaitFirst() { + fun terminatingFindAwaitOneWithNull() { + + val find = mockk>() + every { find.one() } returns Mono.empty() + + Assertions.assertThatExceptionOfType(NoSuchElementException::class.java).isThrownBy { + runBlocking { find.awaitOne() } + } + + verify { + find.one() + } + } + + @Test // DATACASS-632 + fun terminatingFindAwaitOneOrNullWithValue() { + + val find = mockk>() + every { find.one() } returns Mono.just("foo") + + runBlocking { + Assertions.assertThat(find.awaitOneOrNull()).isEqualTo("foo") + } + + verify { + find.one() + } + } + + @Test // DATACASS-632 + fun terminatingFindAwaitOneOrNullWithNull() { + + val find = mockk>() + every { find.one() } returns Mono.empty() + + runBlocking { + Assertions.assertThat(find.awaitOneOrNull()).isNull() + } + + verify { + find.one() + } + } + + @Test // DATACASS-632 + fun terminatingFindAwaitFirstWithValue() { val find = mockk>() every { find.first() } returns Mono.just("foo") @@ -94,6 +139,51 @@ class ReactiveSelectOperationExtensionsUnitTests { } } + @Test // DATACASS-632 + fun terminatingFindAwaitFirstWithNull() { + + val find = mockk>() + every { find.first() } returns Mono.empty() + + Assertions.assertThatExceptionOfType(NoSuchElementException::class.java).isThrownBy { + runBlocking { find.awaitFirst() } + } + + verify { + find.first() + } + } + + @Test // DATACASS-632 + fun terminatingFindAwaitFirstOrNullWithValue() { + + val find = mockk>() + every { find.first() } returns Mono.just("foo") + + runBlocking { + Assertions.assertThat(find.awaitFirstOrNull()).isEqualTo("foo") + } + + verify { + find.first() + } + } + + @Test // DATACASS-632 + fun terminatingFindAwaitFirstOrNullWithNull() { + + val find = mockk>() + every { find.first() } returns Mono.empty() + + runBlocking { + Assertions.assertThat(find.awaitFirstOrNull()).isNull() + } + + verify { + find.first() + } + } + @Test // DATACASS-632 fun terminatingFindAwaitCount() {