Skip to content

Instantly share code, notes, and snippets.

@galcyurio
Last active November 13, 2018 16:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save galcyurio/4f0433b535b146cef327a268b15e3486 to your computer and use it in GitHub Desktop.
Save galcyurio/4f0433b535b146cef327a268b15e3486 to your computer and use it in GitHub Desktop.
kotlin 권한 체크
interface EmailChecker {
fun checkEmail(email: String): Boolean = email.contains("@")
}
interface RoleChecker {
fun <T : Collection<String>> T.checkRole(role: String): Boolean = contains(role)
}
class FirstValidator {
fun validate(value: String): Boolean = TODO()
}
class SecondValidator {
fun validate(value: String): Boolean = TODO()
}
class ThirdValidator {
fun validate(value: String): Boolean = TODO()
}
interface NicknameChecker {
// 3rd party 의존성들
val firstValidator: FirstValidator
val secondValidator: SecondValidator
val thirdValidator: ThirdValidator
fun checkNickname(nickname: String): Boolean =
firstValidator.validate(nickname) &&
secondValidator.validate(nickname) &&
thirdValidator.validate(nickname)
}
class NicknameCheckerImpl(
override val firstValidator: FirstValidator,
override val secondValidator: SecondValidator,
override val thirdValidator: ThirdValidator
) : NicknameChecker
class CheckersTest : EmailChecker, RoleChecker, NicknameChecker {
override val firstValidator: FirstValidator = mockk()
override val secondValidator: SecondValidator = mockk()
override val thirdValidator: ThirdValidator = mockk()
@Test
fun `이메일에 @가 포함되면 checkEmail() 호출시 true를 반환해야 한다`() {
// given
val email = "test@test.com"
// when
val actual = checkEmail(email)
// then
assertTrue(actual)
}
@Test
fun `컬렉션에 해당 role이 포함되어 있으면 checkRole() 호출시 true를 반환해야 한다`() {
// given
val role = "something"
val roles = setOf("foo", "bar", role)
// when
val actual = roles.checkRole(role)
// then
assertTrue(actual)
}
@Test
fun `checkNickname() 호출시 FirstValidator#validate(), SecondValidator#validate(), ThirdValidator#validate() 함수가 호출되어야 한다`() {
// given
val nickname = "something"
every { firstValidator.validate(nickname) } returns true
every { secondValidator.validate(nickname) } returns true
every { thirdValidator.validate(nickname) } returns true
// when
val actual = checkNickname(nickname)
// then
assertTrue(actual)
verify { firstValidator.validate(nickname) }
verify { secondValidator.validate(nickname) }
verify { thirdValidator.validate(nickname) }
}
}
open class Dependency {
fun doSomething(dependency: Dependency) {}
}
class Dependency1 : Dependency()
class Dependency2 : Dependency()
class Dependency3 : Dependency()
class Dependency4 : Dependency()
class Dependency5 : Dependency()
data class UntestableUser(
val dependency1: Dependency1,
val dependency2: Dependency2,
val dependency3: Dependency3,
val dependency4: Dependency4,
val dependency5: Dependency5,
val email: String,
val nickname: String,
val roles: List<String> = listOf()
) {
init {
dependency2.doSomething(dependency1)
dependency3.doSomething(dependency2)
dependency4.doSomething(dependency3)
dependency5.doSomething(dependency4)
}
}
class UserService(
private val nicknameChecker: NicknameChecker
) : EmailChecker, RoleChecker, NicknameChecker by nicknameChecker {
fun signOn(user: UntestableUser) {
if (checkEmail(user.email)
&& user.roles.checkRole("something")
&& checkNickname(user.nickname)
) {
// do something
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment