diff --git a/default/src/main/java/org/dfbf/soundlink/domain/alert/service/AlertService.java b/default/src/main/java/org/dfbf/soundlink/domain/alert/service/AlertService.java index a0c6bc61..6e4c3d8b 100644 --- a/default/src/main/java/org/dfbf/soundlink/domain/alert/service/AlertService.java +++ b/default/src/main/java/org/dfbf/soundlink/domain/alert/service/AlertService.java @@ -114,4 +114,9 @@ public void disconnectAlarm(Long userId) { alertRepository.delete(userId, emitterId); sseEmitter.complete(); } + + // 사용자가 온라인인지 오프라인인지 확인 (Use UserId) + public boolean isOnline(Long userId) { + return alertRepository.getEmitterId(userId).isPresent(); + } } \ No newline at end of file diff --git a/default/src/main/java/org/dfbf/soundlink/domain/chat/service/ChatRoomService.java b/default/src/main/java/org/dfbf/soundlink/domain/chat/service/ChatRoomService.java index 4f33b314..9bd5d3be 100644 --- a/default/src/main/java/org/dfbf/soundlink/domain/chat/service/ChatRoomService.java +++ b/default/src/main/java/org/dfbf/soundlink/domain/chat/service/ChatRoomService.java @@ -64,6 +64,11 @@ public ResponseResult saveRequestToRedis(Long requestUserId, Long emotionRecordI .getUser() .getUserId(); + // 사용자가 오프라인이면 202 보내고 종료 + if (!alertService.isOnline(responseUserId)) { + return new ResponseResult(ErrorCode.CHAT_REQUEST_SSE_FAILED, "Request is not sent."); + } + // 요청자와 응답자가 같은 경우 if (requestUserId.equals(responseUserId)) { return new ResponseResult(400, "You can't chat with yourself."); diff --git a/default/src/test/java/org/dfbf/soundlink/domain/chatRoom/ChatRoomServiceTest.java b/default/src/test/java/org/dfbf/soundlink/domain/chatRoom/ChatRoomServiceTest.java index 2a9424cd..f970d58f 100644 --- a/default/src/test/java/org/dfbf/soundlink/domain/chatRoom/ChatRoomServiceTest.java +++ b/default/src/test/java/org/dfbf/soundlink/domain/chatRoom/ChatRoomServiceTest.java @@ -120,6 +120,7 @@ void setUp() { @Test @DisplayName("채팅 요청: Redis에 저장 성공") void testSaveRequestToRedis_SUCCESS() { + // given when(emotionRecordRepository.findById(emotionRecordId)).thenReturn(Optional.of(emotionRecord)); // 감정 기록 조회 when(userRepository.findByUserIdWithCache(requestUserId)).thenReturn(Optional.of(requestUser)); // 요청자 정보 조회 @@ -130,6 +131,9 @@ void testSaveRequestToRedis_SUCCESS() { // when(alertService.send(eq(responseUserId), eq("alarm"), any(Alert.class))) // .thenReturn(new ResponseResult(ErrorCode.SUCCESS)); // 알림 전송 mock + // 상대방이 온라인이라고 가정.. + when(alertService.isOnline(responseUserId)).thenReturn(true); + // Redis 관련 mock 설정 ValueOperations valueOps = mock(ValueOperations.class); // ValueOperations 객체 생성 when(redisTemplate.opsForValue()).thenReturn(valueOps); // redisTemplate에서 valueOps 반환하도록 설정 @@ -171,6 +175,20 @@ void testDeleteRequestFromRedis_SUCCESS() { verify(alertService).send(responseUserId, "cancel", "Chat request has been canceled."); } + @Test + @DisplayName("상대방이 오프라인일 경우") + void testSaveRequestToRedis_Offline() { + // given + when(emotionRecordRepository.findById(emotionRecordId)).thenReturn(Optional.of(emotionRecord)); + when(alertService.isOnline(responseUserId)).thenReturn(false); // 핵심만 남김 + + // when + ResponseResult result = chatRoomService.saveRequestToRedis(requestUserId, emotionRecordId); + + // then + assertEquals(202, result.getCode()); + } + @Test @DisplayName("채팅 요청 거절") void testRequestRejected_SUCCESS() {