feat(content-preference): 조회용 성인 노출 정책을 통합한다

This commit is contained in:
2026-09-17 20:17:28 +09:00
parent 8c87286acd
commit 243394acd7
2 changed files with 62 additions and 2 deletions
@@ -157,6 +157,14 @@ class MemberContentPreferenceService(
return getStoredPreference(member).isAdult
}
fun isAdultVisibleForQuery(member: Member, isAdultContentVisible: Boolean): Boolean {
return calculateIsAdultForQuery(
member = member,
countryCode = resolveCountryCode(member),
isAdultContentVisible = isAdultContentVisible
)
}
fun resolveCountryCode(member: Member?): String {
if (member != null) requireMemberId(member)
return resolveCountryCodeWithForcedMapping(member, countryContext.countryCode)
@@ -61,10 +61,10 @@ class MemberContentPreferenceServiceTest {
@Test
@DisplayName("회원 ID 강제 매핑(JP)이 헤더보다 우선 적용된다")
fun shouldResolveCountryCodeByForcedJapanMappingFirst() {
val member = createMember(id = 2L)
val member = createMember(id = 29721L)
val preference = createPreference(member)
countryContext.setCountryCode("US")
Mockito.`when`(repository.findByMemberId(2L)).thenReturn(preference)
Mockito.`when`(repository.findByMemberId(29721L)).thenReturn(preference)
val result = service.getStoredPreference(member)
@@ -449,6 +449,58 @@ class MemberContentPreferenceServiceTest {
assertTrue(service.calculateIsAdultForQuery(noAuthMember, "US", true))
}
@Test
@DisplayName("로그인 회원의 접속 국가 코드는 공백과 소문자를 정규화하고 없으면 KR로 계산된다")
fun shouldNormalizeCountryCodeForLoggedInMember() {
val member = createMember(id = 2400L)
countryContext.setCountryCode(" us ")
assertEquals("US", service.resolveCountryCode(member))
countryContext.setCountryCode(" ")
assertEquals("KR", service.resolveCountryCode(member))
countryContext.setCountryCode(null)
assertEquals("KR", service.resolveCountryCode(member))
}
@Test
@DisplayName("조회용 성인 노출 여부는 접속 국가와 인증 여부로 계산된다")
fun shouldCalculateIsAdultVisibleForQueryByCountryAndAuth() {
val noAuthMember = createMember(id = 2300L, withAuth = false)
val authMember = createMember(id = 2301L, withAuth = true)
countryContext.setCountryCode("KR")
assertFalse(service.isAdultVisibleForQuery(noAuthMember, isAdultContentVisible = true))
assertTrue(service.isAdultVisibleForQuery(authMember, isAdultContentVisible = true))
countryContext.setCountryCode("US")
assertTrue(service.isAdultVisibleForQuery(noAuthMember, isAdultContentVisible = true))
assertFalse(service.isAdultVisibleForQuery(authMember, isAdultContentVisible = false))
}
@Test
@DisplayName("비KR 요청에서는 회원의 저장 국가와 무관하게 전달한 성인 노출값을 사용한다")
fun shouldIgnoreStoredCountryCodeWhenRequestCountryIsNotKr() {
val member = createMember(id = 2401L, withAuth = false).apply {
countryCode = "KR"
}
countryContext.setCountryCode("US")
assertEquals("US", service.resolveCountryCode(member))
assertTrue(service.isAdultVisibleForQuery(member, isAdultContentVisible = true))
assertFalse(service.isAdultVisibleForQuery(member, isAdultContentVisible = false))
}
@Test
@DisplayName("조회용 성인 노출 여부도 회원 ID 강제 매핑이 헤더보다 우선 적용된다")
fun shouldApplyForcedCountryMappingForIsAdultVisibleForQuery() {
val forcedKrMember = createMember(id = 16L, withAuth = false)
countryContext.setCountryCode("US")
assertFalse(service.isAdultVisibleForQuery(forcedKrMember, isAdultContentVisible = true))
}
@Test
@DisplayName("성인 콘텐츠 조회 가능 여부는 저장 preference의 조회용 성인 정책 결과를 반환한다")
fun shouldReturnStoredPreferenceAdultPolicyForCanViewAdultContent() {