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+ }
0 commit comments