package roomescape.member.implement import io.kotest.assertions.throwables.shouldThrow import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.collections.shouldHaveSize import io.kotest.matchers.shouldBe import io.mockk.every import io.mockk.mockk import io.mockk.verify import org.springframework.data.repository.findByIdOrNull import roomescape.member.exception.MemberErrorCode import roomescape.member.exception.MemberException import roomescape.member.infrastructure.persistence.MemberRepository class MemberFinderTest : FunSpec({ val memberRepository: MemberRepository = mockk() val memberFinder = MemberFinder(memberRepository) context("findAll") { test("모든 회원을 조회한다.") { every { memberRepository.findAll() } returns listOf(mockk(), mockk(), mockk()) memberFinder.findAll() shouldHaveSize 3 } } context("findById") { val memberId = 1L test("동일한 ID인 회원을 찾아 응답한다.") { every { memberRepository.findByIdOrNull(memberId) } returns mockk() memberFinder.findById(memberId) verify(exactly = 1) { memberRepository.findByIdOrNull(memberId) } } test("동일한 ID인 회원이 없으면 실패한다.") { every { memberRepository.findByIdOrNull(memberId) } returns null shouldThrow { memberFinder.findById(memberId) }.also { it.errorCode shouldBe MemberErrorCode.MEMBER_NOT_FOUND } } } context("findByEmailAndPassword") { val email = "email" val password = "password" test("동일한 이메일과 비밀번호를 가진 회원을 찾아 응답한다.") { every { memberRepository.findByEmailAndPassword(email, password) } returns mockk() memberFinder.findByEmailAndPassword(email, password) verify(exactly = 1) { memberRepository.findByEmailAndPassword(email, password) } } test("동일한 이메일과 비밀번호를 가진 회원이 없으면 실패한다.") { every { memberRepository.findByEmailAndPassword(email, password) } returns null shouldThrow { memberFinder.findByEmailAndPassword(email, password) }.also { it.errorCode shouldBe MemberErrorCode.MEMBER_NOT_FOUND } } } })