generated from pricelees/issue-pr-template
<!-- 제목 양식 --> <!-- [이슈번호] 작업 요약 (예시: [#10] Gitea 템플릿 생성) --> ## 📝 관련 이슈 및 PR **PR과 관련된 이슈 번호** - #30 ## ✨ 작업 내용 <!-- 어떤 작업을 했는지 알려주세요! --> - ReservationService를 읽기(Find) / 쓰기(Write) 서비스로 분리 - 모든 도메인에 repository를 사용하는 Finder, Writer, Validator 도입 -> ReservationService에 있는 조회, 검증, 쓰기 작업을 별도의 클래스로 분리하기 위함이었고, 이 과정에서 다른 도메인에도 도입함. ## 🧪 테스트 <!-- 어떤 테스트를 생각했고 진행했는지 알려주세요! --> 새로 추가된 기능 & 클래스는 모두 테스트 추가하였고, 작업 후 전체 테스트 완료 ## 📚 참고 자료 및 기타 <!-- 참고한 자료, 또는 논의할 사항이 있다면 알려주세요! --> Reviewed-on: #31 Co-authored-by: pricelees <priceelees@gmail.com> Co-committed-by: pricelees <priceelees@gmail.com>
86 lines
2.6 KiB
Kotlin
86 lines
2.6 KiB
Kotlin
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<MemberException> {
|
|
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<MemberException> {
|
|
memberFinder.findByEmailAndPassword(email, password)
|
|
}.also {
|
|
it.errorCode shouldBe MemberErrorCode.MEMBER_NOT_FOUND
|
|
}
|
|
}
|
|
}
|
|
})
|