package be.simplenotes.domain.usecases.users.register import be.simplenotes.domain.model.PersistedUser import be.simplenotes.domain.security.BcryptPasswordHash import be.simplenotes.domain.usecases.repositories.UserRepository import be.simplenotes.shared.testutils.assertions.isLeftOfType import be.simplenotes.shared.testutils.assertions.isRight import com.natpryce.hamkrest.assertion.assertThat import com.natpryce.hamkrest.equalTo import io.mockk.* import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test internal class RegisterUseCaseImplTest { // region setup private val mockUserRepository = mockk() private val passwordHash = BcryptPasswordHash(test = true) private val registerUseCase = RegisterUseCaseImpl(mockUserRepository, passwordHash) @BeforeEach fun resetMocks() { clearMocks(mockUserRepository) } // endregion @Test fun `register should fail with invalid form`() { val form = RegisterForm("", "a".repeat(10)) assertThat(registerUseCase.register(form), isLeftOfType()) verify { mockUserRepository wasNot called } } @Test fun `Register should fail with existing username`() { val form = RegisterForm("someuser", "somepassword") every { mockUserRepository.exists(form.username!!) } returns true assertThat(registerUseCase.register(form), isLeftOfType()) } @Test fun `Register should succeed with new user`() { val form = RegisterForm("someuser", "somepassword") every { mockUserRepository.exists(form.username!!) } returns false every { mockUserRepository.create(any()) } returns PersistedUser(form.username!!, form.password!!, 1) val res = registerUseCase.register(form) assertThat(res, isRight()) res.map { assertThat(it.username, equalTo(form.username)) } } }