Last active
November 13, 2018 16:23
-
-
Save galcyurio/4f0433b535b146cef327a268b15e3486 to your computer and use it in GitHub Desktop.
kotlin 권한 체크
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) } | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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