From 9726b379e103e91ede89a7ebecc6ae407b9a9ad6 Mon Sep 17 00:00:00 2001 From: Sebastien Deleuze Date: Wed, 3 Apr 2019 13:20:31 +0200 Subject: [PATCH] DATACASS-647 - Add non-nullable variant to ReactiveSelectOperation extensions. Original pull request: #158. --- .../core/ReactiveSelectOperationExtensions.kt | 26 ++++- ...ctiveSelectOperationExtensionsUnitTests.kt | 94 ++++++++++++++++++- 2 files changed, 114 insertions(+), 6 deletions(-) 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() {