From 4fbf90d41571ca11d1d91168c58c83a9d074cd0d Mon Sep 17 00:00:00 2001 From: bum12ark Date: Thu, 17 Mar 2022 11:17:47 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat(notification):=20Kafka=20Consumer=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=A0=95=EB=B3=B4=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=EC=A3=BC=EB=AC=B8=20=EC=8B=A0=EC=B2=AD=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Kafka Consumer 설정 클래스 생성 - 고객의 주문이 신청완료 이벤트 수신부 구현 - 주문 신청 완료 시 알림 저장 --- notification-service/build.gradle | 2 +- .../messagequeue/NotificationConsumer.java | 45 ++++++++++++++ .../messagequeue/OrderStatus.java | 5 ++ .../service/NotificationService.java | 1 + .../service/NotificationServiceImpl.java | 11 ++++ .../global/config/KafkaConsumerConfig.java | 58 +++++++++++++++++++ .../global/entity/BaseEntity.java | 1 + 7 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/NotificationConsumer.java create mode 100644 notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/OrderStatus.java create mode 100644 notification-service/src/main/java/com/justpickup/notificationservice/global/config/KafkaConsumerConfig.java diff --git a/notification-service/build.gradle b/notification-service/build.gradle index a037440..a52e095 100644 --- a/notification-service/build.gradle +++ b/notification-service/build.gradle @@ -35,7 +35,7 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' /*implementation 'org.springframework.boot:spring-boot-starter-amqp'*/ implementation 'org.springframework.cloud:spring-cloud-starter-config' - /*implementation 'org.springframework.kafka:spring-kafka'*/ + implementation 'org.springframework.kafka:spring-kafka' // https://mvnrepository.com/artifact/com.github.gavlyukovskiy/p6spy-spring-boot-starter implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0' diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/NotificationConsumer.java b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/NotificationConsumer.java new file mode 100644 index 0000000..8de66d7 --- /dev/null +++ b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/NotificationConsumer.java @@ -0,0 +1,45 @@ +package com.justpickup.notificationservice.domain.notification.messagequeue; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.justpickup.notificationservice.domain.notification.service.NotificationService; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + +@Component +@Transactional(readOnly = true) +@RequiredArgsConstructor +@Slf4j +public class NotificationConsumer { + + private final ObjectMapper objectMapper; + private final NotificationService notificationService; + + @KafkaListener(topics = "orderApply") + public void applyOrder(String kafkaMessage) throws JsonProcessingException { + log.debug("## NotificationConsumer.applyOrder"); + log.debug("#### kafka Message = {}", kafkaMessage); + + KafkaSendOrderDto kafkaSendOrderDto = objectMapper.readValue(kafkaMessage, KafkaSendOrderDto.class); + + + } + + @Data + static class KafkaSendOrderDto { + private Long id; + private Long userId; + private Long userCouponId; + private Long storeId; + private long orderPrice; + private LocalDateTime orderTime; + private long usedPoint; + private OrderStatus orderStatus; + } +} diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/OrderStatus.java b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/OrderStatus.java new file mode 100644 index 0000000..7832b37 --- /dev/null +++ b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/OrderStatus.java @@ -0,0 +1,5 @@ +package com.justpickup.notificationservice.domain.notification.messagequeue; + +public enum OrderStatus { + +} diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationService.java b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationService.java index 3d35ecb..2e462e5 100644 --- a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationService.java +++ b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationService.java @@ -10,4 +10,5 @@ public interface NotificationService { List findNotificationByUserId(Long id); void updateNotification(UpdateNotificationDto dto); Long findNotificationCounts(Long userId, Yn readYn); + void insertOrderPlaced(Long userId); } diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationServiceImpl.java b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationServiceImpl.java index 5c7d6de..75abd11 100644 --- a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationServiceImpl.java +++ b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationServiceImpl.java @@ -49,4 +49,15 @@ public class NotificationServiceImpl implements NotificationService { public Long findNotificationCounts(Long userId, Yn readYn) { return notificationRepository.countByUserIdAndReadYn(userId, readYn); } + + @Transactional + @Override + public void insertOrderPlaced(Long userId) { + String title = "주문이 수락되었어요."; + String storeName = "[]"; + String message = storeName + "매장의 주문이 수락되었습니다."; + Notification notification = Notification.of(userId, message, title); + + notificationRepository.save(notification); + } } diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/global/config/KafkaConsumerConfig.java b/notification-service/src/main/java/com/justpickup/notificationservice/global/config/KafkaConsumerConfig.java new file mode 100644 index 0000000..2216365 --- /dev/null +++ b/notification-service/src/main/java/com/justpickup/notificationservice/global/config/KafkaConsumerConfig.java @@ -0,0 +1,58 @@ +package com.justpickup.notificationservice.global.config; + +import lombok.RequiredArgsConstructor; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.springframework.beans.factory.annotation.Value; +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.listener.DefaultErrorHandler; + +import java.util.*; + +@EnableKafka +@RequiredArgsConstructor +@Configuration +public class KafkaConsumerConfig { + + @Value("${kafka.host}") + private final String host; + + @Value("${kafka.port}") + private final String port; + + @Bean + public ConsumerFactory consumerFactory() { + Map properties = new HashMap<>(); + + String ipAddress = host + ":" + port; + + properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, ipAddress); + properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + + return new DefaultKafkaConsumerFactory<>(properties); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory() { + ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory + = new ConcurrentKafkaListenerContainerFactory<>(); + + kafkaListenerContainerFactory.setConsumerFactory(consumerFactory()); + kafkaListenerContainerFactory.setCommonErrorHandler(errorHandler()); + + return kafkaListenerContainerFactory; + } + + @Bean + public DefaultErrorHandler errorHandler() { + DefaultErrorHandler handler = new DefaultErrorHandler(); +// handler.addNotRetryableExceptions(); + return handler; + } +} diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/global/entity/BaseEntity.java b/notification-service/src/main/java/com/justpickup/notificationservice/global/entity/BaseEntity.java index f27ba47..3d4737a 100644 --- a/notification-service/src/main/java/com/justpickup/notificationservice/global/entity/BaseEntity.java +++ b/notification-service/src/main/java/com/justpickup/notificationservice/global/entity/BaseEntity.java @@ -4,6 +4,7 @@ package com.justpickup.notificationservice.global.entity; import lombok.Getter; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; +import org.springframework.data.annotation.CreatedBy; import javax.persistence.MappedSuperclass; import java.time.LocalDateTime; From 867bdbeb5bed9f2e1a75a3838402efc93c27108b Mon Sep 17 00:00:00 2001 From: bum12ark Date: Thu, 17 Mar 2022 11:43:59 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat(notification):=20Feign=20=ED=81=B4?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EC=96=B8=ED=8A=B8=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=A3=BC=EB=AC=B8=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EA=B0=80=EC=A0=B8=EC=98=A4=EA=B8=B0=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NotificationServiceApplication.java | 4 +++- .../messagequeue/OrderStatus.java | 19 ++++++++++++++++++- .../service/NotificationService.java | 2 +- .../service/NotificationServiceImpl.java | 14 +++++++++----- .../global/client/store/GetStoreResponse.java | 10 ++++++++++ .../global/client/store/StoreClient.java | 13 +++++++++++++ .../global/config/FeignClientConfig.java | 14 ++++++++++++++ 7 files changed, 68 insertions(+), 8 deletions(-) create mode 100644 notification-service/src/main/java/com/justpickup/notificationservice/global/client/store/GetStoreResponse.java create mode 100644 notification-service/src/main/java/com/justpickup/notificationservice/global/client/store/StoreClient.java create mode 100644 notification-service/src/main/java/com/justpickup/notificationservice/global/config/FeignClientConfig.java diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/NotificationServiceApplication.java b/notification-service/src/main/java/com/justpickup/notificationservice/NotificationServiceApplication.java index d926c85..2c8c7d4 100644 --- a/notification-service/src/main/java/com/justpickup/notificationservice/NotificationServiceApplication.java +++ b/notification-service/src/main/java/com/justpickup/notificationservice/NotificationServiceApplication.java @@ -3,9 +3,11 @@ package com.justpickup.notificationservice; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.cloud.openfeign.EnableFeignClients; -@SpringBootApplication @EnableEurekaClient +@EnableFeignClients +@SpringBootApplication public class NotificationServiceApplication { public static void main(String[] args) { diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/OrderStatus.java b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/OrderStatus.java index 7832b37..49acc9d 100644 --- a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/OrderStatus.java +++ b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/OrderStatus.java @@ -1,5 +1,22 @@ package com.justpickup.notificationservice.domain.notification.messagequeue; -public enum OrderStatus { +import lombok.Getter; +// 주문 대기 -> 주문 신청 --> 주문수락 -> 픽업대기 -> 픽업완료 +// \ +// ㄴ> 주문거절 +@Getter +public enum OrderStatus { + PENDING("주문대기(장바구니)"), + PLACED("주문신청"), + ACCEPTED("주문수락"), + REJECTED("주문거절"), + WAITING("픽업대기"), + FINISHED("픽업완료"); + + private String message; + + OrderStatus(String message) { + this.message = message; + } } diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationService.java b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationService.java index 2e462e5..bd86fec 100644 --- a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationService.java +++ b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationService.java @@ -10,5 +10,5 @@ public interface NotificationService { List findNotificationByUserId(Long id); void updateNotification(UpdateNotificationDto dto); Long findNotificationCounts(Long userId, Yn readYn); - void insertOrderPlaced(Long userId); + void insertOrderPlaced(Long userId, Long storeId); } diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationServiceImpl.java b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationServiceImpl.java index 75abd11..ae0391b 100644 --- a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationServiceImpl.java +++ b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationServiceImpl.java @@ -5,6 +5,8 @@ import com.justpickup.notificationservice.domain.notification.dto.UpdateNotifica import com.justpickup.notificationservice.domain.notification.entity.Notification; import com.justpickup.notificationservice.domain.notification.exception.NotExistNotification; import com.justpickup.notificationservice.domain.notification.repository.NotificationRepository; +import com.justpickup.notificationservice.global.client.store.GetStoreResponse; +import com.justpickup.notificationservice.global.client.store.StoreClient; import com.justpickup.notificationservice.global.dto.Yn; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Sort; @@ -21,6 +23,7 @@ import java.util.stream.Collectors; public class NotificationServiceImpl implements NotificationService { private final NotificationRepository notificationRepository; + private final StoreClient storeClient; @Override public List findNotificationByUserId(Long userId) { @@ -52,12 +55,13 @@ public class NotificationServiceImpl implements NotificationService { @Transactional @Override - public void insertOrderPlaced(Long userId) { - String title = "주문이 수락되었어요."; - String storeName = "[]"; - String message = storeName + "매장의 주문이 수락되었습니다."; - Notification notification = Notification.of(userId, message, title); + public void insertOrderPlaced(Long userId, Long storeId) { + GetStoreResponse storeResponse = storeClient.getStore(String.valueOf(storeId)).getData(); + String title = "주문이 신청되었어요."; + String storeName = "[" + storeResponse.getName() + "]"; + String message = storeName + "매장의 주문이 신청되었습니다."; + Notification notification = Notification.of(userId, message, title); notificationRepository.save(notification); } } diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/global/client/store/GetStoreResponse.java b/notification-service/src/main/java/com/justpickup/notificationservice/global/client/store/GetStoreResponse.java new file mode 100644 index 0000000..944589d --- /dev/null +++ b/notification-service/src/main/java/com/justpickup/notificationservice/global/client/store/GetStoreResponse.java @@ -0,0 +1,10 @@ +package com.justpickup.notificationservice.global.client.store; + +import lombok.Getter; + +@Getter +public class GetStoreResponse { + private Long id; + private String name; + private String phoneNumber; +} diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/global/client/store/StoreClient.java b/notification-service/src/main/java/com/justpickup/notificationservice/global/client/store/StoreClient.java new file mode 100644 index 0000000..a8a8dc8 --- /dev/null +++ b/notification-service/src/main/java/com/justpickup/notificationservice/global/client/store/StoreClient.java @@ -0,0 +1,13 @@ +package com.justpickup.notificationservice.global.client.store; + +import com.justpickup.notificationservice.global.dto.Result; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +@FeignClient("STORE-SERVICE") +public interface StoreClient { + + @GetMapping("/store/{storeId}") + Result getStore(@PathVariable(value = "storeId") String storeId); +} diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/global/config/FeignClientConfig.java b/notification-service/src/main/java/com/justpickup/notificationservice/global/config/FeignClientConfig.java new file mode 100644 index 0000000..f06636f --- /dev/null +++ b/notification-service/src/main/java/com/justpickup/notificationservice/global/config/FeignClientConfig.java @@ -0,0 +1,14 @@ +package com.justpickup.notificationservice.global.config; + +import feign.Logger; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class FeignClientConfig { + + @Bean + public Logger.Level feignLoggerLevel() { + return Logger.Level.FULL; + } +} From eb63c4eafa7b422430ecd6bb0900560601b97a40 Mon Sep 17 00:00:00 2001 From: bum12ark Date: Thu, 17 Mar 2022 12:03:07 +0900 Subject: [PATCH 3/3] =?UTF-8?q?test(notification):=20orderPlaced=20Kafka?= =?UTF-8?q?=20Consumer=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../messagequeue/NotificationConsumer.java | 25 ++++- .../NotificationConsumerTest.java | 101 ++++++++++++++++++ .../web/NotificationControllerTest.java | 2 +- 3 files changed, 122 insertions(+), 6 deletions(-) create mode 100644 notification-service/src/test/java/com/justpickup/notificationservice/domain/notification/messagequeue/NotificationConsumerTest.java diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/NotificationConsumer.java b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/NotificationConsumer.java index 8de66d7..831a5f8 100644 --- a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/NotificationConsumer.java +++ b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/NotificationConsumer.java @@ -3,7 +3,9 @@ package com.justpickup.notificationservice.domain.notification.messagequeue; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.justpickup.notificationservice.domain.notification.service.NotificationService; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.kafka.annotation.KafkaListener; @@ -21,17 +23,17 @@ public class NotificationConsumer { private final ObjectMapper objectMapper; private final NotificationService notificationService; - @KafkaListener(topics = "orderApply") - public void applyOrder(String kafkaMessage) throws JsonProcessingException { - log.debug("## NotificationConsumer.applyOrder"); + @KafkaListener(topics = "orderPlaced") + public void orderPlaced(String kafkaMessage) throws JsonProcessingException { + log.debug("## NotificationConsumer.orderPlaced"); log.debug("#### kafka Message = {}", kafkaMessage); KafkaSendOrderDto kafkaSendOrderDto = objectMapper.readValue(kafkaMessage, KafkaSendOrderDto.class); - + notificationService.insertOrderPlaced(kafkaSendOrderDto.getUserId(), kafkaSendOrderDto.getStoreId()); } - @Data + @Data @NoArgsConstructor static class KafkaSendOrderDto { private Long id; private Long userId; @@ -41,5 +43,18 @@ public class NotificationConsumer { private LocalDateTime orderTime; private long usedPoint; private OrderStatus orderStatus; + + @Builder + public KafkaSendOrderDto(Long id, Long userId, Long userCouponId, Long storeId, + long orderPrice, LocalDateTime orderTime, long usedPoint, OrderStatus orderStatus) { + this.id = id; + this.userId = userId; + this.userCouponId = userCouponId; + this.storeId = storeId; + this.orderPrice = orderPrice; + this.orderTime = orderTime; + this.usedPoint = usedPoint; + this.orderStatus = orderStatus; + } } } diff --git a/notification-service/src/test/java/com/justpickup/notificationservice/domain/notification/messagequeue/NotificationConsumerTest.java b/notification-service/src/test/java/com/justpickup/notificationservice/domain/notification/messagequeue/NotificationConsumerTest.java new file mode 100644 index 0000000..c36532c --- /dev/null +++ b/notification-service/src/test/java/com/justpickup/notificationservice/domain/notification/messagequeue/NotificationConsumerTest.java @@ -0,0 +1,101 @@ +package com.justpickup.notificationservice.domain.notification.messagequeue; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.kafka.annotation.EnableKafka; +import org.springframework.kafka.core.DefaultKafkaConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaProducerFactory; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.support.SendResult; +import org.springframework.kafka.test.EmbeddedKafkaBroker; +import org.springframework.kafka.test.context.EmbeddedKafka; +import org.springframework.kafka.test.utils.KafkaTestUtils; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.util.concurrent.ListenableFuture; + + +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith(SpringExtension.class) +@EnableKafka +@DirtiesContext +@EmbeddedKafka +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +class NotificationConsumerTest { + + private final String ORDER_TOPIC = "orderPlaced"; + + private Consumer consumer; + private KafkaTemplate producer; + + @Autowired + EmbeddedKafkaBroker embeddedKafkaBroker; + + @BeforeEach + void setUp() { + producer = configureProducer(); + consumer = configureConsumer(); + } + + private Consumer configureConsumer() { + Map consumerProps = KafkaTestUtils.consumerProps("testGroup", "true", embeddedKafkaBroker); + consumerProps.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); + Consumer consumer = new DefaultKafkaConsumerFactory(consumerProps) + .createConsumer(); + consumer.subscribe(Collections.singleton(ORDER_TOPIC)); + return consumer; + } + + + private KafkaTemplate configureProducer() { + Map producerProps = new HashMap<>(KafkaTestUtils.producerProps(embeddedKafkaBroker)); + return new KafkaTemplate <>( new DefaultKafkaProducerFactory<>(producerProps)); + } + + @Test + @DisplayName("주문 신청") + void orderPlaced() throws JsonProcessingException { + // GIVEN + ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule()); + NotificationConsumer.KafkaSendOrderDto sendOrderDto + = NotificationConsumer.KafkaSendOrderDto.builder() + .id(1L) + .orderPrice(10_000L) + .orderStatus(OrderStatus.PLACED) + .orderTime(LocalDateTime.now()) + .storeId(2L) + .build(); + String sendJson = mapper.writeValueAsString(sendOrderDto); + + // THEN + ListenableFuture> orderPlaced = producer.send(ORDER_TOPIC, sendJson); + + // WHEN + ConsumerRecord singleRecord = + KafkaTestUtils.getSingleRecord(consumer, ORDER_TOPIC); + + NotificationConsumer.KafkaSendOrderDto readValue + = mapper.readValue(singleRecord.value(), NotificationConsumer.KafkaSendOrderDto.class); + + assertThat(singleRecord).isNotNull(); + assertThat(readValue.getOrderStatus()).isEqualTo(OrderStatus.PLACED); + assertThat(readValue.getId()).isEqualTo(sendOrderDto.getId()); + } +} \ No newline at end of file diff --git a/notification-service/src/test/java/com/justpickup/notificationservice/domain/notification/web/NotificationControllerTest.java b/notification-service/src/test/java/com/justpickup/notificationservice/domain/notification/web/NotificationControllerTest.java index d2c29b3..4693cd7 100644 --- a/notification-service/src/test/java/com/justpickup/notificationservice/domain/notification/web/NotificationControllerTest.java +++ b/notification-service/src/test/java/com/justpickup/notificationservice/domain/notification/web/NotificationControllerTest.java @@ -62,7 +62,7 @@ class NotificationControllerTest { // THEN ResultActions actions - = mockMvc.perform(get(url).header("user-id", String.valueOf(userId))); + = mockMvc.perform(get("/notifications").header("user-id", String.valueOf(userId))); // WHEN actions.andExpect(status().isOk())