Skip to content

Commit 84ead72

Browse files
sdeleuzemp911de
authored andcommitted
DATAMONGO-2247 - Add non-nullable variants to Coroutines extensions.
Original pull request: #735.
1 parent 10128d4 commit 84ead72

File tree

4 files changed

+229
-13
lines changed

4 files changed

+229
-13
lines changed

spring-data-mongodb/src/main/kotlin/org/springframework/data/mongodb/core/ReactiveFindOperationExtensions.kt

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,21 +77,39 @@ inline fun <reified T : Any> ReactiveFindOperation.DistinctWithProjection.asType
7777
`as`(T::class.java)
7878

7979
/**
80-
* Coroutines variant of [ReactiveFindOperation.TerminatingFind.one].
80+
* Non-nullable Coroutines variant of [ReactiveFindOperation.TerminatingFind.one].
8181
*
8282
* @author Sebastien Deleuze
8383
* @since 2.2
8484
*/
85-
suspend inline fun <reified T : Any> ReactiveFindOperation.TerminatingFind<T>.awaitOne(): T? =
85+
suspend inline fun <reified T : Any> ReactiveFindOperation.TerminatingFind<T>.awaitOne(): T =
86+
one().awaitSingle()
87+
88+
/**
89+
* Nullable Coroutines variant of [ReactiveFindOperation.TerminatingFind.one].
90+
*
91+
* @author Sebastien Deleuze
92+
* @since 2.2
93+
*/
94+
suspend inline fun <reified T : Any> ReactiveFindOperation.TerminatingFind<T>.awaitOneOrNull(): T? =
8695
one().awaitFirstOrNull()
8796

8897
/**
89-
* Coroutines variant of [ReactiveFindOperation.TerminatingFind.first].
98+
* Non-nullable Coroutines variant of [ReactiveFindOperation.TerminatingFind.first].
99+
*
100+
* @author Sebastien Deleuze
101+
* @since 2.2
102+
*/
103+
suspend inline fun <reified T : Any> ReactiveFindOperation.TerminatingFind<T>.awaitFirst(): T =
104+
first().awaitSingle()
105+
106+
/**
107+
* Nullable Coroutines variant of [ReactiveFindOperation.TerminatingFind.first].
90108
*
91109
* @author Sebastien Deleuze
92110
* @since 2.2
93111
*/
94-
suspend inline fun <reified T : Any> ReactiveFindOperation.TerminatingFind<T>.awaitFirst(): T? =
112+
suspend inline fun <reified T : Any> ReactiveFindOperation.TerminatingFind<T>.awaitFirstOrNull(): T? =
95113
first().awaitFirstOrNull()
96114

97115
/**

spring-data-mongodb/src/main/kotlin/org/springframework/data/mongodb/core/ReactiveUpdateOperationExtensions.kt

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,22 +40,39 @@ inline fun <reified T : Any> ReactiveUpdateOperation.update(): ReactiveUpdateOpe
4040
update(T::class.java)
4141

4242
/**
43-
* Coroutines variant of [ReactiveUpdateOperation.TerminatingFindAndModify.findModifyAndAwait].
43+
* Non-nullable Coroutines variant of [ReactiveUpdateOperation.TerminatingFindAndModify.findModifyAndAwait].
4444
*
4545
* @author Sebastien Deleuze
4646
* @since 2.2
4747
*/
48-
suspend fun <T : Any> ReactiveUpdateOperation.TerminatingFindAndModify<T>.findModifyAndAwait(): T? =
48+
suspend fun <T : Any> ReactiveUpdateOperation.TerminatingFindAndModify<T>.findModifyAndAwait(): T =
49+
findAndModify().awaitSingle()
50+
51+
/**
52+
* Nullable Coroutines variant of [ReactiveUpdateOperation.TerminatingFindAndModify.findModifyAndAwait].
53+
*
54+
* @author Sebastien Deleuze
55+
* @since 2.2
56+
*/
57+
suspend fun <T : Any> ReactiveUpdateOperation.TerminatingFindAndModify<T>.findModifyAndAwaitOrNull(): T? =
4958
findAndModify().awaitFirstOrNull()
5059

60+
/**
61+
* Non-nullable Coroutines variant of [ReactiveUpdateOperation.TerminatingFindAndReplace.findAndReplace].
62+
*
63+
* @author Sebastien Deleuze
64+
* @since 2.2
65+
*/
66+
suspend fun <T : Any> ReactiveUpdateOperation.TerminatingFindAndReplace<T>.findReplaceAndAwait(): T =
67+
findAndReplace().awaitSingle()
5168

5269
/**
53-
* Coroutines variant of [ReactiveUpdateOperation.TerminatingFindAndReplace.findAndReplace].
70+
* Nullable Coroutines variant of [ReactiveUpdateOperation.TerminatingFindAndReplace.findAndReplace].
5471
*
5572
* @author Sebastien Deleuze
5673
* @since 2.2
5774
*/
58-
suspend fun <T : Any> ReactiveUpdateOperation.TerminatingFindAndReplace<T>.findReplaceAndAwait(): T? =
75+
suspend fun <T : Any> ReactiveUpdateOperation.TerminatingFindAndReplace<T>.findReplaceAndAwaitOrNull(): T? =
5976
findAndReplace().awaitFirstOrNull()
6077

6178
/**

spring-data-mongodb/src/test/kotlin/org/springframework/data/mongodb/core/ReactiveFindOperationExtensionsTests.kt

Lines changed: 93 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import io.mockk.mockk
2121
import io.mockk.verify
2222
import kotlinx.coroutines.runBlocking
2323
import org.assertj.core.api.Assertions.assertThat
24-
import org.junit.Assert.assertEquals
24+
import org.assertj.core.api.Assertions.assertThatExceptionOfType
2525
import org.junit.Test
2626
import reactor.core.publisher.Mono
2727

@@ -80,7 +80,7 @@ class ReactiveFindOperationExtensionsTests {
8080
}
8181

8282
@Test // DATAMONGO-2209
83-
fun terminatingFindAwaitOne() {
83+
fun terminatingFindAwaitOneWithValue() {
8484

8585
val find = mockk<ReactiveFindOperation.TerminatingFind<String>>()
8686
every { find.one() } returns Mono.just("foo")
@@ -95,7 +95,52 @@ class ReactiveFindOperationExtensionsTests {
9595
}
9696

9797
@Test // DATAMONGO-2209
98-
fun terminatingFindAwaitFirst() {
98+
fun terminatingFindAwaitOneWithNull() {
99+
100+
val find = mockk<ReactiveFindOperation.TerminatingFind<String>>()
101+
every { find.one() } returns Mono.empty()
102+
103+
assertThatExceptionOfType(NoSuchElementException::class.java).isThrownBy {
104+
runBlocking { find.awaitOne() }
105+
}
106+
107+
verify {
108+
find.one()
109+
}
110+
}
111+
112+
@Test // DATAMONGO-2209
113+
fun terminatingFindAwaitOneOrNullWithValue() {
114+
115+
val find = mockk<ReactiveFindOperation.TerminatingFind<String>>()
116+
every { find.one() } returns Mono.just("foo")
117+
118+
runBlocking {
119+
assertThat(find.awaitOneOrNull()).isEqualTo("foo")
120+
}
121+
122+
verify {
123+
find.one()
124+
}
125+
}
126+
127+
@Test // DATAMONGO-2209
128+
fun terminatingFindAwaitOneOrNullWithNull() {
129+
130+
val find = mockk<ReactiveFindOperation.TerminatingFind<String>>()
131+
every { find.one() } returns Mono.empty()
132+
133+
runBlocking {
134+
assertThat(find.awaitOneOrNull()).isNull()
135+
}
136+
137+
verify {
138+
find.one()
139+
}
140+
}
141+
142+
@Test // DATAMONGO-2209
143+
fun terminatingFindAwaitFirstWithValue() {
99144

100145
val find = mockk<ReactiveFindOperation.TerminatingFind<String>>()
101146
every { find.first() } returns Mono.just("foo")
@@ -109,6 +154,51 @@ class ReactiveFindOperationExtensionsTests {
109154
}
110155
}
111156

157+
@Test // DATAMONGO-2209
158+
fun terminatingFindAwaitFirstWithNull() {
159+
160+
val find = mockk<ReactiveFindOperation.TerminatingFind<String>>()
161+
every { find.first() } returns Mono.empty()
162+
163+
assertThatExceptionOfType(NoSuchElementException::class.java).isThrownBy {
164+
runBlocking { find.awaitFirst() }
165+
}
166+
167+
verify {
168+
find.first()
169+
}
170+
}
171+
172+
@Test // DATAMONGO-2209
173+
fun terminatingFindAwaitFirstOrNullWithValue() {
174+
175+
val find = mockk<ReactiveFindOperation.TerminatingFind<String>>()
176+
every { find.first() } returns Mono.just("foo")
177+
178+
runBlocking {
179+
assertThat(find.awaitFirstOrNull()).isEqualTo("foo")
180+
}
181+
182+
verify {
183+
find.first()
184+
}
185+
}
186+
187+
@Test // DATAMONGO-2209
188+
fun terminatingFindAwaitFirstOrNullWithNull() {
189+
190+
val find = mockk<ReactiveFindOperation.TerminatingFind<String>>()
191+
every { find.first() } returns Mono.empty()
192+
193+
runBlocking {
194+
assertThat(find.awaitFirstOrNull()).isNull()
195+
}
196+
197+
verify {
198+
find.first()
199+
}
200+
}
201+
112202
@Test // DATAMONGO-2209
113203
fun terminatingFindAwaitCount() {
114204

spring-data-mongodb/src/test/kotlin/org/springframework/data/mongodb/core/ReactiveUpdateOperationExtensionsTests.kt

Lines changed: 93 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import io.mockk.mockk
2222
import io.mockk.verify
2323
import kotlinx.coroutines.runBlocking
2424
import org.assertj.core.api.Assertions.assertThat
25+
import org.assertj.core.api.Assertions.assertThatExceptionOfType
2526
import org.junit.Test
2627
import reactor.core.publisher.Mono
2728

@@ -50,7 +51,7 @@ class ReactiveUpdateOperationExtensionsTests {
5051
}
5152

5253
@Test // DATAMONGO-2209
53-
fun findModifyAndAwait() {
54+
fun findModifyAndAwaitWithValue() {
5455

5556
val find = mockk<ReactiveUpdateOperation.TerminatingFindAndModify<String>>()
5657
every { find.findAndModify() } returns Mono.just("foo")
@@ -65,7 +66,52 @@ class ReactiveUpdateOperationExtensionsTests {
6566
}
6667

6768
@Test // DATAMONGO-2209
68-
fun findReplaceAndAwait() {
69+
fun findModifyAndAwaitWithNull() {
70+
71+
val find = mockk<ReactiveUpdateOperation.TerminatingFindAndModify<String>>()
72+
every { find.findAndModify() } returns Mono.empty()
73+
74+
assertThatExceptionOfType(NoSuchElementException::class.java).isThrownBy {
75+
runBlocking { find.findModifyAndAwait() }
76+
}
77+
78+
verify {
79+
find.findAndModify()
80+
}
81+
}
82+
83+
@Test // DATAMONGO-2209
84+
fun findModifyAndAwaitOrNullWithValue() {
85+
86+
val find = mockk<ReactiveUpdateOperation.TerminatingFindAndModify<String>>()
87+
every { find.findAndModify() } returns Mono.just("foo")
88+
89+
runBlocking {
90+
assertThat(find.findModifyAndAwaitOrNull()).isEqualTo("foo")
91+
}
92+
93+
verify {
94+
find.findAndModify()
95+
}
96+
}
97+
98+
@Test // DATAMONGO-2209
99+
fun findModifyAndAwaitOrNullWithNull() {
100+
101+
val find = mockk<ReactiveUpdateOperation.TerminatingFindAndModify<String>>()
102+
every { find.findAndModify() } returns Mono.empty()
103+
104+
runBlocking {
105+
assertThat(find.findModifyAndAwaitOrNull()).isNull()
106+
}
107+
108+
verify {
109+
find.findAndModify()
110+
}
111+
}
112+
113+
@Test // DATAMONGO-2209
114+
fun findReplaceAndAwaitWithValue() {
69115

70116
val find = mockk<ReactiveUpdateOperation.TerminatingFindAndReplace<String>>()
71117
every { find.findAndReplace() } returns Mono.just("foo")
@@ -79,6 +125,51 @@ class ReactiveUpdateOperationExtensionsTests {
79125
}
80126
}
81127

128+
@Test // DATAMONGO-2209
129+
fun findReplaceAndAwaitWithNull() {
130+
131+
val find = mockk<ReactiveUpdateOperation.TerminatingFindAndReplace<String>>()
132+
every { find.findAndReplace() } returns Mono.empty()
133+
134+
assertThatExceptionOfType(NoSuchElementException::class.java).isThrownBy {
135+
runBlocking { find.findReplaceAndAwait() }
136+
}
137+
138+
verify {
139+
find.findAndReplace()
140+
}
141+
}
142+
143+
@Test // DATAMONGO-2209
144+
fun findReplaceAndAwaitOrNullWithValue() {
145+
146+
val find = mockk<ReactiveUpdateOperation.TerminatingFindAndReplace<String>>()
147+
every { find.findAndReplace() } returns Mono.just("foo")
148+
149+
runBlocking {
150+
assertThat(find.findReplaceAndAwaitOrNull()).isEqualTo("foo")
151+
}
152+
153+
verify {
154+
find.findAndReplace()
155+
}
156+
}
157+
158+
@Test // DATAMONGO-2209
159+
fun findReplaceAndAwaitOrNullWithNull() {
160+
161+
val find = mockk<ReactiveUpdateOperation.TerminatingFindAndReplace<String>>()
162+
every { find.findAndReplace() } returns Mono.empty()
163+
164+
runBlocking {
165+
assertThat(find.findReplaceAndAwaitOrNull()).isNull()
166+
}
167+
168+
verify {
169+
find.findAndReplace()
170+
}
171+
}
172+
82173
@Test // DATAMONGO-2209
83174
fun allAndAwait() {
84175

0 commit comments

Comments
 (0)