@@ -5,7 +5,10 @@ import com.yourssu.scouter.common.implement.domain.mail.MailRepository
55import com.yourssu.scouter.common.implement.domain.mail.MimeMessageBuilderResolver
66import jakarta.mail.Session
77import jakarta.mail.internet.MimeMessage
8+ import org.assertj.core.api.Assertions.assertThat
9+ import org.junit.jupiter.api.Assumptions.assumeTrue
810import org.junit.jupiter.api.Test
11+ import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable
912import org.springframework.beans.factory.annotation.Autowired
1013import org.springframework.boot.test.context.SpringBootTest
1114import org.springframework.test.context.ActiveProfiles
@@ -19,6 +22,7 @@ import java.util.Properties
1922
2023@SpringBootTest
2124@ActiveProfiles(" local" , " local-dev-db" )
25+ @EnabledIfEnvironmentVariable(named = " DB_URL" , matches = " .+" )
2226@Suppress(" NonAsciiCharacters" )
2327class DevDbMailEncodingTest (
2428 @Autowired private val mailRepository : MailRepository ,
@@ -63,16 +67,19 @@ class DevDbMailEncodingTest(
6367 }
6468 }
6569
70+ /* *
71+ * dev DB에 존재하는 샘플 메일(197, 199)로 MimeMessage 제목 인코딩이 UTF-8로 정상인지 검증.
72+ * 해당 mailId가 DB에 없으면(CI 등) 테스트는 스킵된다.
73+ */
6674 @Test
67- fun `dev DB mailId 197과 199의 MimeMessage Subject 인코딩 비교 ` () {
68- val ids = listOf (197L , 199L )
75+ fun `dev DB 샘플 mailId로 MimeMessage Subject UTF-8 인코딩 회귀 검증 ` () {
76+ val ids = listOf (197L , 199L ) // dev DB 전용 샘플 ID
6977 ids.forEach { id ->
7078 val mail = mailRepository.findById(id)
71- ? : error(" mailId=$id 를 찾을 수 없습니다." )
79+ assumeTrue(mail != null , " mailId=$id not found; this test requires dev DB with sample mails 197, 199" )
80+ val m = mail!!
7281
73- println (" === mailId=$id DB 문자열 subject=[${mail.mailSubject} ] ===" )
74-
75- val mailData = MailData .from(mail)
82+ val mailData = MailData .from(m)
7683
7784 val props = Properties ().apply {
7885 put(" mail.smtp.auth" , " true" )
@@ -86,20 +93,16 @@ class DevDbMailEncodingTest(
8693 val builder = mimeMessageBuilderResolver.resolve(mailData)
8794 val message: MimeMessage = builder.build(mailData, session)
8895
89- // JavaMail이 디코딩해서 보여주는 Subject
90- println ( " MimeMessage.getSubject() for mailId= $id -> [ ${ message.subject} ] " )
96+ // 회귀 검증: JavaMail 디코딩 결과가 DB 제목과 동일해야 함
97+ assertThat( message.subject).isEqualTo(m.mailSubject )
9198
92- // Raw MIME 헤더에서 Subject 라인만 출력
9399 val baos = ByteArrayOutputStream ()
94100 message.writeTo(baos)
95- val raw = baos.toString(Charsets .ISO_8859_1 ) // MIME 원문은 ISO-8859-1로 보는 게 관례
101+ val raw = baos.toString(Charsets .ISO_8859_1 )
96102 val subjectHeader = raw.lineSequence().firstOrNull { it.startsWith(" Subject:" ) }
97- println (" Raw Subject header for mailId=$id -> $subjectHeader " )
98103
99- // Gmail에 보내는 것과 동일한 Base64 URL 인코딩 문자열도 참고용
100- val encoded = Base64 .getUrlEncoder().encodeToString(baos.toByteArray())
101- println (" Encoded length for mailId=$id = ${encoded.length} " )
102- println ()
104+ // 회귀 검증: Raw Subject가 RFC 2047 UTF-8 B 인코딩 형태여야 함 (mojibake 방지)
105+ assertThat(subjectHeader).isNotNull().contains(" =?UTF-8?B?" )
103106 }
104107 }
105108}
0 commit comments