22
33import static org .assertj .core .api .Assertions .assertThat ;
44import static org .mockito .Mockito .verify ;
5+ import static org .mockito .Mockito .when ;
56
67import com .bootsignal .domain .user .entity .User ;
8+ import com .bootsignal .global .config .Utf8DotenvLoader ;
79import com .bootsignal .global .config .properties .PasswordResetProperties ;
10+ import jakarta .mail .internet .MimeMessage ;
811import java .time .Instant ;
912import org .junit .jupiter .api .Test ;
1013import org .mockito .ArgumentCaptor ;
11- import org .springframework .mail .SimpleMailMessage ;
1214import org .springframework .mail .javamail .JavaMailSender ;
1315import org .springframework .test .util .ReflectionTestUtils ;
1416
1820class MailPasswordResetTokenNotifierTest {
1921
2022 @ Test
21- void sendBuildsPasswordResetMailWithResetUrl () {
23+ void sendBuildsPasswordResetMailWithResetUrl () throws Exception {
2224 JavaMailSender javaMailSender = org .mockito .Mockito .mock (JavaMailSender .class );
25+ MimeMessage mimeMessage = new org .springframework .mail .javamail .JavaMailSenderImpl ().createMimeMessage ();
26+ when (javaMailSender .createMimeMessage ()).thenReturn (mimeMessage );
27+
28+ String fallbackSubject = "비밀번호 재설정" ;
29+ String expectedSubject = Utf8DotenvLoader .get ("PASSWORD_RESET_MAIL_SUBJECT" );
30+ if (expectedSubject == null || expectedSubject .isBlank ()) {
31+ expectedSubject = fallbackSubject ;
32+ }
33+
2334 PasswordResetProperties properties = new PasswordResetProperties (
2435 1800L ,
2536 false ,
2637 "http://localhost:5173/reset-password?token={token}" ,
27- new PasswordResetProperties .Mail (true , "support@bootsignal.com" , "비밀번호 재설정" )
38+ new PasswordResetProperties .Mail (true , "support@bootsignal.com" , fallbackSubject )
2839 );
2940 MailPasswordResetTokenNotifier notifier = new MailPasswordResetTokenNotifier (javaMailSender , properties );
3041 User user = User .signupLocal ("user@example.com" , "encoded-password" , "홍길동" , "tester" );
@@ -37,13 +48,13 @@ void sendBuildsPasswordResetMailWithResetUrl() {
3748 Instant .parse ("2026-06-16T05:00:00Z" )
3849 );
3950
40- ArgumentCaptor <SimpleMailMessage > captor = ArgumentCaptor .forClass (SimpleMailMessage .class );
51+ ArgumentCaptor <MimeMessage > captor = ArgumentCaptor .forClass (MimeMessage .class );
4152 verify (javaMailSender ).send (captor .capture ());
42- SimpleMailMessage message = captor .getValue ();
43- assertThat (message .getFrom ()).isEqualTo ("support@bootsignal.com" );
44- assertThat (message .getTo ()). containsExactly ("user@example.com" );
45- assertThat (message .getSubject ()).isEqualTo ("비밀번호 재설정" );
46- assertThat (message .getText ())
53+ MimeMessage message = captor .getValue ();
54+ assertThat (message .getFrom ()[ 0 ]. toString () ).isEqualTo ("support@bootsignal.com" );
55+ assertThat (message .getAllRecipients ()[ 0 ]. toString ()). isEqualTo ("user@example.com" );
56+ assertThat (message .getSubject ()).isEqualTo (expectedSubject );
57+ assertThat (message .getContent (). toString ())
4758 .contains ("http://localhost:5173/reset-password?token=raw-reset-token" )
4859 .contains ("2026-06-16T05:00:00Z" );
4960 }
0 commit comments