package be.simplenotes.domain.usecases.users.login import be.simplenotes.config.JwtConfig import be.simplenotes.domain.security.BcryptPasswordHash import be.simplenotes.domain.security.SimpleJwt import be.simplenotes.domain.security.UserJwtMapper import be.simplenotes.domain.testutils.isLeftOfType import be.simplenotes.domain.testutils.isRight import be.simplenotes.persistance.repositories.UserRepository import be.simplenotes.types.PersistedUser import com.natpryce.hamkrest.assertion.assertThat import io.mockk.* import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import java.util.concurrent.TimeUnit internal class LoginUseCaseImplTest { // region setup private val mockUserRepository = mockk() private val passwordHash = BcryptPasswordHash(test = true) private val jwtConfig = JwtConfig("a secret", 1, TimeUnit.HOURS) private val simpleJwt = SimpleJwt(jwtConfig, UserJwtMapper()) private val loginUseCase = LoginUseCaseImpl(mockUserRepository, passwordHash, simpleJwt) @BeforeEach fun resetMocks() { clearMocks(mockUserRepository) } // endregion @Test fun `Login should fail with invalid form`() { val form = LoginForm("", "a") assertThat(loginUseCase.login(form), isLeftOfType()) verify { mockUserRepository wasNot called } } @Test fun `Login should fail with non existing user`() { val form = LoginForm("someusername", "somepassword") every { mockUserRepository.find(form.username!!) } returns null assertThat(loginUseCase.login(form), isLeftOfType()) } @Test fun `Login should fail with wrong password`() { val form = LoginForm("someusername", "wrongpassword") every { mockUserRepository.find(form.username!!) } returns PersistedUser(form.username!!, passwordHash.crypt("right password"), 1) assertThat(loginUseCase.login(form), isLeftOfType()) } @Test fun `Login should succeed with existing user and correct password`() { val loginForm = LoginForm("someusername", "somepassword") every { mockUserRepository.find(loginForm.username!!) } returns PersistedUser(loginForm.username!!, passwordHash.crypt(loginForm.password!!), 1) val res = loginUseCase.login(loginForm) assertThat(res, isRight()) } }