package be.simplenotes.domain.usecases.login import be.simplenotes.domain.model.PersistedUser import be.simplenotes.domain.security.BcryptPasswordHash import be.simplenotes.domain.security.SimpleJwt import be.simplenotes.domain.usecases.repositories.UserRepository import be.simplenotes.shared.config.JwtConfig import be.simplenotes.shared.testutils.assertions.isLeftOfType import be.simplenotes.shared.testutils.assertions.isRight 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) 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()) } }