BIT-654: Generator SDK interface and repository implementation (#233)

This commit is contained in:
joshua-livefront
2023-11-09 17:08:37 -05:00
committed by GitHub
parent ab06123905
commit aa2fd560ce
9 changed files with 262 additions and 0 deletions

View File

@@ -0,0 +1,45 @@
package com.x8bit.bitwarden.data.generator.datasource.sdk
import com.bitwarden.core.PasswordGeneratorRequest
import com.bitwarden.sdk.ClientGenerators
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.mockk
import kotlinx.coroutines.runBlocking
import org.junit.Assert.assertEquals
import org.junit.Test
class GeneratorSdkSourceTest {
private val clientGenerators = mockk<ClientGenerators>()
private val generatorSdkSource: GeneratorSdkSource = GeneratorSdkSourceImpl(clientGenerators)
@Suppress("MaxLineLength")
@Test
fun `generatePassword should call SDK and return a Result with the generated password`() = runBlocking {
val request = PasswordGeneratorRequest(
lowercase = true,
uppercase = true,
numbers = true,
special = true,
length = 12.toUByte(),
avoidAmbiguous = false,
minLowercase = true,
minUppercase = true,
minNumber = true,
minSpecial = true,
)
val expectedResult = "GeneratedPassword123!"
coEvery {
clientGenerators.password(request)
} returns expectedResult
val result = generatorSdkSource.generatePassword(request)
assertEquals(Result.success(expectedResult), result)
coVerify {
clientGenerators.password(request)
}
}
}

View File

@@ -0,0 +1,76 @@
package com.x8bit.bitwarden.data.generator.repository
import com.bitwarden.core.PasswordGeneratorRequest
import com.x8bit.bitwarden.data.generator.datasource.sdk.GeneratorSdkSource
import com.x8bit.bitwarden.data.generator.repository.model.GeneratedPasswordResult
import io.mockk.clearMocks
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.mockk
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
class GeneratorRepositoryTest {
private val generatorSdkSource: GeneratorSdkSource = mockk()
private val repository = GeneratorRepositoryImpl(
generatorSdkSource = generatorSdkSource,
)
@BeforeEach
fun setUp() {
clearMocks(generatorSdkSource)
}
@Test
fun `generatePassword should emit Success result with the generated password`() = runTest {
val request = PasswordGeneratorRequest(
lowercase = true,
uppercase = true,
numbers = true,
special = true,
length = 12.toUByte(),
avoidAmbiguous = false,
minLowercase = null,
minUppercase = null,
minNumber = null,
minSpecial = null,
)
val expectedResult = "GeneratedPassword123!"
coEvery {
generatorSdkSource.generatePassword(request)
} returns Result.success(expectedResult)
val result = repository.generatePassword(request)
assertEquals(expectedResult, (result as GeneratedPasswordResult.Success).generatedString)
coVerify { generatorSdkSource.generatePassword(request) }
}
@Test
fun `generatePassword should emit InvalidRequest result when SDK throws exception`() = runTest {
val request = PasswordGeneratorRequest(
lowercase = true,
uppercase = true,
numbers = true,
special = true,
length = 12.toUByte(),
avoidAmbiguous = false,
minLowercase = null,
minUppercase = null,
minNumber = null,
minSpecial = null,
)
val exception = RuntimeException("An error occurred")
coEvery { generatorSdkSource.generatePassword(request) } returns Result.failure(exception)
val result = repository.generatePassword(request)
assertTrue(result is GeneratedPasswordResult.InvalidRequest)
coVerify { generatorSdkSource.generatePassword(request) }
}
}