DATAMONGO-1610 - Support RxJava 2 repositories.

Add RxJava 2 dependency. Add test to verify RxJava 2 interoperability.

Original Pull Request: #440
This commit is contained in:
Mark Paluch
2017-02-08 10:35:06 +01:00
committed by Christoph Strobl
parent 2ab466eb35
commit b1acda4188
2 changed files with 113 additions and 12 deletions

View File

@@ -132,6 +132,13 @@
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.reactivex.rxjava2</groupId>
<artifactId>rxjava</artifactId>
<version>${rxjava2}</version>
<optional>true</optional>
</dependency>
<!-- CDI -->
<dependency>
<groupId>javax.enterprise</groupId>

View File

@@ -18,6 +18,9 @@ package org.springframework.data.mongodb.repository;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import io.reactivex.Flowable;
import io.reactivex.Maybe;
import io.reactivex.observers.TestObserver;
import lombok.Data;
import lombok.NoArgsConstructor;
import reactor.core.publisher.Flux;
@@ -42,6 +45,7 @@ import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories;
import org.springframework.data.repository.reactive.ReactiveSortingRepository;
import org.springframework.data.repository.reactive.RxJava1SortingRepository;
import org.springframework.data.repository.reactive.RxJava2SortingRepository;
import org.springframework.stereotype.Repository;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -62,7 +66,8 @@ public class ConvertingReactiveMongoRepositoryTests {
@Autowired MixedReactivePersonRepostitory reactiveRepository;
@Autowired ReactivePersonRepostitory reactivePersonRepostitory;
@Autowired RxJavaPersonRepostitory rxJavaPersonRepostitory;
@Autowired RxJava1PersonRepostitory rxJava1PersonRepostitory;
@Autowired RxJava2PersonRepostitory rxJava2PersonRepostitory;
ReactivePerson dave, oliver, carter, boyd, stefan, leroi, alicia;
@@ -95,9 +100,9 @@ public class ConvertingReactiveMongoRepositoryTests {
}
@Test // DATAMONGO-1444
public void simpleRxJavaMethodsShouldWork() {
public void simpleRxJava1MethodsShouldWork() throws Exception {
rxJavaPersonRepostitory.exists(dave.getId()) //
rxJava1PersonRepostitory.exists(dave.getId()) //
.test() //
.awaitTerminalEvent() //
.assertValue(true) //
@@ -106,9 +111,9 @@ public class ConvertingReactiveMongoRepositoryTests {
}
@Test // DATAMONGO-1444
public void existsWithSingleRxJavaIdMethodsShouldWork() {
public void existsWithSingleRxJava1IdMethodsShouldWork() throws Exception {
rxJavaPersonRepostitory.exists(Single.just(dave.getId())) //
rxJava1PersonRepostitory.exists(Single.just(dave.getId())) //
.test() //
.awaitTerminalEvent() //
.assertValue(true) //
@@ -117,9 +122,9 @@ public class ConvertingReactiveMongoRepositoryTests {
}
@Test // DATAMONGO-1444
public void singleRxJavaQueryMethodShouldWork() {
public void singleRxJava1QueryMethodShouldWork() throws Exception {
rxJavaPersonRepostitory.findByFirstnameAndLastname(dave.getFirstname(), dave.getLastname()) //
rxJava1PersonRepostitory.findByFirstnameAndLastname(dave.getFirstname(), dave.getLastname()) //
.test() //
.awaitTerminalEvent() //
.assertValue(dave) //
@@ -128,9 +133,9 @@ public class ConvertingReactiveMongoRepositoryTests {
}
@Test // DATAMONGO-1444
public void singleProjectedRxJavaQueryMethodShouldWork() {
public void singleProjectedRxJava1QueryMethodShouldWork() throws Exception {
List<ProjectedPerson> people = rxJavaPersonRepostitory.findProjectedByLastname(carter.getLastname()) //
List<ProjectedPerson> people = rxJava1PersonRepostitory.findProjectedByLastname(carter.getLastname()) //
.test() //
.awaitTerminalEvent() //
.assertValueCount(1) //
@@ -143,9 +148,9 @@ public class ConvertingReactiveMongoRepositoryTests {
}
@Test // DATAMONGO-1444
public void observableRxJavaQueryMethodShouldWork() {
public void observableRxJava1QueryMethodShouldWork() throws Exception {
rxJavaPersonRepostitory.findByLastname(boyd.getLastname()) //
rxJava1PersonRepostitory.findByLastname(boyd.getLastname()) //
.test() //
.awaitTerminalEvent() //
.assertValue(boyd) //
@@ -154,6 +159,83 @@ public class ConvertingReactiveMongoRepositoryTests {
.getOnNextEvents();
}
@Test // DATAMONGO-1610
public void simpleRxJava2MethodsShouldWork() throws Exception {
TestObserver<Boolean> testObserver = rxJava2PersonRepostitory.exists(dave.getId()).test();
testObserver.awaitTerminalEvent();
testObserver.assertComplete();
testObserver.assertNoErrors();
testObserver.assertValue(true);
}
@Test // DATAMONGO-1610
public void existsWithSingleRxJava2IdMethodsShouldWork() throws Exception {
TestObserver<Boolean> testObserver = rxJava2PersonRepostitory.exists(io.reactivex.Single.just(dave.getId())).test();
testObserver.awaitTerminalEvent();
testObserver.assertComplete();
testObserver.assertNoErrors();
testObserver.assertValue(true);
}
@Test // DATAMONGO-1610
public void flowableRxJava2QueryMethodShouldWork() throws Exception {
io.reactivex.subscribers.TestSubscriber<ReactivePerson> testSubscriber = rxJava2PersonRepostitory
.findByFirstnameAndLastname(dave.getFirstname(), dave.getLastname()).test();
testSubscriber.awaitTerminalEvent();
testSubscriber.assertComplete();
testSubscriber.assertNoErrors();
testSubscriber.assertValue(dave);
}
@Test // DATAMONGO-1610
public void singleProjectedRxJava2QueryMethodShouldWork() throws Exception {
TestObserver<ProjectedPerson> testObserver = rxJava2PersonRepostitory
.findProjectedByLastname(Maybe.just(carter.getLastname())).test();
testObserver.awaitTerminalEvent();
testObserver.assertComplete();
testObserver.assertNoErrors();
testObserver.assertValue(actual -> {
assertThat(actual.getFirstname(), is(equalTo(carter.getFirstname())));
return true;
});
}
@Test // DATAMONGO-1610
public void observableProjectedRxJava2QueryMethodShouldWork() throws Exception {
TestObserver<ProjectedPerson> testObserver = rxJava2PersonRepostitory
.findProjectedByLastname(Single.just(carter.getLastname())).test();
testObserver.awaitTerminalEvent();
testObserver.assertComplete();
testObserver.assertNoErrors();
testObserver.assertValue(actual -> {
assertThat(actual.getFirstname(), is(equalTo(carter.getFirstname())));
return true;
});
}
@Test // DATAMONGO-1610
public void maybeRxJava2QueryMethodShouldWork() throws Exception {
TestObserver<ReactivePerson> testObserver = rxJava2PersonRepostitory.findByLastname(boyd.getLastname()).test();
testObserver.awaitTerminalEvent();
testObserver.assertComplete();
testObserver.assertNoErrors();
testObserver.assertValue(boyd);
}
@Test // DATAMONGO-1444
public void mixedRepositoryShouldWork() {
@@ -203,7 +285,7 @@ public class ConvertingReactiveMongoRepositoryTests {
}
@Repository
interface RxJavaPersonRepostitory extends RxJava1SortingRepository<ReactivePerson, String> {
interface RxJava1PersonRepostitory extends RxJava1SortingRepository<ReactivePerson, String> {
Observable<ReactivePerson> findByFirstnameAndLastname(String firstname, String lastname);
@@ -212,6 +294,18 @@ public class ConvertingReactiveMongoRepositoryTests {
Single<ProjectedPerson> findProjectedByLastname(String lastname);
}
@Repository
interface RxJava2PersonRepostitory extends RxJava2SortingRepository<ReactivePerson, String> {
Flowable<ReactivePerson> findByFirstnameAndLastname(String firstname, String lastname);
Maybe<ReactivePerson> findByLastname(String lastname);
io.reactivex.Single<ProjectedPerson> findProjectedByLastname(Maybe<String> lastname);
io.reactivex.Observable<ProjectedPerson> findProjectedByLastname(Single<String> lastname);
}
@Repository
interface MixedReactivePersonRepostitory extends ReactiveMongoRepository<ReactivePerson, String> {