Commit b221af2b authored by Sarika Sama's avatar Sarika Sama

Merge branch 'int-tests' into 'master'

Int tests

See merge request !1
parents ea59d826 a7a7171d
spring-cloud-config:
spring cloud config provides server and client-side support for externalized configuration in a distributed system.
With the Config Server you have a central place to manage external properties for applications across all environments
\ No newline at end of file
......@@ -5,7 +5,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.12</version>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.nisum</groupId>
......@@ -21,11 +21,71 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.testcontainers/testcontainers -->
<!-- <dependency>-->
<!-- <groupId>org.testcontainers</groupId>-->
<!-- <artifactId>testcontainers</artifactId>-->
<!-- <version>1.18.0</version>-->
<!-- <scope>test</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
</dependency>
<dependency>
<groupId>cz.jirutka.spring</groupId>
<artifactId>embedmongo-spring</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-webflux-ui</artifactId>
<version>1.6.14</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springdoc</groupId>-->
<!-- <artifactId>springdoc-openapi-starter-webflux-ui</artifactId>-->
<!-- <version>1.6.14</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-openfeign-core</artifactId>-->
<!-- <version>3.0.2</version>-->
<!-- </dependency>-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-config-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-webflux-core</artifactId>
......@@ -35,7 +95,24 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<version>2.2.0</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
......@@ -73,6 +150,14 @@
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
......
C:\kafka\bin\windows\zookeeper-server-start.bat C:\kafka\config\zookeeper.properties
C:\kafka\bin\windows\kafka-server-start.bat C:\kafka\config\server.properties
##C:\kafka\bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 -topic nisum-stream
Run server properties of kafka:
-------------------------------
C:\kafka\bin\windows\kafka-server-start.bat .\config\server.properties
Run on cmd for zookeeper properties of kafka:
---------------------------------------------
C:\kafka\bin\windows\zookeeper-server-start.bat .\config\zookeeper.properties
To create a Topic in new terminal
---------------------------------
C:\kafka\bin\windows\kafka-topics.bat --create --topic library-events1 --bootstrap-server localhost:9092
C:\kafka\bin\windows\kafka-topics.bat --create --topic order_topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
C:\kafka\bin\windows\kafka-topics.bat --delete --topic order_topic --bootstrap-server localhost:9092
List of Topics:
----------------
C:\kafka\bin\windows\kafka-topics.bat --list --bootstrap-server localhost:9092
Add messages into the topics in producer
---------------------------------------------
C:\kafka\bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic library-events
To see messages from the topic in consumer
-------------------------------------------
c:\kafka\bin\windows\kafka-console-consumer.bat --topic library-events1 --from-beginning --bootstrap-server localhost:9092
c:\kafka\bin\windows\kafka-console-consumer.bat --topic order_topic --from-beginning --bootstrap-server localhost:9092
http://localhost:9090/webjars/swagger-ui/index.html
\ No newline at end of file
package com.nisum.webfluxmongodbordermanagement.config;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
import org.springframework.kafka.support.serializer.ErrorHandlingDeserializer;
import java.util.HashMap;
import java.util.Map;
@Configuration
@EnableKafka
@Slf4j
public class KafkaConsumerConfig {
@Bean
public ConsumerFactory<String, String> consumerFatory() {
Map<String, Object> config = new HashMap<>();
config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
config.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
config.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
config.put(ErrorHandlingDeserializer.KEY_DESERIALIZER_CLASS, ErrorHandlingDeserializer.class);
config.put(ErrorHandlingDeserializer.VALUE_DESERIALIZER_CLASS, ErrorHandlingDeserializer.class);
config.put(ConsumerConfig.GROUP_ID_CONFIG, "orders_group");
config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
config.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
//return new DefaultKafkaConsumerFactory<>(config, new StringDeserializer(), new StringDeserializer());
DefaultKafkaConsumerFactory<String, String> consumerFactory = new DefaultKafkaConsumerFactory<>(config);
log.info("consumer config is ready {}", consumerFactory.getConfigurationProperties());
return consumerFactory;
}
@Bean(name = "consumer_factory")
public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, String> concurrentKafkaListenerContainerFactory = new ConcurrentKafkaListenerContainerFactory<>();
concurrentKafkaListenerContainerFactory.setConsumerFactory(consumerFatory());
concurrentKafkaListenerContainerFactory.setMissingTopicsFatal(false);
return concurrentKafkaListenerContainerFactory;
}
}
\ No newline at end of file
package com.nisum.webfluxmongodbordermanagement.config;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class KafkaListeners {
@Value("${order_topic}")
private String topicName;
@KafkaListener(topics = "${order_topic}",
groupId = "orders_group",
containerFactory="consumer_factory")
public void consume(ConsumerRecord<String, String> record){
log.info("record consumed to topic: {}, offset {}, partitionkey {}, message {}",
record.topic(), record.offset(), record.key(), record.value());
}
}
package com.nisum.webfluxmongodbordermanagement.config;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.producer.RecordMetadata;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class KafkaProducer {
private final KafkaTemplate<String, String> kafkaTemplate;
@Autowired
public KafkaProducer(KafkaTemplate<String, String> kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
public void sendMessage(String topic, String partitionKey, String message) {
kafkaTemplate.send(topic, partitionKey, message)
.addCallback(result -> {
RecordMetadata record = result.getRecordMetadata();
log.info("record sent to topic {}, partition {}, offset {}, partitionkey {}, record {}",
record.topic(), record.partition(), record.offset(), partitionKey, message);
},
ex -> log.error("failed to send message to topic {}, partitionkey {}, message {}",
topic, partitionKey, message)
);
}
}
package com.nisum.webfluxmongodbordermanagement.config;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import java.util.HashMap;
import java.util.Map;
@Configuration
@Slf4j
public class KafkaProducerConfig {
@Bean
ProducerFactory<String, String> producerFactory() {
Map<String, Object> config = new HashMap<>();
config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
config.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
config.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
DefaultKafkaProducerFactory<String, String> producerFactory = new DefaultKafkaProducerFactory<String, String>(config);
log.info("producer config is ready {}",producerFactory.getConfigurationProperties());
return producerFactory;
}
@Bean
KafkaTemplate<String, String> kafkaTemplate() {
return new KafkaTemplate<String, String>(producerFactory());
}
}
\ No newline at end of file
package com.nisum.webfluxmongodbordermanagement.controller;
import com.nisum.webfluxmongodbordermanagement.entity.Order;
import com.nisum.webfluxmongodbordermanagement.service.OrdersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@RestController
public class OrderConfigController {
@Value("${app.order}")
private String orderNumber;
@GetMapping("/getOrderNumber")
public Mono<String> getOrderNumbers() {
return Mono.just(orderNumber);
}
}
......@@ -3,7 +3,9 @@ package com.nisum.webfluxmongodbordermanagement.controller;
import com.nisum.webfluxmongodbordermanagement.entity.Order;
import com.nisum.webfluxmongodbordermanagement.service.OrdersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
......@@ -13,9 +15,10 @@ public class OrdersController {
@Autowired
private OrdersService ordersService;
@GetMapping("/orders")
public Flux<Order> getOrders(){
return ordersService.getOrders();
@GetMapping("/publish-orders")
public Flux<Order> publishToKafka() {
Flux<Order> orders = ordersService.fetchOrdersAndPublish();
return orders;
}
}
......@@ -17,9 +17,10 @@ public class UserController {
@Autowired
UserService userService;
@GetMapping("/users")
@GetMapping("/publish-users")
public Flux<User> getUsers() {
return userService.getUsers();
Flux<User> user= userService.fetchUsersAndPublish();
return user;
}
}
......@@ -27,16 +28,3 @@ public class UserController {
//
//@PostMapping("/userDetails")
// public Mono<User> saveUser(@RequestBody User user){
// return userService.addUser(user);
// }
// @GetMapping("/{userId}")
// public Mono<ResponseEntity<User>> getUserWithOrders(@PathVariable String userId) {
// return userService.getUserWithOrders(userId)
// .map(user -> ResponseEntity.ok(user))
// .defaultIfEmpty(ResponseEntity.notFound().build());
// }
\ No newline at end of file
package com.nisum.webfluxmongodbordermanagement.controller;
import com.nisum.webfluxmongodbordermanagement.config.KafkaProducer;
import com.nisum.webfluxmongodbordermanagement.entity.User;
import com.nisum.webfluxmongodbordermanagement.entity.UserOrders;
import com.nisum.webfluxmongodbordermanagement.service.UserOrdersService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;
import java.util.List;
@RestController
@Slf4j
public class UserOrdersController {
@Autowired
private UserOrdersService userOrdersService;
@GetMapping("/user-orders")
public Flux<UserOrders> getAllUsersWithOrders(){
public Flux<UserOrders> fetchUserOrdersAndPublish(){
Flux<UserOrders> userOrdersFlux = userOrdersService.getAllUsersWithOrders();
userOrdersService.fetchUserOrdersAndPublish(userOrdersFlux);
return userOrdersFlux;
}
......
package com.nisum.webfluxmongodbordermanagement.entity;
import lombok.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Document(collection = "orders")
public class Order {
@Id
private String _id;
private String orderId;
private String userId;
private String transactionId;
private String trackingId;
private String status;
}
......@@ -18,6 +18,6 @@ public class User {
private String userId;
private String userName;
private String emailId;
private String orderId;
// private String orderId;
}
package com.nisum.webfluxmongodbordermanagement.service;
import com.nisum.webfluxmongodbordermanagement.config.KafkaProducer;
import com.nisum.webfluxmongodbordermanagement.entity.Order;
import com.nisum.webfluxmongodbordermanagement.repository.OrderRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;
import java.util.List;
@Service
@Slf4j
public class OrdersService {
@Autowired
private OrderRepository orderRepository;
public Flux<Order> getOrders(){
return orderRepository.findAll();
@Autowired
private KafkaProducer kafkaProducer;
@Value("${order_topic}")
private String topicName;
public Flux<Order> fetchOrdersAndPublish(){
Flux<Order> orders = orderRepository.findAll();
Mono<List<Order>> ordersMono = orders.collectList()
.subscribeOn(Schedulers.boundedElastic());
ordersMono.subscribe(
resultList -> {
log.info("sending orders to kafka");
for (Order order : resultList) {
kafkaProducer.sendMessage( topicName, "order-"+order.getOrderId(), order.toString());
}
},
throwable -> log.error("Error occurred: {}", throwable.getMessage())
);
return orders;
}
}
package com.nisum.webfluxmongodbordermanagement.service;
import com.nisum.webfluxmongodbordermanagement.config.KafkaProducer;
import com.nisum.webfluxmongodbordermanagement.entity.UserOrders;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
......@@ -9,21 +12,34 @@ import org.springframework.data.mongodb.core.aggregation.LookupOperation;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;
import java.util.List;
@Service
@Slf4j
public class UserOrdersService {
@Autowired
private ReactiveMongoTemplate reactiveMongoTemplate;
ReactiveMongoTemplate reactiveMongoTemplate;
@Autowired
private KafkaProducer kafkaProducer;
@Value("${order_topic}")
private String topicName;
public Flux<UserOrders> getAllUsersWithOrders() {
LookupOperation lookupOperation = LookupOperation.newLookup().
from("orders").
localField("userId").
foreignField("userId").
as("order");
Aggregation aggregation = Aggregation.newAggregation(lookupOperation);
return reactiveMongoTemplate.aggregate(aggregation, "user", UserOrders.class);
}
......@@ -42,8 +58,24 @@ public class UserOrdersService {
return reactiveMongoTemplate.aggregate(aggregation, "user", UserOrders.class);
}
public void fetchUserOrdersAndPublish( Flux<UserOrders> userOrdersFlux){
Mono<List<UserOrders>> usersMono = userOrdersFlux.collectList()
.subscribeOn(Schedulers.boundedElastic());
usersMono
.subscribe(
resultList -> {
log.info("sending userOrders to kafka");
for (UserOrders user : resultList) {
kafkaProducer.sendMessage( topicName, "userOrders-"+user.getUserId(), user.toString());
}
},
throwable -> log.error("Error occurred: {}", throwable.getMessage())
);
}
}
......
package com.nisum.webfluxmongodbordermanagement.service;
import com.nisum.webfluxmongodbordermanagement.config.KafkaProducer;
import com.nisum.webfluxmongodbordermanagement.entity.User;
import com.nisum.webfluxmongodbordermanagement.repository.UserRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;
import java.util.List;
@Service
@Slf4j
public class UserService {
@Autowired
private UserRepository userRepository;
public Flux<User> getUsers(){
return userRepository.findAll();
}
@Autowired
private KafkaProducer kafkaProducer;
@Value("${order_topic}")
private String topicName;
// public Flux<User> getUsers(){
//
// return userRepository.findAll();
// }
public Flux<User> fetchUsersAndPublish(){
Flux<User> users = userRepository.findAll();
Mono<List<User>> usersMono = users.collectList()
.subscribeOn(Schedulers.boundedElastic());
usersMono
.subscribe(
resultList -> {
log.info("sending users to kafka");
for (User user : resultList) {
kafkaProducer.sendMessage( topicName, "user-"+user.getUserId(), user.toString());
}
},
throwable -> log.error("Error occurred: {}", throwable.getMessage())
);
return users;
}
}
\ No newline at end of file
#server.port=9090
#spring.data.mongodb.user-orders-db.uri=mongodb://localhost:27017/user-orders-db
#spring.data.mongodb.user-orders-db.database=user-orders-db
server.port=9090
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=user-orders-db
order_topic=order_topic
#spring.data.mongodb.orders-db.uri=mongodb://localhost:27017/orders-db
#spring.data.mongodb.orders-db.database=orders-db
spring.cloud.config.uri=http://localhost:8888
//package com.nisum.webfluxmongodbordermanagement.controller;
//
//import com.nisum.webfluxmongodbordermanagement.entity.Order;
//import com.nisum.webfluxmongodbordermanagement.repository.OrderRepository;
//import com.nisum.webfluxmongodbordermanagement.service.OrdersService;
//import org.junit.jupiter.api.BeforeEach;
//import org.junit.jupiter.api.Disabled;
//import org.junit.jupiter.api.Test;
//import org.junit.jupiter.api.extension.ExtendWith;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
//import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
//import org.springframework.data.mongodb.core.MongoTemplate;
//import org.springframework.test.context.ActiveProfiles;
//import org.springframework.test.context.junit.jupiter.SpringExtension;
//import org.springframework.test.web.reactive.server.WebTestClient;
//import reactor.core.publisher.Flux;
//import reactor.test.StepVerifier;
//
//import java.io.IOException;
//
////@DataMongoTest
//@WebFluxTest
//@ExtendWith(SpringExtension.class)
//@ActiveProfiles("test")
//public class OrderControllerIntTest {
//
// static {
// System.setProperty("spring.mongodb.embedded.version","5.0.0");
// }
//
// @Autowired
// OrdersService ordersService;
//
// @Autowired
// OrderRepository orderRepository;
//
// @Autowired
// WebTestClient webTestClient ;
//// .bindToServer()
//// .baseUrl("http://localhost:9090")
//// .build();
//
//
// @BeforeEach
// public void setup() throws IOException {
//// mongoTemplate.getCollection("orders").drop();
//// //mongoTemplate.insert(new User("23563456", "01", "samab12344","sarika@123456","1"));
//// mongoTemplate.insert(new Order("2356781", "01", "1","ooppo122356","oppo123456","sucess"));
//
// }
//
// @Test
// public void getOrderControllerTest(@Autowired MongoTemplate mongoTemplate) {
// mongoTemplate.getCollection("orders").drop();
//
// mongoTemplate.insert(new Order("2356781", "01", "1","ooppo122356","oppo123456","sucess"));
// Flux<Order> result = ordersService.fetchOrdersAndPublish();
// StepVerifier.create(result)
// .expectNextMatches(order -> order.getOrderId().equals("01"))
// .expectComplete()
// .verify();
// }
//// mongoTemplate.insert(new Order("2356781", "01", "1","ooppo122356","oppo123456","sucess"));
////
//// Flux<Order> responseBody = webTestClient.get().uri("/orders")
//// .exchange()
//// .expectStatus().isOk()
//// .returnResult(Order.class)
//// .getResponseBody();
//////
//// StepVerifier.create(responseBody)
//// .expectSubscription()
//// .expectNextMatches(order -> order.getUserId().equals("1"))
//// .verifyComplete();
////}
//
//
//}
//package com.nisum.webfluxmongodbordermanagement.controller;
//
//import com.nisum.webfluxmongodbordermanagement.entity.Order;
//import com.nisum.webfluxmongodbordermanagement.service.OrdersService;
//import de.flapdoodle.embed.mongo.MongodExecutable;
//import de.flapdoodle.embed.mongo.MongodStarter;
//import de.flapdoodle.embed.mongo.config.IMongodConfig;
//import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
//import de.flapdoodle.embed.mongo.config.Net;
//import de.flapdoodle.embed.mongo.distribution.Version;
//import de.flapdoodle.embed.process.runtime.Network;
//import org.junit.jupiter.api.BeforeEach;
//import org.junit.jupiter.api.Test;
//import org.junit.jupiter.api.extension.ExtendWith;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
//import org.springframework.boot.test.context.SpringBootTest;
//import org.springframework.data.mongodb.core.ReactiveMongoOperations;
//import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
//import org.springframework.test.context.ActiveProfiles;
//import org.springframework.test.context.junit.jupiter.SpringExtension;
//import org.springframework.test.util.TestSocketUtils;
//import org.springframework.test.web.reactive.server.WebTestClient;
//
//import java.io.IOException;
//
////@SpringJUnitConfig
//@ExtendWith(SpringExtension.class)
//@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
//@AutoConfigureWebTestClient(timeout = "30000")
//@ActiveProfiles("test")
//public class OrderControllerIntegrationTest {
// static int port = TestSocketUtils.findAvailableTcpPort();
// public static final String MONGODB_URL = "mongodb://localhost:" + port;
// static MongodExecutable mongodExecutable = null;
//
// static {
// System.setProperty("spring.mongodb.embedded.version","5.0.0");
// }
//
// @Autowired
// ReactiveMongoOperations mongoOperations;
//
// @Autowired
// WebTestClient webTestClient;
//
// @Autowired
// OrdersService ordersService;
//
// @BeforeEach
// public void setup() throws IOException {
// MongodStarter starter = MongodStarter.getDefaultInstance();
// IMongodConfig mongodConfig = new MongodConfigBuilder().version(Version.Main.PRODUCTION)
// .net(new Net(port, Network.localhostIsIPv6())).build();
// mongodExecutable = starter.prepare(mongodConfig);
// mongodExecutable.start();
// }
//
// @Test
// public void getOrderControllerTest() {
//
// Order order = new Order("2356781", "01", "1", "ooppo122356", "oppo123456", "sucess");
// //mongoTemplate.insert(order, "orders").block();
// webTestClient.get().uri("/orders")
// .exchange()
// .expectStatus().isOk()
// .returnResult(Order.class)
// .getResponseBody();
//
// }
//
//}
//// public void testGetUserByEmailId() {
//// UserDto userDto = ReadJson.read("userDetails.json", UserDto.class);
//// reactiveMongoTemplate.insert(userDto, USER_COLLECTION).block();
////
//// webTestClient.get().uri("/api/user/v1/login/amit@gmail.com")
//// .exchange()
//// .expectStatus().isOk()
//// .expectBody(UserDto.class)
//// .value(userDto1 ->
//// assertEquals("amit@gmail.com", userDto.getEmailId())
//// );
//// }
\ No newline at end of file
......@@ -46,9 +46,9 @@ public class OrderControllerTest {
// Mock data
Flux<Order> order = Flux.just(new Order("1", "1123", "01", "ooppo01234","ooppo12345678","success"));
when(ordersService.getOrders()).thenReturn(order);
when(ordersService.fetchOrdersAndPublish()).thenReturn(order);
Flux<Order> responseBody = webTestClient.get().uri("/orders")
Flux<Order> responseBody = webTestClient.get().uri("/publish-orders")
.exchange()
.expectStatus().isOk()
.returnResult(Order.class)
......@@ -58,7 +58,7 @@ public class OrderControllerTest {
.expectSubscription()
.expectNextMatches(p -> p.getUserId().equals("01"))
.verifyComplete();
}
}
}
......@@ -6,9 +6,6 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
import org.springframework.boot.test.mock.mockito.MockBean;
......@@ -47,10 +44,10 @@ public class UserControllerTest {
public void testGetUsers() {
// Mock data
Flux<User> user = Flux.just(new User("1", "1", "sama", "sama@gmail.com","01"));
when(userService.getUsers()).thenReturn(user);
Flux<User> user = Flux.just(new User("1", "1", "sama", "sama@gmail.com"));
when(userService.fetchUsersAndPublish()).thenReturn(user);
Flux<User> responseBody = webTestClient.get().uri("/users")
Flux<User> responseBody = webTestClient.get().uri("/publish-users")
.exchange()
.expectStatus().isOk()
.returnResult(User.class)
......
......@@ -8,6 +8,7 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
import org.springframework.boot.test.mock.mockito.MockBean;
......@@ -19,6 +20,8 @@ import reactor.test.StepVerifier;
import java.util.Arrays;
import java.util.List;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.when;
@ExtendWith(SpringExtension.class)
......@@ -26,6 +29,8 @@ import static org.mockito.Mockito.when;
public class UserOrderControllerTest {
@InjectMocks
UserOrdersController controller;
@Autowired
private WebTestClient webTestClient;
......@@ -38,13 +43,6 @@ public class UserOrderControllerTest {
void setUp() {
}
@AfterEach
void tearDown() {
}
@Test
void getAllUsers() {
}
@Test
public void testGetUsersAndOrders() {
......@@ -53,6 +51,7 @@ public class UserOrderControllerTest {
Arrays.asList(new Order("1","123","01","oppo1234","oppo23bvn1","success"),
new Order("2","1234","01","vivo1234","vivo23bvn1","success"))));
when(userOrdersService.getAllUsersWithOrders()).thenReturn(order);
doNothing().when(userOrdersService).fetchUserOrdersAndPublish(any());
Flux<UserOrders> responseBody = webTestClient.get().uri("/user-orders")
.exchange()
......
//package com.nisum.webfluxmongodbordermanagement.service;
//
//import com.nisum.webfluxmongodbordermanagement.entity.Order;
//import com.nisum.webfluxmongodbordermanagement.repository.OrderRepository;
//import org.junit.jupiter.api.BeforeEach;
//import org.junit.jupiter.api.Test;
//import org.junit.jupiter.api.extension.ExtendWith;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
//import org.springframework.data.mongodb.core.MongoTemplate;
//import org.springframework.test.context.ActiveProfiles;
//import org.springframework.test.context.junit.jupiter.SpringExtension;
//import reactor.core.publisher.Flux;
//import reactor.test.StepVerifier;
//
//import java.io.IOException;
//@DataMongoTest
//@ExtendWith(SpringExtension.class)
//@ActiveProfiles("test")
//public class OrdersServiceIntTest {
//
// static {
// System.setProperty("spring.mongodb.embedded.version","5.0.0");
// }
//
// /*@Autowired
// MongoTemplate mongoTemplate;*/
// @Autowired
// OrderRepository orderRepository;
//
// @BeforeEach
// public void setup() throws IOException {
//
// // mongoTemplate.getCollection("orders").drop();
// //mongoTemplate.insert(new User("23563456", "01", "samab12344","sarika@123456","1"));
// //mongoTemplate.insert(new Order("2356781", "01", "1","ooppo122356","oppo123456","sucess"));
//
// }
//
// @Test
// public void testGetOrders(@Autowired MongoTemplate mongoTemplate) {
// mongoTemplate.getCollection("orders").drop();
// Flux<Order> result = orderRepository.findAll();
// mongoTemplate.insert(new Order("2356781", "01", "1","ooppo122356","oppo123456","sucess"));
// mongoTemplate.insert(new Order("2356782", "02", "2","ooppo122356","oppo123456","sucess"));
// StepVerifier.create(result)
// .expectNextMatches(order -> order.getUserId().equals("1"))
// .expectNextMatches(o -> o.getUserId().equals("2"))
// .expectComplete()
// .verify();
// }
//
//}
package com.nisum.webfluxmongodbordermanagement.service;
import com.nisum.webfluxmongodbordermanagement.config.KafkaProducer;
import com.nisum.webfluxmongodbordermanagement.entity.Order;
import com.nisum.webfluxmongodbordermanagement.entity.User;
import com.nisum.webfluxmongodbordermanagement.repository.OrderRepository;
......@@ -15,6 +16,8 @@ import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
import reactor.core.publisher.Flux;
import reactor.test.StepVerifier;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.when;
public class OrdersServiceTest {
......@@ -26,12 +29,13 @@ public class OrdersServiceTest {
@InjectMocks
OrdersService ordersService;
@Mock
KafkaProducer kafkaProducer;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
MockitoAnnotations.initMocks(this);
}
......@@ -41,9 +45,9 @@ public class OrdersServiceTest {
Order order1 = new Order("1123v34","1", "1","oppo123445", "oppo123", "success");
Order order2 = new Order("112345","2", "1","vivo123445", "vivo123", "success");
when(orderRepository.findAll()).thenReturn(Flux.just(order1, order2));
doNothing().when(kafkaProducer).sendMessage(anyString(),anyString(),anyString());
// Call the method
Flux<Order> result = ordersService.getOrders();
Flux<Order> result = ordersService.fetchOrdersAndPublish();
// Verify the output
StepVerifier.create(result)
......
package com.nisum.webfluxmongodbordermanagement.service;
import com.nisum.webfluxmongodbordermanagement.config.KafkaProducer;
import com.nisum.webfluxmongodbordermanagement.entity.User;
import com.nisum.webfluxmongodbordermanagement.repository.UserRepository;
import org.junit.jupiter.api.BeforeEach;
......@@ -13,6 +14,8 @@ import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
import reactor.core.publisher.Flux;
import reactor.test.StepVerifier;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.when;
class UserServiceTest {
......@@ -25,23 +28,27 @@ class UserServiceTest {
@InjectMocks
UserService userService;
@Mock
KafkaProducer kafkaProducer;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
MockitoAnnotations.initMocks(this);
}
@Test
@DisplayName("get all users ")
void getAllUsers() {
User user1 = new User("1","01", "John", "john@example.com", "order1");
User user2 = new User("2","02","Jane", "jane@example.com", "order2");
User user1 = new User("1","01", "John", "john@example.com");
User user2 = new User("2","02","Jane", "jane@example.com");
when(userRepository.findAll()).thenReturn(Flux.just(user1, user2));
doNothing().when(kafkaProducer).sendMessage(anyString(),anyString(),anyString());
// Call the method
Flux<User> result = userService.getUsers();
Flux<User> result = userService.fetchUsersAndPublish();
// Verify the output
StepVerifier.create(result)
......
//package com.nisum.webfluxmongodbordermanagement.service;
//
//import com.nisum.webfluxmongodbordermanagement.entity.Order;
//import com.nisum.webfluxmongodbordermanagement.entity.User;
//import com.nisum.webfluxmongodbordermanagement.entity.UserOrders;
//import com.nisum.webfluxmongodbordermanagement.repository.UserRepository;
//import org.junit.jupiter.api.BeforeEach;
//import org.junit.jupiter.api.Test;
//import org.junit.jupiter.api.extension.ExtendWith;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
//import org.springframework.data.mongodb.core.MongoTemplate;
//import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
//import org.springframework.test.context.ActiveProfiles;
//import org.springframework.test.context.junit.jupiter.SpringExtension;
//import reactor.core.publisher.Flux;
//import reactor.test.StepVerifier;
//
//import java.io.IOException;
//
//
//@DataMongoTest
//@ExtendWith(SpringExtension.class)
//@ActiveProfiles("test")
//public class UsersOrderServiceIntTest {
//
// static {
// System.setProperty("spring.mongodb.embedded.version","5.0.0");
// }
//
// UserOrdersService userOrdersService;
//
// @Autowired
// private ReactiveMongoTemplate reactiveMongoTemplate;
//
// @Autowired
// MongoTemplate mongoTemplate;
// @Autowired
// UserRepository userRepository;
//
// @BeforeEach
// public void setup() throws IOException {
// userOrdersService = new UserOrdersService();
// userOrdersService.reactiveMongoTemplate = reactiveMongoTemplate;
// mongoTemplate.getCollection("user").drop();
// mongoTemplate.getCollection("orders").drop();
//
// //mongoTemplate.insert(new User("23563456", "01", "samab12344","sarika@123456","1"));
// mongoTemplate.insert(new Order("2356781", "01", "user1","ooppo122356","oppo123456","sucess"));
// mongoTemplate.insert(new Order("2356782", "02", "user1","vivo122356","vivo123456","sucess"));
// mongoTemplate.insert(new Order("2356783", "03", "user2","sam122356","sam123456","sucess"));
//
// mongoTemplate.insert(new User("2356781", "user1", "sarika","sarika@123456"));
// mongoTemplate.insert(new User("2356782", "user2", "sama","sama@123456"));
// mongoTemplate.insert(new User("2356783", "user3", "samasarika","sama@123456"));
//
//
//
// }
//
//
// @Test
// public void testGetUsers(@Autowired MongoTemplate mongoTemplate) {
//
// // Flux<User> result = userRepository.findAll();
// Flux<UserOrders> result = userOrdersService.getAllUsersWithOrders();
//
//
// StepVerifier.create(result)
// .expectNextMatches(uo -> uo.getUserId().equals("user1") && uo.getOrder().size()==2)
// .expectNextMatches(uo -> uo.getUserId().equals("user2") && uo.getOrder().size() == 1)
// .expectNextMatches(uo -> uo.getUserId().equals("user3") && uo.getOrder().size() == 0)
// .expectComplete()
// .verify();
// }
//
//}
//
//
//
//
//
//package com.nisum.webfluxmongodbordermanagement.service;
//
//import com.nisum.webfluxmongodbordermanagement.entity.User;
//import com.nisum.webfluxmongodbordermanagement.repository.UserRepository;
//import org.junit.jupiter.api.BeforeEach;
//import org.junit.jupiter.api.Test;
//import org.junit.jupiter.api.extension.ExtendWith;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
//import org.springframework.data.mongodb.core.MongoTemplate;
//import org.springframework.test.context.ActiveProfiles;
//import org.springframework.test.context.junit.jupiter.SpringExtension;
//import reactor.core.publisher.Flux;
//import reactor.test.StepVerifier;
//
//import java.io.IOException;
//
//
//@DataMongoTest
//@ExtendWith(SpringExtension.class)
//@ActiveProfiles("test")
//public class UsersServiceIntTest {
//
// static {
// System.setProperty("spring.mongodb.embedded.version","5.0.0");
// }
//
//
// @Autowired
// MongoTemplate mongoTemplate;
// @Autowired
// UserRepository userRepository;
//
// @BeforeEach
// public void setup() throws IOException {
//
// mongoTemplate.getCollection("user").drop();
// //mongoTemplate.insert(new User("23563456", "01", "samab12344","sarika@123456"));
// mongoTemplate.insert(new User("2356781", "01", "samasarika","sama@123456"));
//
// }
//
//
// @Test
// public void testGetUsers(@Autowired MongoTemplate mongoTemplate) {
//
// Flux<User> result = userRepository.findAll();
//
// StepVerifier.create(result)
// .expectNextMatches(user -> user.getUserId().equals("01"))
// .expectComplete()
// .verify();
// }
//
// }
//
//
server.port=9090
spring.mongodb.embedded.version=5.0.0
spring.data.mongodb.database=user-orders-test-db
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment