77import com .leets .tdd .auth .exception .AuthErrorCode ;
88import com .leets .tdd .auth .exception .AuthException ;
99import com .leets .tdd .auth .repository .EmailVerificationRepository ;
10+ import com .leets .tdd .user .domain .User ;
1011import com .leets .tdd .user .repository .UserRepository ;
1112import org .junit .jupiter .api .DisplayName ;
1213import org .junit .jupiter .api .Test ;
@@ -48,11 +49,31 @@ class EmailVerificationServiceTest {
4849 @ InjectMocks
4950 private EmailVerificationService emailVerificationService ;
5051
52+ private User existingUser () {
53+ return new User ("abcd@gachon.ac.kr" , "가나디" , "encoded-pw" ,
54+ "old-refresh-hash" , LocalDateTime .now ().plusDays (30 ));
55+ }
56+
57+ @ Test
58+ @ DisplayName ("SIGNUP 목적으로 이미 가입된(ACTIVE) 이메일이면 예외가 발생한다" )
59+ void alreadyRegisteredEmail_active () {
60+ EmailVerificationRequest request = new EmailVerificationRequest ("abcd@gachon.ac.kr" , EmailPurpose .SIGNUP );
61+ when (userRepository .findByEmail ("abcd@gachon.ac.kr" )).thenReturn (Optional .of (existingUser ()));
62+
63+ assertThatThrownBy (() -> emailVerificationService .sendVerificationCode (request ))
64+ .isInstanceOf (AuthException .class )
65+ .hasMessage (AuthErrorCode .ALREADY_REGISTERED_EMAIL .getMessage ());
66+
67+ verifyNoInteractions (mailService );
68+ }
69+
5170 @ Test
52- @ DisplayName ("SIGNUP 목적으로 이미 가입된 이메일이면 예외가 발생한다" )
53- void alreadyRegisteredEmail () {
71+ @ DisplayName ("SIGNUP 목적으로 이미 가입된(SUSPENDED) 이메일이면 예외가 발생한다" )
72+ void alreadyRegisteredEmail_suspended () {
5473 EmailVerificationRequest request = new EmailVerificationRequest ("abcd@gachon.ac.kr" , EmailPurpose .SIGNUP );
55- when (userRepository .existsByEmail ("abcd@gachon.ac.kr" )).thenReturn (true );
74+ User suspended = existingUser ();
75+ suspended .suspend (LocalDateTime .now ().plusDays (3 ));
76+ when (userRepository .findByEmail ("abcd@gachon.ac.kr" )).thenReturn (Optional .of (suspended ));
5677
5778 assertThatThrownBy (() -> emailVerificationService .sendVerificationCode (request ))
5879 .isInstanceOf (AuthException .class )
@@ -61,6 +82,64 @@ void alreadyRegisteredEmail() {
6182 verifyNoInteractions (mailService );
6283 }
6384
85+ @ Test
86+ @ DisplayName ("SIGNUP 목적으로 BANNED 계정이면 이용이 제한된 계정 예외가 발생한다" )
87+ void signup_bannedAccount_throwsAccountBanned () {
88+ EmailVerificationRequest request = new EmailVerificationRequest ("abcd@gachon.ac.kr" , EmailPurpose .SIGNUP );
89+ User banned = existingUser ();
90+ banned .ban ();
91+ when (userRepository .findByEmail ("abcd@gachon.ac.kr" )).thenReturn (Optional .of (banned ));
92+
93+ assertThatThrownBy (() -> emailVerificationService .sendVerificationCode (request ))
94+ .isInstanceOf (AuthException .class )
95+ .hasMessage (AuthErrorCode .ACCOUNT_BANNED .getMessage ());
96+
97+ verifyNoInteractions (mailService );
98+ }
99+
100+ @ Test
101+ @ DisplayName ("SIGNUP 목적으로 DELETED 계정이고 정지기간이 아직 안 지났으면 이용이 제한된 계정 예외가 발생한다" )
102+ void signup_deletedWithinSuspension_throwsAccountBanned () {
103+ EmailVerificationRequest request = new EmailVerificationRequest ("abcd@gachon.ac.kr" , EmailPurpose .SIGNUP );
104+ User deleted = existingUser ();
105+ deleted .suspend (LocalDateTime .now ().plusDays (3 ));
106+ deleted .softDelete ();
107+ when (userRepository .findByEmail ("abcd@gachon.ac.kr" )).thenReturn (Optional .of (deleted ));
108+
109+ assertThatThrownBy (() -> emailVerificationService .sendVerificationCode (request ))
110+ .isInstanceOf (AuthException .class )
111+ .hasMessage (AuthErrorCode .ACCOUNT_BANNED .getMessage ());
112+
113+ verifyNoInteractions (mailService );
114+ }
115+
116+ @ Test
117+ @ DisplayName ("SIGNUP 목적으로 DELETED 계정이고 정지기간이 지났으면 재가입으로 간주해 코드를 발송한다" )
118+ void signup_deletedAfterSuspension_sendsCode () {
119+ EmailVerificationRequest request = new EmailVerificationRequest ("abcd@gachon.ac.kr" , EmailPurpose .SIGNUP );
120+ User deleted = existingUser ();
121+ deleted .suspend (LocalDateTime .now ().minusDays (1 ));
122+ deleted .softDelete ();
123+ when (userRepository .findByEmail ("abcd@gachon.ac.kr" )).thenReturn (Optional .of (deleted ));
124+
125+ assertThatCode (() -> emailVerificationService .sendVerificationCode (request )).doesNotThrowAnyException ();
126+
127+ verify (mailService ).sendVerificationCode (eq ("abcd@gachon.ac.kr" ), anyString ());
128+ }
129+
130+ @ Test
131+ @ DisplayName ("SIGNUP 목적으로 DELETED 계정이고 정지 이력이 없으면 재가입으로 간주해 코드를 발송한다" )
132+ void signup_deletedWithoutSuspensionHistory_sendsCode () {
133+ EmailVerificationRequest request = new EmailVerificationRequest ("abcd@gachon.ac.kr" , EmailPurpose .SIGNUP );
134+ User deleted = existingUser ();
135+ deleted .softDelete ();
136+ when (userRepository .findByEmail ("abcd@gachon.ac.kr" )).thenReturn (Optional .of (deleted ));
137+
138+ assertThatCode (() -> emailVerificationService .sendVerificationCode (request )).doesNotThrowAnyException ();
139+
140+ verify (mailService ).sendVerificationCode (eq ("abcd@gachon.ac.kr" ), anyString ());
141+ }
142+
64143 @ Test
65144 @ DisplayName ("5분 내 요청 횟수(3회)를 초과하면 예외가 발생한다" )
66145 void exceedRequestLimit () {
0 commit comments