BAEL-8824 Align module names, folder names and artifact id
- Folder name changes
This commit is contained in:
8
spring-5-data-reactive/README.md
Normal file
8
spring-5-data-reactive/README.md
Normal file
@@ -0,0 +1,8 @@
|
||||
## Spring Data Reactive Project
|
||||
|
||||
### The Course
|
||||
The "REST With Spring" Classes: http://bit.ly/restwithspring
|
||||
|
||||
### Relevant Articles
|
||||
- [Reactive Flow with MongoDB, Kotlin, and Spring WebFlux](http://www.baeldung.com/kotlin-mongodb-spring-webflux)
|
||||
- [Spring Data Reactive Repositories with MongoDB](http://www.baeldung.com/spring-data-mongodb-reactive)
|
||||
211
spring-5-data-reactive/pom.xml
Normal file
211
spring-5-data-reactive/pom.xml
Normal file
@@ -0,0 +1,211 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>spring-5-data-reactive</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<parent>
|
||||
<artifactId>parent-boot-2</artifactId>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<relativePath>../parent-boot-2</relativePath>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.module</groupId>
|
||||
<artifactId>jackson-module-kotlin</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-stdlib-jdk8</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-reflect</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.projectreactor</groupId>
|
||||
<artifactId>reactor-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-stdlib-jdk8</artifactId>
|
||||
<version>${kotlin.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-test</artifactId>
|
||||
<version>${kotlin.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.reactivex.rxjava2</groupId>
|
||||
<artifactId>rxjava</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-test</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-engine</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.platform</groupId>
|
||||
<artifactId>junit-platform-surefire-provider</artifactId>
|
||||
<version>${junit.platform.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.platform</groupId>
|
||||
<artifactId>junit-platform-runner</artifactId>
|
||||
<version>${junit.platform.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>kotlin-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>compile</id>
|
||||
<goals>
|
||||
<goal>compile</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<sourceDirs>
|
||||
<sourceDir>${project.basedir}/src/main/kotlin</sourceDir>
|
||||
<sourceDir>${project.basedir}/src/main/java</sourceDir>
|
||||
</sourceDirs>
|
||||
</configuration>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>test-compile</id>
|
||||
<goals>
|
||||
<goal>test-compile</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<sourceDirs>
|
||||
<sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
|
||||
<sourceDir>${project.basedir}/src/test/java</sourceDir>
|
||||
</sourceDirs>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<configuration>
|
||||
<args>
|
||||
<arg>-Xjsr305=strict</arg>
|
||||
</args>
|
||||
<compilerPlugins>
|
||||
<plugin>spring</plugin>
|
||||
</compilerPlugins>
|
||||
<jvmTarget>1.8</jvmTarget>
|
||||
</configuration>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-maven-allopen</artifactId>
|
||||
<version>${kotlin.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>${java.version}</source>
|
||||
<target>${java.version}</target>
|
||||
</configuration>
|
||||
<executions>
|
||||
<!-- Replacing default-compile as it is treated specially
|
||||
by maven -->
|
||||
<execution>
|
||||
<id>default-compile</id>
|
||||
<phase>none</phase>
|
||||
</execution>
|
||||
<!-- Replacing default-testCompile as it is treated specially
|
||||
by maven -->
|
||||
<execution>
|
||||
<id>default-testCompile</id>
|
||||
<phase>none</phase>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>java-compile</id>
|
||||
<phase>compile</phase>
|
||||
<goals>
|
||||
<goal>compile</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>java-test-compile</id>
|
||||
<phase>test-compile</phase>
|
||||
<goals>
|
||||
<goal>testCompile</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<configuration>
|
||||
<forkCount>3</forkCount>
|
||||
<reuseForks>true</reuseForks>
|
||||
<parallel>methods</parallel>
|
||||
<useUnlimitedThreads>true</useUnlimitedThreads>
|
||||
<excludes>
|
||||
<exclude>**/*IntegrationTest.java</exclude>
|
||||
<exclude>**/*IntTest.java</exclude>
|
||||
<exclude>**/*LiveTest.java</exclude>
|
||||
</excludes>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
<java.version>1.8</java.version>
|
||||
<kotlin.version>1.2.40</kotlin.version>
|
||||
<junit.platform.version>1.0.0</junit.platform.version>
|
||||
<junit.jupiter.version>5.0.2</junit.jupiter.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.baeldung.reactive;
|
||||
|
||||
import com.mongodb.reactivestreams.client.MongoClient;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
|
||||
|
||||
@SpringBootApplication
|
||||
public class Spring5ReactiveApplication{
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(Spring5ReactiveApplication.class, args);
|
||||
}
|
||||
|
||||
@Autowired
|
||||
MongoClient mongoClient;
|
||||
|
||||
@Bean
|
||||
public ReactiveMongoTemplate reactiveMongoTemplate() {
|
||||
return new ReactiveMongoTemplate(mongoClient, "test");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.baeldung.reactive.model;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.mongodb.core.mapping.Document;
|
||||
|
||||
@Document
|
||||
@Data
|
||||
@ToString
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class Account {
|
||||
|
||||
@Id
|
||||
private String id;
|
||||
private String owner;
|
||||
private Double value;
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.baeldung.reactive.repository;
|
||||
|
||||
import com.baeldung.reactive.model.Account;
|
||||
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@Repository
|
||||
public interface AccountCrudRepository extends ReactiveCrudRepository<Account, String> {
|
||||
|
||||
public Flux<Account> findAllByValue(Double value);
|
||||
|
||||
public Mono<Account> findFirstByOwner(Mono<String> owner);
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.baeldung.reactive.repository;
|
||||
|
||||
import com.baeldung.reactive.model.Account;
|
||||
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
|
||||
|
||||
public interface AccountMongoRepository extends ReactiveMongoRepository<Account, String> {
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.baeldung.reactive.repository;
|
||||
|
||||
import com.baeldung.reactive.model.Account;
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.Single;
|
||||
import org.springframework.data.repository.reactive.RxJava2CrudRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface AccountRxJavaRepository extends RxJava2CrudRepository<Account, String>{
|
||||
|
||||
public Observable<Account> findAllByValue(Double value);
|
||||
|
||||
public Single<Account> findFirstByOwner(Single<String> owner);
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.baeldung.reactive.template;
|
||||
|
||||
import com.baeldung.reactive.model.Account;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
|
||||
import org.springframework.data.mongodb.core.ReactiveRemoveOperation;
|
||||
import org.springframework.stereotype.Service;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@Service
|
||||
public class AccountTemplateOperations {
|
||||
|
||||
@Autowired
|
||||
ReactiveMongoTemplate template;
|
||||
|
||||
public Mono<Account> findById(String id) {
|
||||
return template.findById(id, Account.class);
|
||||
}
|
||||
|
||||
public Flux<Account> findAll() {
|
||||
return template.findAll(Account.class);
|
||||
}
|
||||
|
||||
public Mono<Account> save(Mono<Account> account) {
|
||||
return template.save(account);
|
||||
}
|
||||
|
||||
public ReactiveRemoveOperation.ReactiveRemove<Account> deleteAll() {
|
||||
return template.remove(Account.class);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.baeldung
|
||||
|
||||
import org.springframework.boot.SpringApplication
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication
|
||||
|
||||
@SpringBootApplication
|
||||
class Application
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
SpringApplication.run(Application::class.java, *args)
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package com.baeldung
|
||||
|
||||
import org.springframework.data.mongodb.core.mapping.Document
|
||||
|
||||
@Document
|
||||
data class Event(val id: String, val name: String)
|
||||
@@ -0,0 +1,6 @@
|
||||
package com.baeldung
|
||||
|
||||
import org.springframework.data.mongodb.core.mapping.Document
|
||||
import org.springframework.data.mongodb.repository.ReactiveMongoRepository
|
||||
|
||||
interface EventRepository : ReactiveMongoRepository<Event, String>
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.baeldung
|
||||
|
||||
import com.mongodb.reactivestreams.client.MongoClient
|
||||
import com.mongodb.reactivestreams.client.MongoClients
|
||||
import org.springframework.context.annotation.Bean
|
||||
import org.springframework.context.annotation.Configuration
|
||||
import org.springframework.data.mongodb.config.AbstractReactiveMongoConfiguration
|
||||
import org.springframework.data.mongodb.core.ReactiveMongoTemplate
|
||||
import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories
|
||||
|
||||
|
||||
@Configuration
|
||||
@EnableReactiveMongoRepositories(basePackageClasses = arrayOf(EventRepository::class))
|
||||
class MongoConfig : AbstractReactiveMongoConfiguration() {
|
||||
|
||||
override fun reactiveMongoClient(): MongoClient = mongoClient()
|
||||
|
||||
@Bean
|
||||
fun mongoClient(): MongoClient = MongoClients.create()
|
||||
|
||||
override fun getDatabaseName(): String = "mongoDatabase"
|
||||
|
||||
@Bean
|
||||
override fun reactiveMongoTemplate(): ReactiveMongoTemplate = ReactiveMongoTemplate(mongoClient(), databaseName)
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.baeldung
|
||||
|
||||
import org.springframework.http.MediaType
|
||||
import org.springframework.web.bind.annotation.GetMapping
|
||||
import org.springframework.web.bind.annotation.RequestParam
|
||||
import org.springframework.web.bind.annotation.RestController
|
||||
import java.util.*
|
||||
|
||||
|
||||
@RestController
|
||||
class SendEmitter(val eventRepository: EventRepository) {
|
||||
|
||||
@GetMapping(value = "/save", produces = arrayOf(MediaType.TEXT_EVENT_STREAM_VALUE))
|
||||
fun executeExample(@RequestParam("eventName") eventName: String) =
|
||||
eventRepository.save(Event(UUID.randomUUID().toString(), eventName)).flux()
|
||||
}
|
||||
13
spring-5-data-reactive/src/main/resources/logback.xml
Normal file
13
spring-5-data-reactive/src/main/resources/logback.xml
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
|
||||
</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<root level="INFO">
|
||||
<appender-ref ref="STDOUT" />
|
||||
</root>
|
||||
</configuration>
|
||||
39
spring-5-data-reactive/src/main/resources/static/index.html
Normal file
39
spring-5-data-reactive/src/main/resources/static/index.html
Normal file
@@ -0,0 +1,39 @@
|
||||
<html>
|
||||
<body>
|
||||
|
||||
<!-- Save new event -->
|
||||
<form method="get" action="/save">
|
||||
<input type="text" name="eventName">
|
||||
<button type="submit">Save new event</button>
|
||||
</form>
|
||||
|
||||
|
||||
<!-- Receive saved event -->
|
||||
<div id="content"></div>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
let source = new EventSource("save");
|
||||
|
||||
source.addEventListener('message', function (e) {
|
||||
console.log('New message is received');
|
||||
const index = JSON.parse(e.data);
|
||||
const content = `New event added: ${index.name}<br>`;
|
||||
document.getElementById("content").innerHTML += content;
|
||||
}, false);
|
||||
|
||||
source.addEventListener('open', function(e) {
|
||||
console.log('The connection has been opened');
|
||||
}, false);
|
||||
|
||||
source.addEventListener('error', function(e) {
|
||||
if (e.readyState == EventSource.CLOSED){
|
||||
console.log('The connection has been closed');
|
||||
}
|
||||
}, false);
|
||||
|
||||
|
||||
</script>
|
||||
</body>
|
||||
<html>
|
||||
@@ -0,0 +1,70 @@
|
||||
package com.baeldung.reactive.repository;
|
||||
|
||||
|
||||
import com.baeldung.reactive.Spring5ReactiveApplication;
|
||||
import com.baeldung.reactive.model.Account;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.test.StepVerifier;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Spring5ReactiveApplication.class)
|
||||
public class AccountCrudRepositoryIntegrationTest {
|
||||
|
||||
@Autowired
|
||||
AccountCrudRepository repository;
|
||||
|
||||
@Test
|
||||
public void givenValue_whenFindAllByValue_thenFindAccount() {
|
||||
repository.save(new Account(null, "Bill", 12.3)).block();
|
||||
Flux<Account> accountFlux = repository.findAllByValue(12.3);
|
||||
|
||||
StepVerifier.create(accountFlux)
|
||||
.assertNext(account -> {
|
||||
assertEquals("Bill", account.getOwner());
|
||||
assertEquals(Double.valueOf(12.3) , account.getValue());
|
||||
assertNotNull(account.getId());
|
||||
})
|
||||
.expectComplete()
|
||||
.verify();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenOwner_whenFindFirstByOwner_thenFindAccount() {
|
||||
repository.save(new Account(null, "Bill", 12.3)).block();
|
||||
Mono<Account> accountMono = repository.findFirstByOwner(Mono.just("Bill"));
|
||||
|
||||
StepVerifier.create(accountMono)
|
||||
.assertNext(account -> {
|
||||
assertEquals("Bill", account.getOwner());
|
||||
assertEquals(Double.valueOf(12.3) , account.getValue());
|
||||
assertNotNull(account.getId());
|
||||
})
|
||||
.expectComplete()
|
||||
.verify();
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenAccount_whenSave_thenSaveAccount() {
|
||||
Mono<Account> accountMono = repository.save(new Account(null, "Bill", 12.3));
|
||||
|
||||
StepVerifier
|
||||
.create(accountMono)
|
||||
.assertNext(account -> assertNotNull(account.getId()))
|
||||
.expectComplete()
|
||||
.verify();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package com.baeldung.reactive.repository;
|
||||
|
||||
import com.baeldung.reactive.Spring5ReactiveApplication;
|
||||
import com.baeldung.reactive.model.Account;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.data.domain.Example;
|
||||
import org.springframework.data.domain.ExampleMatcher;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.test.StepVerifier;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.springframework.data.domain.ExampleMatcher.GenericPropertyMatchers.startsWith;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Spring5ReactiveApplication.class)
|
||||
public class AccountMongoRepositoryIntegrationTest {
|
||||
|
||||
@Autowired
|
||||
AccountMongoRepository repository;
|
||||
|
||||
@Test
|
||||
public void givenExample_whenFindAllWithExample_thenFindAllMacthings() {
|
||||
repository.save(new Account(null, "john", 12.3)).block();
|
||||
ExampleMatcher matcher = ExampleMatcher.matching().withMatcher("owner", startsWith());
|
||||
Example<Account> example = Example.of(new Account(null, "jo", null), matcher);
|
||||
Flux<Account> accountFlux = repository.findAll(example);
|
||||
|
||||
StepVerifier
|
||||
.create(accountFlux)
|
||||
.assertNext(account -> assertEquals("john", account.getOwner()))
|
||||
.expectComplete()
|
||||
.verify();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenAccount_whenSave_thenSave() {
|
||||
Mono<Account> accountMono = repository.save(new Account(null, "john", 12.3));
|
||||
|
||||
StepVerifier
|
||||
.create(accountMono)
|
||||
.assertNext(account -> assertNotNull(account.getId()))
|
||||
.expectComplete()
|
||||
.verify();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenId_whenFindById_thenFindAccount() {
|
||||
Account inserted = repository.save(new Account(null, "john", 12.3)).block();
|
||||
Mono<Account> accountMono = repository.findById(inserted.getId());
|
||||
|
||||
StepVerifier
|
||||
.create(accountMono)
|
||||
.assertNext(account -> {
|
||||
assertEquals("john", account.getOwner());
|
||||
assertEquals(Double.valueOf(12.3), account.getValue());
|
||||
assertNotNull(account.getId());
|
||||
})
|
||||
.expectComplete()
|
||||
.verify();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
package com.baeldung.reactive.repository;
|
||||
|
||||
import com.baeldung.reactive.Spring5ReactiveApplication;
|
||||
import com.baeldung.reactive.model.Account;
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.Single;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Spring5ReactiveApplication.class)
|
||||
public class AccountRxJavaRepositoryIntegrationTest {
|
||||
|
||||
@Autowired
|
||||
AccountRxJavaRepository repository;
|
||||
|
||||
@Test
|
||||
public void givenValue_whenFindAllByValue_thenFindAccounts() throws InterruptedException {
|
||||
repository.save(new Account(null, "bruno", 12.3)).blockingGet();
|
||||
Observable<Account> accountObservable = repository.findAllByValue(12.3);
|
||||
|
||||
accountObservable
|
||||
.test()
|
||||
.await()
|
||||
.assertComplete()
|
||||
.assertValueAt(0, account -> {
|
||||
assertEquals("bruno", account.getOwner());
|
||||
assertEquals(Double.valueOf(12.3), account.getValue());
|
||||
return true;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenOwner_whenFindFirstByOwner_thenFindAccount() throws InterruptedException {
|
||||
repository.save(new Account(null, "bruno", 12.3)).blockingGet();
|
||||
Single<Account> accountSingle = repository.findFirstByOwner(Single.just("bruno"));
|
||||
|
||||
accountSingle
|
||||
.test()
|
||||
.await()
|
||||
.assertComplete()
|
||||
.assertValueAt(0, account -> {
|
||||
assertEquals("bruno", account.getOwner());
|
||||
assertEquals(Double.valueOf(12.3), account.getValue());
|
||||
assertNotNull(account.getId());
|
||||
return true;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package com.baeldung.reactive.template;
|
||||
|
||||
import com.baeldung.reactive.Spring5ReactiveApplication;
|
||||
import com.baeldung.reactive.model.Account;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Spring5ReactiveApplication.class)
|
||||
public class AccountTemplateOperationsIntegrationTest {
|
||||
|
||||
@Autowired
|
||||
AccountTemplateOperations accountTemplate;
|
||||
|
||||
@Test
|
||||
public void givenAccount_whenSave_thenSave() {
|
||||
Account account = accountTemplate.save(Mono.just(new Account(null, "Raul", 12.3))).block();
|
||||
assertNotNull( account.getId() );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenId_whenFindById_thenFindAccount() {
|
||||
Mono<Account> accountMono = accountTemplate.save(Mono.just(new Account(null, "Raul", 12.3)));
|
||||
Mono<Account> accountMonoResult = accountTemplate.findById(accountMono.block().getId());
|
||||
assertNotNull(accountMonoResult.block().getId());
|
||||
assertEquals(accountMonoResult.block().getOwner(), "Raul");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenFindAll_thenFindAllAccounts() {
|
||||
Account account1 = accountTemplate.save(Mono.just(new Account(null, "Raul", 12.3))).block();
|
||||
Account account2 = accountTemplate.save(Mono.just(new Account(null, "Raul Torres", 13.3))).block();
|
||||
Flux<Account> accountFlux = accountTemplate.findAll();
|
||||
List<Account> accounts = accountFlux.collectList().block();
|
||||
assertTrue(accounts.stream().anyMatch(x -> account1.getId().equals(x.getId()) ));
|
||||
assertTrue(accounts.stream().anyMatch(x -> account2.getId().equals(x.getId()) ));
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user