Skip to content

Commit

Permalink
Write test codes of RefreshTokenService
Browse files Browse the repository at this point in the history
  • Loading branch information
mkSpace committed Jan 24, 2024
1 parent aacee04 commit a5f6bc1
Show file tree
Hide file tree
Showing 4 changed files with 302 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,10 @@ import com.whatever.raisedragon.applicationservice.auth.dto.TokenRefreshResponse
import com.whatever.raisedragon.common.exception.BaseException
import com.whatever.raisedragon.common.exception.ExceptionCode
import com.whatever.raisedragon.domain.auth.AuthService
import com.whatever.raisedragon.domain.refreshtoken.RefreshToken
import com.whatever.raisedragon.domain.refreshtoken.RefreshTokenService
import com.whatever.raisedragon.domain.user.Nickname
import com.whatever.raisedragon.domain.user.User
import com.whatever.raisedragon.domain.user.UserService
import com.whatever.raisedragon.domain.user.fromDto
import com.whatever.raisedragon.security.jwt.JwtAgent
import com.whatever.raisedragon.security.jwt.JwtToken
import org.springframework.stereotype.Service
Expand Down Expand Up @@ -49,26 +47,25 @@ class AuthApplicationService(

private fun buildLoginResponseByNewUser(newUser: User): LoginResponse {
val jwtToken = jwtAgent.provide(newUser)
val refreshToken = RefreshToken(
userId = newUser.id!!,
payload = jwtToken.refreshToken,
)
newUser.id ?: throw BaseException.of(ExceptionCode.E500_INTERNAL_SERVER_ERROR)

refreshTokenService.create(refreshToken, newUser.fromDto())
val refreshToken = refreshTokenService.create(newUser.id!!, jwtToken.refreshToken).payload
?: throw BaseException.of(ExceptionCode.E400_BAD_REQUEST)

return LoginResponse(
userId = newUser.id!!,
nickname = newUser.nickname.value,
accessToken = jwtToken.accessToken,
refreshToken = jwtToken.refreshToken,
refreshToken = refreshToken,
nicknameIsModified = newUser.createdAt!! < newUser.updatedAt
)
}

private fun buildLoginResponseByUser(user: User): LoginResponse {
user.id ?: throw BaseException.of(ExceptionCode.E500_INTERNAL_SERVER_ERROR)
val jwtToken = JwtToken(
accessToken = jwtAgent.provide(user).accessToken,
refreshToken = refreshTokenService.findByUser(user)?.payload!!
refreshToken = refreshTokenService.findByUserId(user.id!!)?.payload!!
)

return LoginResponse(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ class RefreshTokenService(
return refreshTokenRepository.findByPayload(payload)?.toDto()
}

fun findByUser(userId: Long): RefreshTokenEntity? {
fun findByUserId(userId: Long): RefreshToken? {
val userEntity = userRepository.findById(userId).orElseThrow(notFoundExceptionSupplier)
return refreshTokenRepository.findByUserEntity(userEntity)
return refreshTokenRepository.findByUserEntity(userEntity)?.toDto()
}

@Transactional
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,289 @@
package com.whatever.raisedragon.domain.refreshtoken

import com.whatever.raisedragon.IntegrationTestSupport
import com.whatever.raisedragon.domain.user.Nickname
import com.whatever.raisedragon.domain.user.UserEntity
import com.whatever.raisedragon.domain.user.UserRepository
import com.whatever.raisedragon.utils.anyInternalException
import com.whatever.raisedragon.utils.anyNotFoundException
import jakarta.transaction.Transactional
import org.assertj.core.api.Assertions.*
import org.assertj.core.api.ObjectAssert
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired

@Transactional
class RefreshTokenServiceTest : IntegrationTestSupport {

@Autowired
private lateinit var refreshTokenService: RefreshTokenService

@Autowired
private lateinit var refreshTokenRepository: RefreshTokenRepository

@Autowired
private lateinit var userRepository: UserRepository

@DisplayName("userId와 payload를 입력받아 RefreshToken을 생성한다.")
@Test
fun create1() {
// given
val userEntity = UserEntity(nickname = Nickname("User"))
userRepository.save(userEntity)

val payload = "Sample user payload"

// when
val refreshToken = refreshTokenService.create(userId = userEntity.id, payload = payload)

// then
assertThat(refreshToken)
.isInstanceOfRefreshToken()
.extracting("userId", "payload")
.contains(userEntity.id, payload)
}

@DisplayName("userId와 null인 payload를 입력받아 RefreshToken을 생성한다.")
@Test
fun create2() {
// given
val userEntity = UserEntity(nickname = Nickname("User"))
userRepository.save(userEntity)

val payload = null

// when
val refreshToken = refreshTokenService.create(userId = userEntity.id, payload = payload)

// then
assertThat(refreshToken)
.isInstanceOfRefreshToken()
.extracting("userId")
.isEqualTo(userEntity.id)
assertThat(refreshToken.payload)
.isNull()
}

@DisplayName("userId와 payload를 입력받아 RefreshToken을 생성할때 userId에 해당하는 User가 없는 경우 예외가 발생한다.")
@Test
fun create3() {
// given
val userEntity = UserEntity(nickname = Nickname("User"))
userRepository.save(userEntity)

val payload = "Sample user payload"

// when // then
assertThatThrownBy { refreshTokenService.create(userId = -1L, payload = payload) }
.anyNotFoundException()
}

@DisplayName("payload를 입력받아 RefreshToken을 조회한다.")
@Test
fun findByPayload1() {
// given
val userEntity = UserEntity(nickname = Nickname("User"))
userRepository.save(userEntity)

val payload = "Sample user payload"
val refreshTokenEntity = RefreshTokenEntity(userEntity, payload)
refreshTokenRepository.save(refreshTokenEntity)

// when
val foundRefreshToken = refreshTokenService.findByPayload(payload)

// then
assertThat(foundRefreshToken)
.isInstanceOfRefreshToken()
.extracting("userId", "payload")
.contains(userEntity.id, payload)
}

@DisplayName("payload를 입력받아 RefreshToken을 조회할 때 해당하는 RefreshToken이 없는 경우 null를 반환한다.")
@Test
fun findByPayload2() {
// given
val userEntity = UserEntity(nickname = Nickname("User"))
userRepository.save(userEntity)

val payload = "Sample user payload"
val refreshTokenEntity = RefreshTokenEntity(userEntity, payload)
refreshTokenRepository.save(refreshTokenEntity)

// when
val foundRefreshToken = refreshTokenService.findByPayload("Another payload")

// then
assertThat(foundRefreshToken)
.isNull()
}

@DisplayName("userId를 입력받아 RefreshTokenEntity를 조회한다.")
@Test
fun findByUserId1() {
// given
val userEntity = UserEntity(nickname = Nickname("User"))
userRepository.save(userEntity)

val payload = "Sample user payload"
val refreshTokenEntity = RefreshTokenEntity(userEntity, payload)
refreshTokenRepository.save(refreshTokenEntity)

// when
val foundRefreshToken = refreshTokenService.findByUserId(userEntity.id)

// then
assertThat(foundRefreshToken)
.isInstanceOfRefreshToken()
.extracting("userId", "payload")
.contains(userEntity.id, payload)
}

@DisplayName("userId를 입력받아 RefreshTokenEntity를 조회할 때 해당하는 RefreshToken이 없는 경우 null를 반환한다.")
@Test
fun findByUserId2() {
// given
val userEntity1 = UserEntity(nickname = Nickname("User1"))
val userEntity2 = UserEntity(nickname = Nickname("User2"))
userRepository.saveAll(listOf(userEntity1, userEntity2))

val payload = "Sample user payload"
val refreshTokenEntity = RefreshTokenEntity(userEntity1, payload)
refreshTokenRepository.save(refreshTokenEntity)

// when
val foundRefreshToken = refreshTokenService.findByUserId(userEntity2.id)

// then
assertThat(foundRefreshToken)
.isNull()
}

@DisplayName("userId를 입력받아 RefreshTokenEntity를 조회할 때 userId에 해당하는 User가 없으면 예외가 발생한다.")
@Test
fun findByUserId3() {
// given
val userEntity = UserEntity(nickname = Nickname("User"))
userRepository.save(userEntity)

val payload = "Sample user payload"
val refreshTokenEntity = RefreshTokenEntity(userEntity, payload)
refreshTokenRepository.save(refreshTokenEntity)

// when // then
assertThatThrownBy { refreshTokenService.findByUserId(-1L) }
.anyNotFoundException()
}

@DisplayName("userId,payload를 입력받아 userId에 해당하는 RefreshToken의 payload를 수정한다.")
@Test
fun updatePayloadByUserId1() {
// given
val userEntity = UserEntity(nickname = Nickname("User"))
userRepository.save(userEntity)

val payload = "Sample user payload"
val toBePayload = "Modified payload"
val refreshTokenEntity = RefreshTokenEntity(userEntity, payload)
refreshTokenRepository.save(refreshTokenEntity)

// when
val foundRefreshToken = refreshTokenService.updatePayloadByUserId(userId = userEntity.id, payload = toBePayload)

// then
assertThat(foundRefreshToken)
.isInstanceOfRefreshToken()
.extracting("userId", "payload")
.contains(userEntity.id, toBePayload)
}

@DisplayName("userId, payload를 입력받아 userId에 해당하는 RefreshToken의 payload를 수정할 때 userId에 해당하는 User가 없는 경우 예외가 발생한다.")
@Test
fun updatePayloadByUserId2() {
// given
val userEntity = UserEntity(nickname = Nickname("User"))
userRepository.save(userEntity)

val payload = "Sample user payload"
val toBePayload = "Modified payload"
val refreshTokenEntity = RefreshTokenEntity(userEntity, payload)
refreshTokenRepository.save(refreshTokenEntity)

// when // then
assertThatThrownBy {
refreshTokenService.updatePayloadByUserId(userId = -1L, payload = toBePayload)
}.anyNotFoundException()
}

@DisplayName("userId, payload를 입력받아 userId에 해당하는 RefreshToken의 payload를 수정할 때 userId에 해당하는 RefreshToken이 없는 경우 예외가 발생한다.")
@Test
fun updatePayloadByUserId3() {
// given
val userEntity1 = UserEntity(nickname = Nickname("User1"))
val userEntity2 = UserEntity(nickname = Nickname("User2"))
userRepository.saveAll(listOf(userEntity1, userEntity2))

val payload = "Sample user payload"
val toBePayload = "Modified payload"
val refreshTokenEntity = RefreshTokenEntity(userEntity1, payload)
refreshTokenRepository.save(refreshTokenEntity)

// when // then
assertThatThrownBy {
refreshTokenService.updatePayloadByUserId(userId = userEntity2.id, payload = toBePayload)
}.anyNotFoundException()
}

@DisplayName("userId를 입력받아 userId에 해당하는 RefreshToken을 hard-delete한다.")
@Test
fun hardDeleteByUserId1() {
// given
val userEntity = UserEntity(nickname = Nickname("User"))
userRepository.save(userEntity)

val refreshTokenEntity = RefreshTokenEntity(userEntity, "Sample payload")
refreshTokenRepository.save(refreshTokenEntity)

// when
refreshTokenService.hardDeleteByUserId(userEntity.id)

// then
assertThat(refreshTokenRepository.findByUserEntity(userEntity)).isNull()
}

@DisplayName("userId를 입력받아 userId에 해당하는 RefreshToken을 hard-delete할 때 userId에 해당하는 User가 없는 경우 예외가 발생한다.")
@Test
fun hardDeleteByUserId2() {
// given
val userEntity = UserEntity(nickname = Nickname("User"))
userRepository.save(userEntity)

val refreshTokenEntity = RefreshTokenEntity(userEntity, "Sample payload")
refreshTokenRepository.save(refreshTokenEntity)

// when // then
assertThatThrownBy {
refreshTokenService.hardDeleteByUserId(-1L)
}.anyNotFoundException()
}

@DisplayName("userId를 입력받아 userId에 해당하는 RefreshToken을 hard-delete할 때 userId에 해당하는 RefreshToken이 없는 경우 예외가 발생한다.")
@Test
fun hardDeleteByUserId3() {
// given
val userEntity1 = UserEntity(nickname = Nickname("User1"))
val userEntity2 = UserEntity(nickname = Nickname("User2"))
userRepository.saveAll(listOf(userEntity1, userEntity2))

val refreshTokenEntity = RefreshTokenEntity(userEntity1, "Sample payload")
refreshTokenRepository.save(refreshTokenEntity)

// when // then
assertThatThrownBy {
refreshTokenService.hardDeleteByUserId(userEntity2.id)
}.anyInternalException()
}

private fun ObjectAssert<*>.isInstanceOfRefreshToken() = isInstanceOf(RefreshToken::class.java)
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,8 @@ import com.whatever.raisedragon.common.exception.BaseException
import com.whatever.raisedragon.common.exception.ExceptionCode
import org.assertj.core.api.AbstractThrowableAssert

fun AbstractThrowableAssert<*, *>.anyNotFoundException() = isInstanceOf(BaseException::class.java)
.hasMessage(ExceptionCode.E404_NOT_FOUND.message)
fun AbstractThrowableAssert<*, *>.anyNotFoundException(): AbstractThrowableAssert<*, *> = isInstanceOf(BaseException::class.java)
.hasMessage(ExceptionCode.E404_NOT_FOUND.message)

fun AbstractThrowableAssert<*, *>.anyInternalException(): AbstractThrowableAssert<*, *> = isInstanceOf(BaseException::class.java)
.hasMessage(ExceptionCode.E500_INTERNAL_SERVER_ERROR.message)

0 comments on commit a5f6bc1

Please sign in to comment.