From 4a014b9a6e79bf2a3b832b41a9cc578fd0cbf49c Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:53:03 +0900 Subject: [PATCH] =?UTF-8?q?test:=20AuthServiceTest=20=EC=BD=94=ED=8B=80?= =?UTF-8?q?=EB=A6=B0=20=EC=A0=84=ED=99=98=20=EB=B0=8F=20=EC=9D=BC=EB=B6=80?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/auth/business/AuthServiceTest.kt | 125 ++++++++++-------- 1 file changed, 71 insertions(+), 54 deletions(-) diff --git a/src/test/java/roomescape/system/auth/business/AuthServiceTest.kt b/src/test/java/roomescape/system/auth/business/AuthServiceTest.kt index 0bcfcd26..8e415266 100644 --- a/src/test/java/roomescape/system/auth/business/AuthServiceTest.kt +++ b/src/test/java/roomescape/system/auth/business/AuthServiceTest.kt @@ -1,66 +1,83 @@ -package roomescape.system.auth.business; +package roomescape.system.auth.business -import static org.assertj.core.api.Assertions.*; +import io.kotest.assertions.assertSoftly +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.core.spec.style.BehaviorSpec +import io.kotest.matchers.shouldBe +import io.mockk.every +import io.mockk.mockk +import org.springframework.data.repository.findByIdOrNull +import roomescape.common.JwtFixture +import roomescape.common.MemberFixture +import roomescape.member.business.MemberService +import roomescape.member.infrastructure.persistence.Member +import roomescape.member.infrastructure.persistence.MemberRepository +import roomescape.system.auth.infrastructure.jwt.JwtHandler +import roomescape.system.auth.service.AuthService +import roomescape.system.exception.ErrorType +import roomescape.system.exception.RoomEscapeException -import org.assertj.core.api.Assertions; -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.context.annotation.Import; -import roomescape.member.business.MemberService; -import roomescape.member.infrastructure.persistence.Member; -import roomescape.member.infrastructure.persistence.MemberRepository; -import roomescape.member.infrastructure.persistence.Role; -import roomescape.system.auth.service.AuthService; -import roomescape.system.auth.web.LoginRequest; -import roomescape.system.auth.infrastructure.jwt.JwtHandler; -import roomescape.system.auth.infrastructure.jwt.TokenDto; -import roomescape.system.exception.RoomEscapeException; +class AuthServiceTest : BehaviorSpec({ + val memberRepository: MemberRepository = mockk() + val memberService: MemberService = MemberService(memberRepository) + val jwtHandler: JwtHandler = JwtFixture.create() -@SpringBootTest -@Import({AuthService.class, JwtHandler.class, MemberService.class}) -class AuthServiceTest { + val authService = AuthService(memberService, jwtHandler) + val user: Member = MemberFixture.user() - @Autowired - private AuthService authService; - @Autowired - private MemberRepository memberRepository; + Given("로그인 요청을 받으면") { + When("이메일과 비밀번호로 회원을 찾고") { + val request = MemberFixture.userLoginRequest() - @Test - @DisplayName("로그인 성공시 JWT accessToken 을 반환한다.") - void loginSuccess() { - // given - Member member = memberRepository.save(new Member(null, "이름", "test@test.com", "12341234", Role.MEMBER)); + Then("회원이 있다면 JWT 토큰을 생성한 뒤 반환한다.") { + every { + memberRepository.findByEmailAndPassword(request.email, request.password) + } returns user - // when - TokenDto response = authService.login(new LoginRequest(member.getEmail(), member.getPassword())); + val accessToken: String = authService.login(request).accessToken - // then - assertThat(response.accessToken()).isNotNull(); - } + accessToken.isNotBlank() shouldBe true + jwtHandler.getMemberIdFromToken(accessToken) shouldBe user.id + } - @Test - @DisplayName("존재하지 않는 회원 email 또는 password로 로그인하면 예외가 발생한다.") - void loginFailByNotExistMemberInfo() { - // given - String notExistEmail = "invalid@test.com"; - String notExistPassword = "invalid1234"; + Then("회원이 없다면 예외를 던진다.") { + every { + memberRepository.findByEmailAndPassword(request.email, request.password) + } returns null - // when & then - Assertions.assertThatThrownBy(() -> authService.login(new LoginRequest(notExistEmail, notExistPassword))) - .isInstanceOf(RoomEscapeException.class); - } + val exception = shouldThrow { + authService.login(request) + } - @Test - @DisplayName("존재하지 않는 회원의 memberId로 로그인 여부를 체크하면 예외가 발생한다.") - void checkLoginFailByNotExistMemberInfo() { - // given - Long notExistMemberId = (long)(memberRepository.findAll().size() + 1); + exception.errorType shouldBe ErrorType.MEMBER_NOT_FOUND + } + } + } - // when & then - Assertions.assertThatThrownBy(() -> authService.checkLogin(notExistMemberId)) - .isInstanceOf(RoomEscapeException.class); - } -} + Given("로그인 확인 요청을 받으면") { + When("회원 ID로 회원을 찾고") { + val userId: Long = user.id!! + + Then("회원이 있다면 회원의 이름을 반환한다.") { + every { memberRepository.findByIdOrNull(userId) } returns user + + val response = authService.checkLogin(userId) + + assertSoftly(response) { + this.name shouldBe user.name + } + } + + Then("회원이 없다면 예외를 던진다.") { + every { memberRepository.findByIdOrNull(userId) } returns null + + val exception = shouldThrow { + authService.checkLogin(userId) + } + + exception.errorType shouldBe ErrorType.MEMBER_NOT_FOUND + } + } + } +})