diff --git a/src/main/kotlin/domain/usecase/auth/CreateUserUseCase.kt b/src/main/kotlin/domain/usecase/auth/CreateUserUseCase.kt index 9fb1ad6..36f72cf 100644 --- a/src/main/kotlin/domain/usecase/auth/CreateUserUseCase.kt +++ b/src/main/kotlin/domain/usecase/auth/CreateUserUseCase.kt @@ -1,5 +1,6 @@ package org.example.domain.usecase.auth +import org.example.data.repository.UsersRepositoryImpl.Companion.encryptPassword import org.example.domain.AccessDeniedException import org.example.domain.entity.User import org.example.domain.entity.User.UserRole @@ -15,7 +16,7 @@ class CreateUserUseCase( operator fun invoke(username: String, password: String, role: UserRole) = usersRepository.getCurrentUser().let { currentUser -> if (currentUser.role != UserRole.ADMIN) throw AccessDeniedException("feature") - User(username = username, hashedPassword = password, role = role).let { newUser -> + User(username = username, hashedPassword = encryptPassword(password) , role = role).let { newUser -> usersRepository.createUser(newUser) logsRepository.addLog( CreatedLog( diff --git a/src/test/kotlin/domain/usecase/auth/CreateUserUseCaseTest.kt b/src/test/kotlin/domain/usecase/auth/CreateUserUseCaseTest.kt index 52e07a0..2083e51 100644 --- a/src/test/kotlin/domain/usecase/auth/CreateUserUseCaseTest.kt +++ b/src/test/kotlin/domain/usecase/auth/CreateUserUseCaseTest.kt @@ -1,14 +1,18 @@ package domain.usecase.auth import dummyAdmin +import dummyMate import io.mockk.every import io.mockk.mockk import io.mockk.verify +import org.example.domain.AccessDeniedException import org.example.domain.entity.User import org.example.domain.entity.User.UserRole import org.example.domain.repository.LogsRepository import org.example.domain.repository.UsersRepository import org.example.domain.usecase.auth.CreateUserUseCase +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.assertThrows import kotlin.test.Test class CreateUserUseCaseTest { @@ -16,34 +20,62 @@ class CreateUserUseCaseTest { private val usersRepository: UsersRepository = mockk(relaxed = true) private val logsRepository: LogsRepository = mockk(relaxed = true) - val createUserUseCase = CreateUserUseCase(usersRepository, logsRepository) + lateinit var createUserUseCase: CreateUserUseCase + @BeforeEach + fun setUp() { + createUserUseCase = CreateUserUseCase(usersRepository, logsRepository) + + } + // red then green @Test - fun `should create new user when user complete register with valid username and password`() { + fun `should throw AccessDeniedException when user is not admin`() { // given val user = User( username = " Ah med ", hashedPassword = "123456789", role = UserRole.MATE ) - every { usersRepository.getCurrentUser() } returns dummyAdmin + every { usersRepository.getCurrentUser() } returns dummyMate // when & then - createUserUseCase.invoke(user.username, user.hashedPassword, user.role) + assertThrows { + createUserUseCase.invoke(user.username, user.hashedPassword, user.role) + } } + @Test - fun `should add log for new user when user complete register with valid username and password`() { + fun `should create new mate when user complete register with valid username and password`() { // given val user = User( - username = " Ah med ", + username = "federico valverdie", hashedPassword = "123456789", role = UserRole.MATE ) every { usersRepository.getCurrentUser() } returns dummyAdmin // when createUserUseCase.invoke(user.username, user.hashedPassword, user.role) + + //then + verify { usersRepository.createUser(any()) } + verify { logsRepository.addLog(any()) } + } + + @Test + fun `should create new admin when user complete register with valid username and password`() { + // given + val user = User( + username = "my uncle luka modric", + hashedPassword = "123456789", + role = UserRole.ADMIN + ) + every { usersRepository.getCurrentUser() } returns dummyAdmin + // when + createUserUseCase.invoke(user.username, user.hashedPassword, user.role) + //then + verify { usersRepository.createUser(any()) } verify { logsRepository.addLog(any()) } } diff --git a/src/test/kotlin/domain/usecase/auth/LoginUseCaseTest.kt b/src/test/kotlin/domain/usecase/auth/LoginUseCaseTest.kt index deaf9f2..8bbdf8a 100644 --- a/src/test/kotlin/domain/usecase/auth/LoginUseCaseTest.kt +++ b/src/test/kotlin/domain/usecase/auth/LoginUseCaseTest.kt @@ -26,6 +26,18 @@ class LoginUseCaseTest { } + @Test + fun `should throw any Exception when getAllUsers throw exception`() { + // given + every { usersRepository.getAllUsers() } throws Exception() + + // when & then + assertThrows { + loginUseCase.invoke(username = "Ahmed", password = "12345678") + } + } + + @Test fun `invoke should throw UnauthorizedException when list of users is empty`() { // given @@ -38,8 +50,9 @@ class LoginUseCaseTest { } + @Test - fun `invoke should throw UnauthorizedException when user not correct`() { + fun `invoke should throw UnauthorizedException when username not correct`() { // given every { usersRepository.getAllUsers() } returns listOf( User( @@ -61,7 +74,7 @@ class LoginUseCaseTest { every { usersRepository.getAllUsers() } returns listOf( User( username = "Ahmed", - hashedPassword = "uofah83r", + hashedPassword = encryptPassword("134328"), role = UserRole.MATE, ) ) @@ -72,6 +85,7 @@ class LoginUseCaseTest { } } + @Test fun `invoke should logged in when user found `() { // given @@ -83,8 +97,12 @@ class LoginUseCaseTest { ) ) + // when loginUseCase.invoke(username = "Ahmed", password = "12345678") + //then + verify { usersRepository.storeUserData(any(), any(), any()) } + } @@ -122,6 +140,7 @@ class LoginUseCaseTest { } + @Test fun `getCurrentUserIfLoggedIn should return user when user already logged in `() { // given @@ -130,7 +149,6 @@ class LoginUseCaseTest { hashedPassword = encryptPassword("12345678"), role = UserRole.ADMIN, ) - every { usersRepository.getAllUsers() } returns listOf(user) every { usersRepository.getCurrentUser() } returns user //when diff --git a/src/test/kotlin/domain/usecase/auth/LogoutUseCaseTest.kt b/src/test/kotlin/domain/usecase/auth/LogoutUseCaseTest.kt index b61b16b..3ebf0d0 100644 --- a/src/test/kotlin/domain/usecase/auth/LogoutUseCaseTest.kt +++ b/src/test/kotlin/domain/usecase/auth/LogoutUseCaseTest.kt @@ -3,10 +3,11 @@ package domain.usecase.auth import io.mockk.every import io.mockk.mockk +import io.mockk.verify import org.example.domain.repository.UsersRepository import org.example.domain.usecase.auth.LogoutUseCase -import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows class LogoutUseCaseTest { @@ -16,11 +17,20 @@ class LogoutUseCaseTest { @Test - fun `should clear user data when user logged out`() { - // given - every { usersRepository.clearUserData()} returns Unit + fun `should throw any exception data when clearUserDate throw any exception`() { + // when + every { usersRepository.clearUserData() } throws Exception() + //then + assertThrows { + logoutUseCase.invoke() + } + } - // when&then + @Test + fun `should clear user data when user logged out`() { + // when logoutUseCase.invoke() + //then + verify { usersRepository.clearUserData() } } } \ No newline at end of file