Skip to content

Commit bda9e28

Browse files
authored
ChatMessageService와 MentoringSessionManager 테스트 추가 (#193)
* chore : 불필요한 주석 제거 * Test/Chore : 유효성 검증 추가 및 테스트 추가 * Test/Feat : 유효성 검증 추가 및 테스트 추가 * Test : 테스트 추가
1 parent 36f14e4 commit bda9e28

File tree

5 files changed

+408
-2
lines changed

5 files changed

+408
-2
lines changed

back/src/main/java/com/back/domain/mentoring/session/entity/ChatMessage.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,39 @@ private ChatMessage(MentoringSession mentoringSession, Member sender, SenderRole
4646
}
4747

4848
public static ChatMessage create(MentoringSession mentoringSession, Member sender, SenderRole senderRole, String content, MessageType type) {
49+
if (mentoringSession == null) {
50+
throw new IllegalArgumentException("MentoringSession은 null일 수 없습니다.");
51+
}
52+
if (content == null || content.isBlank()) {
53+
throw new IllegalArgumentException("Content는 null이거나 비어 있을 수 없습니다.");
54+
}
55+
if (type == null) {
56+
throw new IllegalArgumentException("MessageType은 null일 수 없습니다.");
57+
}
58+
59+
if (type == MessageType.SYSTEM) {
60+
if (sender != null) {
61+
throw new IllegalArgumentException("시스템 메시지의 sender는 null이어야 합니다.");
62+
}
63+
if (senderRole != SenderRole.SYSTEM) {
64+
throw new IllegalArgumentException("시스템 메시지의 senderRole은 SYSTEM이어야 합니다.");
65+
}
66+
} else { // TEXT, IMAGE, FILE
67+
if (sender == null) {
68+
throw new IllegalArgumentException("일반 메시지의 sender는 null일 수 없습니다.");
69+
}
70+
if (senderRole != SenderRole.MENTOR && senderRole != SenderRole.MENTEE) {
71+
throw new IllegalArgumentException("일반 메시지의 senderRole은 MENTOR 또는 MENTEE여야 합니다.");
72+
}
73+
74+
boolean isParticipant = (mentoringSession.getReservation().getMentor().isMember(sender) ||
75+
mentoringSession.getReservation().getMentee().isMember(sender));
76+
77+
if (!isParticipant) {
78+
throw new IllegalArgumentException("메시지 발신자는 해당 멘토링 세션의 참여자가 아닙니다.");
79+
}
80+
}
81+
4982
return ChatMessage.builder()
5083
.mentoringSession(mentoringSession)
5184
.sender(sender)

back/src/main/java/com/back/domain/mentoring/session/entity/MentoringSession.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ public class MentoringSession extends BaseEntity {
3434
@OneToMany(mappedBy = "mentoringSession", cascade = CascadeType.ALL)
3535
private List<ChatMessage> chatMessages = new ArrayList<>();
3636

37-
// 화면 공유, WebRTC 관련 필드 등 추가 가능
38-
3937
@Builder(access = AccessLevel.PRIVATE)
4038
private MentoringSession(Reservation reservation) {
4139
this.sessionUrl = java.util.UUID.randomUUID().toString();
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
package com.back.domain.mentoring.session.entity;
2+
3+
4+
import com.back.domain.member.member.entity.Member;
5+
import com.back.fixture.MemberFixture;
6+
import com.back.fixture.mentoring.MentoringSessionFixture;
7+
import org.junit.jupiter.api.DisplayName;
8+
import org.junit.jupiter.api.Nested;
9+
import org.junit.jupiter.api.Test;
10+
11+
import java.time.LocalDateTime;
12+
13+
import static org.assertj.core.api.Assertions.assertThat;
14+
import static org.junit.jupiter.api.Assertions.assertThrows;
15+
16+
class ChatMessageTest {
17+
@Test
18+
@DisplayName("ChatMessage 생성 테스트")
19+
void createChatMessageTest() {
20+
// given
21+
MentoringSession session = MentoringSessionFixture.createDefault();
22+
Member sender = session.getReservation().getMentor().getMember();
23+
String content = "Hello world";
24+
SenderRole senderRole = SenderRole.MENTOR;
25+
MessageType type = MessageType.TEXT;
26+
27+
// when
28+
ChatMessage message = ChatMessage.create(session, sender, senderRole, content, type);
29+
30+
// then
31+
assertThat(message.getMentoringSession()).isEqualTo(session);
32+
assertThat(message.getSender()).isEqualTo(sender);
33+
assertThat(message.getSenderRole()).isEqualTo(senderRole);
34+
assertThat(message.getContent()).isEqualTo(content);
35+
assertThat(message.getType()).isEqualTo(type);
36+
assertThat(message.getTimestamp()).isNotNull();
37+
assertThat(message.getTimestamp()).isBeforeOrEqualTo(LocalDateTime.now());
38+
}
39+
40+
@Test
41+
@DisplayName("시스템 메시지 생성 테스트")
42+
void createSystemMessageTest() {
43+
// given
44+
MentoringSession session = MentoringSessionFixture.createDefault();
45+
String content = "멘토링 세션이 시작되었습니다.";
46+
MessageType type = MessageType.SYSTEM;
47+
SenderRole senderRole = SenderRole.SYSTEM;
48+
Member sender = null; // 시스템 메시지는 발신자가 없을 수 있습니다.
49+
50+
// when
51+
ChatMessage message = ChatMessage.create(session, sender, senderRole, content, type);
52+
53+
// then
54+
assertThat(message.getMentoringSession()).isEqualTo(session);
55+
assertThat(message.getSender()).isNull();
56+
assertThat(message.getSenderRole()).isEqualTo(senderRole);
57+
assertThat(message.getContent()).isEqualTo(content);
58+
assertThat(message.getType()).isEqualTo(type);
59+
assertThat(message.getTimestamp()).isNotNull();
60+
assertThat(message.getTimestamp()).isBeforeOrEqualTo(LocalDateTime.now());
61+
}
62+
63+
@Nested
64+
@DisplayName("ChatMessage 생성 유효성 검증")
65+
class ValidationTests {
66+
67+
@Test
68+
@DisplayName("MentoringSession이 null이면 예외가 발생한다")
69+
void createWithNullSession_shouldThrowException() {
70+
assertThrows(IllegalArgumentException.class, () ->
71+
ChatMessage.create(null, MemberFixture.createDefault(), SenderRole.MENTOR, "message", MessageType.TEXT));
72+
}
73+
74+
@Test
75+
@DisplayName("Content가 null이면 예외가 발생한다")
76+
void createWithNullContent_shouldThrowException() {
77+
assertThrows(IllegalArgumentException.class, () ->
78+
ChatMessage.create(MentoringSessionFixture.createDefault(), MemberFixture.createDefault(), SenderRole.MENTOR, null, MessageType.TEXT));
79+
}
80+
81+
@Test
82+
@DisplayName("Content가 비어있으면 예외가 발생한다")
83+
void createWithBlankContent_shouldThrowException() {
84+
assertThrows(IllegalArgumentException.class, () ->
85+
ChatMessage.create(MentoringSessionFixture.createDefault(), MemberFixture.createDefault(), SenderRole.MENTOR, " ", MessageType.TEXT));
86+
}
87+
88+
@Test
89+
@DisplayName("MessageType이 null이면 예외가 발생한다")
90+
void createWithNullType_shouldThrowException() {
91+
assertThrows(IllegalArgumentException.class, () ->
92+
ChatMessage.create(MentoringSessionFixture.createDefault(), MemberFixture.createDefault(), SenderRole.MENTOR, "message", null));
93+
}
94+
95+
@Test
96+
@DisplayName("시스템 메시지에 sender가 있으면 예외가 발생한다")
97+
void createSystemMessageWithSender_shouldThrowException() {
98+
assertThrows(IllegalArgumentException.class, () ->
99+
ChatMessage.create(MentoringSessionFixture.createDefault(), MemberFixture.createDefault(), SenderRole.SYSTEM, "system message", MessageType.SYSTEM));
100+
}
101+
102+
@Test
103+
@DisplayName("시스템 메시지의 senderRole이 SYSTEM이 아니면 예외가 발생한다")
104+
void createSystemMessageWithInvalidRole_shouldThrowException() {
105+
assertThrows(IllegalArgumentException.class, () ->
106+
ChatMessage.create(MentoringSessionFixture.createDefault(), null, SenderRole.MENTOR, "system message", MessageType.SYSTEM));
107+
}
108+
109+
@Test
110+
@DisplayName("일반 메시지에 sender가 없으면 예외가 발생한다")
111+
void createUserMessageWithNullSender_shouldThrowException() {
112+
assertThrows(IllegalArgumentException.class, () ->
113+
ChatMessage.create(MentoringSessionFixture.createDefault(), null, SenderRole.MENTOR, "user message", MessageType.TEXT));
114+
}
115+
116+
@Test
117+
@DisplayName("일반 메시지의 senderRole이 MENTOR나 MENTEE가 아니면 예외가 발생한다")
118+
void createUserMessageWithInvalidRole_shouldThrowException() {
119+
assertThrows(IllegalArgumentException.class, () ->
120+
ChatMessage.create(MentoringSessionFixture.createDefault(), MemberFixture.createDefault(), SenderRole.SYSTEM, "user message", MessageType.TEXT));
121+
}
122+
123+
@Test
124+
@DisplayName("메시지 발신자가 멘토링 참여자가 아니면 예외가 발생한다")
125+
void createWithNonParticipantSender_shouldThrowException() {
126+
// given
127+
MentoringSession session = MentoringSessionFixture.createDefault();
128+
Member nonParticipant = MemberFixture.create(99L, "[email protected]", "외부인", "password", Member.Role.MENTEE);
129+
130+
// when & then
131+
IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () ->
132+
ChatMessage.create(session, nonParticipant, SenderRole.MENTOR, "some message", MessageType.TEXT));
133+
134+
assertThat(exception.getMessage()).isEqualTo("메시지 발신자는 해당 멘토링 세션의 참여자가 아닙니다.");
135+
}
136+
}
137+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package com.back.domain.mentoring.session.service;
2+
3+
import com.back.domain.member.member.entity.Member;
4+
import com.back.domain.member.mentee.entity.Mentee;
5+
import com.back.domain.mentoring.reservation.entity.Reservation;
6+
import com.back.domain.mentoring.session.dto.ChatMessageRequest;
7+
import com.back.domain.mentoring.session.dto.ChatMessageResponse;
8+
import com.back.domain.mentoring.session.entity.ChatMessage;
9+
import com.back.domain.mentoring.session.entity.MentoringSession;
10+
import com.back.domain.mentoring.session.entity.MessageType;
11+
import com.back.domain.mentoring.session.repository.ChatMessageRepository;
12+
import com.back.fixture.MemberFixture;
13+
import com.back.fixture.MenteeFixture;
14+
import com.back.fixture.mentoring.MentoringSessionFixture;
15+
import com.back.fixture.mentoring.ReservationFixture;
16+
import org.junit.jupiter.api.BeforeEach;
17+
import org.junit.jupiter.api.DisplayName;
18+
import org.junit.jupiter.api.Test;
19+
import org.junit.jupiter.api.extension.ExtendWith;
20+
import org.mockito.InjectMocks;
21+
import org.mockito.Mock;
22+
import org.mockito.junit.jupiter.MockitoExtension;
23+
24+
import static org.assertj.core.api.Assertions.assertThat;
25+
import static org.mockito.ArgumentMatchers.any;
26+
import static org.mockito.BDDMockito.given;
27+
import static org.mockito.Mockito.verify;
28+
29+
@ExtendWith(MockitoExtension.class)
30+
class ChatMessageServiceTest {
31+
32+
@Mock
33+
private ChatMessageRepository chatMessageRepository;
34+
35+
@InjectMocks
36+
private ChatMessageService chatMessageService;
37+
38+
private Member menteeMember;
39+
private MentoringSession mentoringSession;
40+
41+
@BeforeEach
42+
void setUp() {
43+
// Reservation에 포함된 실제 멘티 멤버를 가져와서 사용
44+
Reservation reservation = ReservationFixture.createDefault();
45+
menteeMember = reservation.getMentee().getMember();
46+
mentoringSession = MentoringSessionFixture.create(reservation);
47+
}
48+
49+
@Test
50+
@DisplayName("채팅 메시지를 생성하고 저장한다.")
51+
void createAndSaveChatMessage() {
52+
// given
53+
String content = "안녕하세요!";
54+
MessageType messageType = MessageType.TEXT;
55+
ChatMessage chatMessage = ChatMessage.create(mentoringSession, menteeMember, menteeMember.getRole() == Member.Role.MENTOR ? com.back.domain.mentoring.session.entity.SenderRole.MENTOR : com.back.domain.mentoring.session.entity.SenderRole.MENTEE, content, messageType);
56+
given(chatMessageRepository.save(any(ChatMessage.class))).willReturn(chatMessage);
57+
58+
// when
59+
ChatMessage result = chatMessageService.create(mentoringSession, menteeMember, content, messageType);
60+
61+
// then
62+
assertThat(result).isNotNull();
63+
assertThat(result.getContent()).isEqualTo(content);
64+
assertThat(result.getSender()).isEqualTo(menteeMember);
65+
verify(chatMessageRepository).save(any(ChatMessage.class));
66+
}
67+
68+
@Test
69+
@DisplayName("채팅 메시지를 저장하고 처리하여 응답 DTO를 반환한다.")
70+
void saveAndProcessMessage_returnsResponseDTO() {
71+
// given
72+
ChatMessageRequest request = new ChatMessageRequest(MessageType.TEXT, "테스트 메시지");
73+
ChatMessage chatMessage = ChatMessage.create(mentoringSession, menteeMember, menteeMember.getRole() == Member.Role.MENTOR ? com.back.domain.mentoring.session.entity.SenderRole.MENTOR : com.back.domain.mentoring.session.entity.SenderRole.MENTEE, request.content(), request.type());
74+
75+
given(chatMessageRepository.save(any(ChatMessage.class))).willReturn(chatMessage);
76+
77+
// when
78+
ChatMessageResponse response = chatMessageService.saveAndProcessMessage(menteeMember, mentoringSession, request);
79+
80+
// then
81+
assertThat(response).isNotNull();
82+
assertThat(response.senderName()).isEqualTo(menteeMember.getNickname());
83+
assertThat(response.content()).isEqualTo(request.content());
84+
assertThat(response.createdAt()).isEqualTo(chatMessage.getTimestamp());
85+
}
86+
}

0 commit comments

Comments
 (0)