diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberService.kt index 858a31a6..c112b9cd 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberService.kt @@ -16,6 +16,7 @@ import java.time.ZoneId import java.time.format.DateTimeFormatter @Service +@Transactional(readOnly = true) class AdminMemberService( private val repository: AdminMemberRepository, private val passwordEncoder: PasswordEncoder, diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberServiceTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberServiceTest.kt new file mode 100644 index 00000000..5b5b41cc --- /dev/null +++ b/src/test/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberServiceTest.kt @@ -0,0 +1,81 @@ +package kr.co.vividnext.sodalive.admin.member + +import kr.co.vividnext.sodalive.member.Member +import kr.co.vividnext.sodalive.member.MemberRole +import kr.co.vividnext.sodalive.member.SignOut +import kr.co.vividnext.sodalive.member.SignOutRepository +import kr.co.vividnext.sodalive.support.EmbeddedRedisInitializer +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.data.domain.PageRequest +import org.springframework.test.context.ContextConfiguration + +@SpringBootTest(properties = ["cloud.aws.cloud-front.host=https://cdn.test"]) +@ContextConfiguration(initializers = [EmbeddedRedisInitializer::class]) +class AdminMemberServiceTest @Autowired constructor( + private val service: AdminMemberService, + private val adminMemberRepository: AdminMemberRepository, + private val signOutRepository: SignOutRepository +) { + @AfterEach + fun tearDown() { + signOutRepository.deleteAll() + adminMemberRepository.deleteAll() + } + + @Test + @DisplayName("OSIV off 환경에서 탈퇴 이력이 있는 회원 리스트를 조회해도 lazy 초기화 예외가 발생하지 않는다") + fun shouldGetMemberListWithSignOutReasonsWhenOpenInViewIsDisabled() { + val member = saveMemberWithSignOutReason( + email = "admin-member-list-user@test.com", + nickname = "회원 목록 사용자", + role = MemberRole.USER + ) + + val response = service.getMemberList(PageRequest.of(0, 20)) + + val item = response.items.single { it.id == member.id } + assertEquals(1, response.totalCount) + assertTrue(item.signOutDate.isNotBlank()) + } + + @Test + @DisplayName("OSIV off 환경에서 탈퇴 이력이 있는 크리에이터 리스트를 조회해도 lazy 초기화 예외가 발생하지 않는다") + fun shouldGetCreatorListWithSignOutReasonsWhenOpenInViewIsDisabled() { + val creator = saveMemberWithSignOutReason( + email = "admin-member-list-creator@test.com", + nickname = "크리에이터 목록 사용자", + role = MemberRole.CREATOR + ) + + val response = service.getCreatorList(PageRequest.of(0, 20)) + + val item = response.items.single { it.id == creator.id } + assertEquals(1, response.totalCount) + assertTrue(item.signOutDate.isNotBlank()) + } + + private fun saveMemberWithSignOutReason( + email: String, + nickname: String, + role: MemberRole + ): Member { + val member = adminMemberRepository.save( + Member( + email = email, + password = "password", + nickname = nickname, + role = role + ) + ) + val signOut = SignOut(reason = "운영 정책 위반") + signOut.member = member + signOutRepository.save(signOut) + return member + } +}