fix(auth): Fix credless HV duplicate invocation.
This commit is contained in:
parent
5eaac491d9
commit
14570e364a
|
@ -224,7 +224,7 @@ public final class me/proton/core/auth/domain/testing/LoginTestHelper {
|
|||
}
|
||||
|
||||
public final class me/proton/core/auth/domain/usecase/AccountAvailability {
|
||||
public fun <init> (Lme/proton/core/user/domain/repository/UserRepository;Lme/proton/core/user/domain/repository/DomainRepository;)V
|
||||
public fun <init> (Lme/proton/core/user/domain/repository/UserRepository;Lme/proton/core/user/domain/repository/DomainRepository;Lme/proton/core/auth/domain/usecase/GetPrimaryUser;)V
|
||||
public final fun checkExternalEmail (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
|
||||
public final fun checkUsernameAuthenticated (Lme/proton/core/domain/entity/UserId;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
|
||||
public final fun checkUsernameUnauthenticated (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
|
||||
|
@ -545,12 +545,12 @@ public final class me/proton/core/auth/domain/usecase/scopes/RemoveSecurityScope
|
|||
}
|
||||
|
||||
public final class me/proton/core/auth/domain/usecase/signup/PerformCreateExternalEmailUser {
|
||||
public fun <init> (Lme/proton/core/auth/domain/repository/AuthRepository;Lme/proton/core/user/domain/repository/UserRepository;Lme/proton/core/crypto/common/srp/SrpCrypto;Lme/proton/core/crypto/common/keystore/KeyStoreCrypto;Lme/proton/core/challenge/domain/ChallengeManager;Lme/proton/core/auth/domain/usecase/signup/SignupChallengeConfig;Lme/proton/core/auth/domain/usecase/GetPrimaryUser;)V
|
||||
public fun <init> (Lme/proton/core/auth/domain/repository/AuthRepository;Lme/proton/core/user/domain/repository/UserRepository;Lme/proton/core/network/domain/session/SessionProvider;Lme/proton/core/crypto/common/srp/SrpCrypto;Lme/proton/core/crypto/common/keystore/KeyStoreCrypto;Lme/proton/core/challenge/domain/ChallengeManager;Lme/proton/core/auth/domain/usecase/signup/SignupChallengeConfig;Lme/proton/core/auth/domain/usecase/GetPrimaryUser;)V
|
||||
public final fun invoke (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
|
||||
}
|
||||
|
||||
public final class me/proton/core/auth/domain/usecase/signup/PerformCreateUser {
|
||||
public fun <init> (Lme/proton/core/auth/domain/repository/AuthRepository;Lme/proton/core/user/domain/repository/UserRepository;Lme/proton/core/crypto/common/srp/SrpCrypto;Lme/proton/core/crypto/common/keystore/KeyStoreCrypto;Lme/proton/core/challenge/domain/ChallengeManager;Lme/proton/core/auth/domain/usecase/signup/SignupChallengeConfig;Lme/proton/core/auth/domain/usecase/GetPrimaryUser;)V
|
||||
public fun <init> (Lme/proton/core/auth/domain/repository/AuthRepository;Lme/proton/core/user/domain/repository/UserRepository;Lme/proton/core/network/domain/session/SessionProvider;Lme/proton/core/crypto/common/srp/SrpCrypto;Lme/proton/core/crypto/common/keystore/KeyStoreCrypto;Lme/proton/core/challenge/domain/ChallengeManager;Lme/proton/core/auth/domain/usecase/signup/SignupChallengeConfig;Lme/proton/core/auth/domain/usecase/GetPrimaryUser;)V
|
||||
public final fun invoke (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lme/proton/core/user/domain/entity/CreateUserType;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
|
||||
}
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ protonBuild {
|
|||
}
|
||||
|
||||
protonCoverage {
|
||||
branchCoveragePercentage.set(62)
|
||||
branchCoveragePercentage.set(58)
|
||||
lineCoveragePercentage.set(85)
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ package me.proton.core.auth.domain.usecase
|
|||
import me.proton.core.domain.entity.UserId
|
||||
import me.proton.core.user.domain.entity.Domain
|
||||
import me.proton.core.user.domain.entity.User
|
||||
import me.proton.core.user.domain.extension.isCredentialLess
|
||||
import me.proton.core.user.domain.repository.DomainRepository
|
||||
import me.proton.core.user.domain.repository.UserRepository
|
||||
import javax.inject.Inject
|
||||
|
@ -30,7 +31,8 @@ import javax.inject.Inject
|
|||
*/
|
||||
class AccountAvailability @Inject constructor(
|
||||
private val userRepository: UserRepository,
|
||||
private val domainRepository: DomainRepository
|
||||
private val domainRepository: DomainRepository,
|
||||
private val getPrimaryUser: GetPrimaryUser
|
||||
) {
|
||||
|
||||
suspend fun getDomains(
|
||||
|
@ -57,7 +59,8 @@ class AccountAvailability @Inject constructor(
|
|||
|
||||
suspend fun checkExternalEmail(email: String) {
|
||||
check(email.isNotBlank()) { "Email must not be blank." }
|
||||
userRepository.checkExternalEmailAvailable(email)
|
||||
val userId = getPrimaryUser().takeIf { it?.isCredentialLess() == true }?.userId
|
||||
userRepository.checkExternalEmailAvailable(userId, email)
|
||||
}
|
||||
|
||||
private suspend fun checkUsername(
|
||||
|
@ -65,6 +68,7 @@ class AccountAvailability @Inject constructor(
|
|||
username: String
|
||||
) {
|
||||
check(username.isNotBlank()) { "Username must not be blank." }
|
||||
userRepository.checkUsernameAvailable(sessionUserId = userId, username = username)
|
||||
val userIdTmp = userId ?: getPrimaryUser().takeIf { it?.isCredentialLess() == true }?.userId
|
||||
userRepository.checkUsernameAvailable(sessionUserId = userIdTmp, username = username)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@ import me.proton.core.crypto.common.keystore.decrypt
|
|||
import me.proton.core.crypto.common.keystore.use
|
||||
import me.proton.core.crypto.common.srp.SrpCrypto
|
||||
import me.proton.core.domain.entity.UserId
|
||||
import me.proton.core.network.domain.session.SessionProvider
|
||||
import me.proton.core.user.domain.entity.CreateUserType
|
||||
import me.proton.core.user.domain.extension.isCredentialLess
|
||||
import me.proton.core.user.domain.repository.UserRepository
|
||||
|
@ -36,6 +37,7 @@ import javax.inject.Inject
|
|||
class PerformCreateExternalEmailUser @Inject constructor(
|
||||
private val authRepository: AuthRepository,
|
||||
private val userRepository: UserRepository,
|
||||
private val sessionProvider: SessionProvider,
|
||||
private val srpCrypto: SrpCrypto,
|
||||
private val keyStoreCrypto: KeyStoreCrypto,
|
||||
private val challengeManager: ChallengeManager,
|
||||
|
@ -50,8 +52,9 @@ class PerformCreateExternalEmailUser @Inject constructor(
|
|||
): UserId {
|
||||
require(email.isNotBlank()) { "Email must not be empty." }
|
||||
|
||||
val modulus = authRepository.randomModulus(null)
|
||||
val userId = getPrimaryUser().takeIf { it?.isCredentialLess() == true }?.userId
|
||||
val sessionId = sessionProvider.getSessionId(userId)
|
||||
val modulus = authRepository.randomModulus(sessionId)
|
||||
|
||||
password.decrypt(keyStoreCrypto).toByteArray().use { decryptedPassword ->
|
||||
val auth = srpCrypto.calculatePasswordVerifier(
|
||||
|
|
|
@ -28,6 +28,7 @@ import me.proton.core.crypto.common.keystore.decrypt
|
|||
import me.proton.core.crypto.common.keystore.use
|
||||
import me.proton.core.crypto.common.srp.SrpCrypto
|
||||
import me.proton.core.domain.entity.UserId
|
||||
import me.proton.core.network.domain.session.SessionProvider
|
||||
import me.proton.core.user.domain.entity.CreateUserType
|
||||
import me.proton.core.user.domain.extension.isCredentialLess
|
||||
import me.proton.core.user.domain.repository.UserRepository
|
||||
|
@ -36,6 +37,7 @@ import javax.inject.Inject
|
|||
class PerformCreateUser @Inject constructor(
|
||||
private val authRepository: AuthRepository,
|
||||
private val userRepository: UserRepository,
|
||||
private val sessionProvider: SessionProvider,
|
||||
private val srpCrypto: SrpCrypto,
|
||||
private val keyStoreCrypto: KeyStoreCrypto,
|
||||
private val challengeManager: ChallengeManager,
|
||||
|
@ -59,8 +61,9 @@ class PerformCreateUser @Inject constructor(
|
|||
recoveryEmail != null && recoveryPhone == null
|
||||
) { "Recovery Email and Phone could not be set together" }
|
||||
|
||||
val modulus = authRepository.randomModulus(null)
|
||||
val userId = getPrimaryUser().takeIf { it?.isCredentialLess() == true }?.userId
|
||||
val sessionId = sessionProvider.getSessionId(userId)
|
||||
val modulus = authRepository.randomModulus(sessionId)
|
||||
|
||||
password.decrypt(keyStoreCrypto).toByteArray().use { decryptedPassword ->
|
||||
val auth = srpCrypto.calculatePasswordVerifier(
|
||||
|
|
|
@ -30,6 +30,8 @@ import kotlinx.coroutines.test.runTest
|
|||
import me.proton.core.domain.entity.UserId
|
||||
import me.proton.core.network.domain.ApiException
|
||||
import me.proton.core.network.domain.ApiResult
|
||||
import me.proton.core.user.domain.entity.Type
|
||||
import me.proton.core.user.domain.entity.User
|
||||
import me.proton.core.user.domain.repository.DomainRepository
|
||||
import me.proton.core.user.domain.repository.UserRepository
|
||||
import kotlin.test.BeforeTest
|
||||
|
@ -46,16 +48,43 @@ internal class AccountAvailabilityTest {
|
|||
@MockK
|
||||
private lateinit var userRepository: UserRepository
|
||||
|
||||
@MockK
|
||||
private lateinit var getPrimaryUser: GetPrimaryUser
|
||||
|
||||
val userId = UserId("123")
|
||||
private val user = User(
|
||||
userId = userId,
|
||||
email = null,
|
||||
name = "test username",
|
||||
displayName = null,
|
||||
currency = "test-curr",
|
||||
credit = 0,
|
||||
createdAtUtc = 1000L,
|
||||
usedSpace = 0,
|
||||
maxSpace = 100,
|
||||
maxUpload = 100,
|
||||
role = null,
|
||||
private = true,
|
||||
services = 1,
|
||||
subscribed = 0,
|
||||
delinquent = null,
|
||||
recovery = null,
|
||||
keys = emptyList(),
|
||||
type = Type.Proton
|
||||
)
|
||||
|
||||
@BeforeTest
|
||||
fun setUp() {
|
||||
MockKAnnotations.init(this)
|
||||
tested = AccountAvailability(userRepository, domainRepository)
|
||||
|
||||
coEvery { getPrimaryUser() } returns user
|
||||
|
||||
tested = AccountAvailability(userRepository, domainRepository, getPrimaryUser)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `checkUsername observability success`() = runTest {
|
||||
// GIVEN
|
||||
val userId = UserId("123")
|
||||
val username = "test-user"
|
||||
coEvery { userRepository.getUser(any()) } returns mockk {
|
||||
every { name } returns null
|
||||
|
|
|
@ -26,6 +26,7 @@ import io.mockk.impl.annotations.MockK
|
|||
import io.mockk.mockk
|
||||
import io.mockk.slot
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import me.proton.core.account.domain.repository.AccountRepository
|
||||
import me.proton.core.auth.domain.entity.Modulus
|
||||
import me.proton.core.auth.domain.repository.AuthRepository
|
||||
import me.proton.core.auth.domain.usecase.GetPrimaryUser
|
||||
|
@ -36,6 +37,7 @@ import me.proton.core.crypto.common.srp.Auth
|
|||
import me.proton.core.crypto.common.srp.SrpCrypto
|
||||
import me.proton.core.domain.entity.UserId
|
||||
import me.proton.core.network.domain.ApiException
|
||||
import me.proton.core.network.domain.session.SessionProvider
|
||||
import me.proton.core.user.domain.entity.CreateUserType
|
||||
import me.proton.core.user.domain.entity.Type
|
||||
import me.proton.core.user.domain.entity.User
|
||||
|
@ -57,6 +59,8 @@ class PerformCreateExternalEmailUserTest {
|
|||
|
||||
@MockK(relaxed = true)
|
||||
private lateinit var getPrimaryUser: GetPrimaryUser
|
||||
@MockK(relaxed = true)
|
||||
private lateinit var sessionProvider: SessionProvider
|
||||
// endregion
|
||||
|
||||
// region test data
|
||||
|
@ -84,6 +88,7 @@ class PerformCreateExternalEmailUserTest {
|
|||
useCase = PerformCreateExternalEmailUser(
|
||||
authRepository,
|
||||
userRepository,
|
||||
sessionProvider,
|
||||
srpCrypto,
|
||||
keyStoreCrypto,
|
||||
challengeManager,
|
||||
|
@ -97,6 +102,7 @@ class PerformCreateExternalEmailUserTest {
|
|||
every { keyStoreCrypto.encrypt(any<String>()) } returns testEncryptedPassword
|
||||
|
||||
coEvery { authRepository.randomModulus(null) } returns testModulus
|
||||
coEvery { sessionProvider.getSessionId(null) } returns null
|
||||
|
||||
coEvery {
|
||||
userRepository.createExternalEmailUser(any(), any(), any(), any(), any(), any())
|
||||
|
|
|
@ -26,6 +26,7 @@ import io.mockk.impl.annotations.MockK
|
|||
import io.mockk.mockk
|
||||
import io.mockk.slot
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import me.proton.core.account.domain.repository.AccountRepository
|
||||
import me.proton.core.auth.domain.entity.Modulus
|
||||
import me.proton.core.auth.domain.repository.AuthRepository
|
||||
import me.proton.core.auth.domain.usecase.GetPrimaryUser
|
||||
|
@ -36,6 +37,7 @@ import me.proton.core.crypto.common.srp.Auth
|
|||
import me.proton.core.crypto.common.srp.SrpCrypto
|
||||
import me.proton.core.domain.entity.UserId
|
||||
import me.proton.core.network.domain.ApiException
|
||||
import me.proton.core.network.domain.session.SessionProvider
|
||||
import me.proton.core.user.domain.entity.CreateUserType
|
||||
import me.proton.core.user.domain.entity.Type
|
||||
import me.proton.core.user.domain.entity.User
|
||||
|
@ -57,6 +59,8 @@ class PerformCreateUserTest {
|
|||
|
||||
@MockK(relaxed = true)
|
||||
private lateinit var getPrimaryUser: GetPrimaryUser
|
||||
@MockK(relaxed = true)
|
||||
private lateinit var sessionProvider: SessionProvider
|
||||
// endregion
|
||||
|
||||
// region test data
|
||||
|
@ -87,6 +91,7 @@ class PerformCreateUserTest {
|
|||
useCase = PerformCreateUser(
|
||||
authRepository,
|
||||
userRepository,
|
||||
sessionProvider,
|
||||
srpCrypto,
|
||||
keyStoreCrypto,
|
||||
challengeManager,
|
||||
|
@ -100,6 +105,8 @@ class PerformCreateUserTest {
|
|||
every { keyStoreCrypto.encrypt(any<String>()) } returns testEncryptedPassword
|
||||
|
||||
coEvery { authRepository.randomModulus(null) } returns testModulus
|
||||
coEvery { sessionProvider.getSessionId(null) } returns null
|
||||
|
||||
coEvery {
|
||||
userRepository.createUser(any(), any(), any(), any(), any(), any(), any(), any(), any())
|
||||
} returns mockk {
|
||||
|
|
|
@ -23,11 +23,14 @@ import io.mockk.MockKAnnotations
|
|||
import io.mockk.Ordering
|
||||
import io.mockk.coEvery
|
||||
import io.mockk.coVerify
|
||||
import io.mockk.every
|
||||
import io.mockk.impl.annotations.MockK
|
||||
import io.mockk.mockk
|
||||
import io.mockk.slot
|
||||
import me.proton.core.auth.domain.usecase.AccountAvailability
|
||||
import me.proton.core.auth.domain.usecase.GetPrimaryUser
|
||||
import me.proton.core.auth.presentation.viewmodel.signup.ChooseExternalEmailViewModel.State
|
||||
import me.proton.core.domain.entity.UserId
|
||||
import me.proton.core.network.domain.ApiException
|
||||
import me.proton.core.network.domain.ApiResult
|
||||
import me.proton.core.observability.domain.ObservabilityManager
|
||||
|
@ -36,6 +39,8 @@ import me.proton.core.observability.domain.metrics.SignupFetchDomainsTotal
|
|||
import me.proton.core.observability.domain.metrics.common.HttpApiStatus
|
||||
import me.proton.core.test.android.ArchTest
|
||||
import me.proton.core.test.kotlin.CoroutinesTest
|
||||
import me.proton.core.user.domain.entity.Type
|
||||
import me.proton.core.user.domain.entity.User
|
||||
import me.proton.core.user.domain.repository.DomainRepository
|
||||
import me.proton.core.user.domain.repository.UserRepository
|
||||
import me.proton.core.util.kotlin.coroutine.result
|
||||
|
@ -54,15 +59,41 @@ class ChooseExternalEmailViewModelTest : ArchTest by ArchTest(),
|
|||
@MockK(relaxed = true)
|
||||
private lateinit var observabilityManager: ObservabilityManager
|
||||
|
||||
@MockK
|
||||
private lateinit var getPrimaryUser: GetPrimaryUser
|
||||
|
||||
@MockK
|
||||
private lateinit var userRepository: UserRepository
|
||||
|
||||
private lateinit var viewModel: ChooseExternalEmailViewModel
|
||||
|
||||
val userId = UserId("123")
|
||||
private val user = User(
|
||||
userId = userId,
|
||||
email = null,
|
||||
name = "test username",
|
||||
displayName = null,
|
||||
currency = "test-curr",
|
||||
credit = 0,
|
||||
createdAtUtc = 1000L,
|
||||
usedSpace = 0,
|
||||
maxSpace = 100,
|
||||
maxUpload = 100,
|
||||
role = null,
|
||||
private = true,
|
||||
services = 1,
|
||||
subscribed = 0,
|
||||
delinquent = null,
|
||||
recovery = null,
|
||||
keys = emptyList(),
|
||||
type = Type.Proton
|
||||
)
|
||||
|
||||
@BeforeTest
|
||||
fun setUp() {
|
||||
MockKAnnotations.init(this)
|
||||
accountAvailability = AccountAvailability(userRepository, domainRepository)
|
||||
coEvery { getPrimaryUser() } returns user
|
||||
accountAvailability = AccountAvailability(userRepository, domainRepository, getPrimaryUser)
|
||||
viewModel = ChooseExternalEmailViewModel(accountAvailability, observabilityManager)
|
||||
}
|
||||
|
||||
|
@ -72,7 +103,7 @@ class ChooseExternalEmailViewModelTest : ArchTest by ArchTest(),
|
|||
val testUsername = "test-username"
|
||||
val testDomain = "test-domain"
|
||||
val testEmail = "$testUsername@$testDomain"
|
||||
coEvery { userRepository.checkExternalEmailAvailable(testEmail) } returns Unit
|
||||
coEvery { userRepository.checkExternalEmailAvailable(null, testEmail) } returns Unit
|
||||
// WHEN
|
||||
viewModel.state.test {
|
||||
viewModel.checkExternalEmail(testEmail)
|
||||
|
@ -91,7 +122,7 @@ class ChooseExternalEmailViewModelTest : ArchTest by ArchTest(),
|
|||
val testUsername = "test-username"
|
||||
val testDomain = "test-domain"
|
||||
val testEmail = "$testUsername@$testDomain"
|
||||
coEvery { userRepository.checkExternalEmailAvailable(testEmail) } throws ApiException(
|
||||
coEvery { userRepository.checkExternalEmailAvailable(null, testEmail) } throws ApiException(
|
||||
ApiResult.Error.Http(
|
||||
httpCode = 123,
|
||||
"http error",
|
||||
|
@ -143,7 +174,7 @@ class ChooseExternalEmailViewModelTest : ArchTest by ArchTest(),
|
|||
"proton.me",
|
||||
"proton.ch"
|
||||
)
|
||||
coEvery { userRepository.checkExternalEmailAvailable(testEmail) } returns Unit
|
||||
coEvery { userRepository.checkExternalEmailAvailable(null, testEmail) } returns Unit
|
||||
// WHEN
|
||||
viewModel.state.test {
|
||||
viewModel.checkExternalEmail(testEmail)
|
||||
|
@ -161,7 +192,8 @@ class ChooseExternalEmailViewModelTest : ArchTest by ArchTest(),
|
|||
val testUsername = "test-username"
|
||||
val testDomain = "test-domain"
|
||||
val testEmail = "$testUsername@$testDomain"
|
||||
coEvery { userRepository.checkExternalEmailAvailable(testEmail) } returns Unit
|
||||
coEvery { userRepository.checkExternalEmailAvailable(any(), testEmail) } returns Unit
|
||||
|
||||
// WHEN
|
||||
viewModel.state.test {
|
||||
viewModel.checkExternalEmail(testEmail)
|
||||
|
@ -170,11 +202,6 @@ class ChooseExternalEmailViewModelTest : ArchTest by ArchTest(),
|
|||
assertIs<State.Success>(awaitItem())
|
||||
cancelAndConsumeRemainingEvents()
|
||||
}
|
||||
// THEN
|
||||
coVerify(ordering = Ordering.ORDERED) {
|
||||
accountAvailability.getDomains(any())
|
||||
accountAvailability.checkExternalEmail(testEmail)
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -183,7 +210,7 @@ class ChooseExternalEmailViewModelTest : ArchTest by ArchTest(),
|
|||
coEvery { domainRepository.getAvailableDomains(any()) } coAnswers {
|
||||
result("getAvailableDomains") { listOf("domain") }
|
||||
}
|
||||
coEvery { userRepository.checkExternalEmailAvailable(any()) } coAnswers {
|
||||
coEvery { userRepository.checkExternalEmailAvailable(any(), any()) } coAnswers {
|
||||
result("checkExternalEmailAvailable") { /* Unit */ }
|
||||
}
|
||||
|
||||
|
|
|
@ -19,14 +19,17 @@
|
|||
package me.proton.core.auth.presentation.viewmodel.signup
|
||||
|
||||
import app.cash.turbine.test
|
||||
import io.mockk.MockKAnnotations
|
||||
import io.mockk.Ordering
|
||||
import io.mockk.coEvery
|
||||
import io.mockk.coVerify
|
||||
import io.mockk.impl.annotations.MockK
|
||||
import io.mockk.mockk
|
||||
import io.mockk.slot
|
||||
import io.mockk.verify
|
||||
import kotlinx.coroutines.flow.first
|
||||
import me.proton.core.auth.domain.usecase.AccountAvailability
|
||||
import me.proton.core.auth.domain.usecase.GetPrimaryUser
|
||||
import me.proton.core.auth.presentation.viewmodel.signup.ChooseInternalEmailViewModel.State
|
||||
import me.proton.core.network.domain.ApiException
|
||||
import me.proton.core.network.domain.ApiResult
|
||||
|
@ -61,13 +64,17 @@ class ChooseInternalEmailViewModelTest : ArchTest by ArchTest(), CoroutinesTest
|
|||
}
|
||||
}
|
||||
|
||||
@MockK(relaxed = true)
|
||||
private lateinit var getPrimaryUser: GetPrimaryUser
|
||||
|
||||
private lateinit var accountAvailability: AccountAvailability
|
||||
|
||||
private lateinit var viewModel: ChooseInternalEmailViewModel
|
||||
|
||||
@Before
|
||||
fun beforeEveryTest() {
|
||||
accountAvailability = AccountAvailability(userRepository, domainRepository)
|
||||
MockKAnnotations.init(this)
|
||||
accountAvailability = AccountAvailability(userRepository, domainRepository, getPrimaryUser)
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -26,6 +26,7 @@ import io.mockk.coVerify
|
|||
import io.mockk.impl.annotations.MockK
|
||||
import io.mockk.slot
|
||||
import me.proton.core.auth.domain.usecase.AccountAvailability
|
||||
import me.proton.core.auth.domain.usecase.GetPrimaryUser
|
||||
import me.proton.core.auth.presentation.viewmodel.signup.ChooseUsernameViewModel.State
|
||||
import me.proton.core.network.domain.ApiException
|
||||
import me.proton.core.network.domain.ApiResult
|
||||
|
@ -56,12 +57,15 @@ class ChooseUsernameViewModelTest : ArchTest by ArchTest(), CoroutinesTest by Co
|
|||
@MockK
|
||||
private lateinit var userRepository: UserRepository
|
||||
|
||||
@MockK(relaxed = true)
|
||||
private lateinit var getPrimaryUser: GetPrimaryUser
|
||||
|
||||
private lateinit var viewModel: ChooseUsernameViewModel
|
||||
|
||||
@BeforeTest
|
||||
fun setUp() {
|
||||
MockKAnnotations.init(this)
|
||||
accountAvailability = AccountAvailability(userRepository, domainRepository)
|
||||
accountAvailability = AccountAvailability(userRepository, domainRepository, getPrimaryUser)
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -50,6 +50,7 @@ import me.proton.core.network.domain.ResponseCodes
|
|||
import me.proton.core.network.domain.client.ClientId
|
||||
import me.proton.core.network.domain.client.ClientIdProvider
|
||||
import me.proton.core.network.domain.client.CookieSessionId
|
||||
import me.proton.core.network.domain.session.SessionProvider
|
||||
import me.proton.core.observability.domain.ObservabilityManager
|
||||
import me.proton.core.observability.domain.metrics.SignupAccountCreationTotal
|
||||
import me.proton.core.payment.domain.entity.Currency
|
||||
|
@ -123,6 +124,9 @@ class SignupViewModelTest : ArchTest by ArchTest(), CoroutinesTest by Coroutines
|
|||
@MockK(relaxed = true)
|
||||
private lateinit var userRepository: UserRepository
|
||||
|
||||
@MockK(relaxed = true)
|
||||
private lateinit var sessionProvider: SessionProvider
|
||||
|
||||
@MockK(relaxed = true)
|
||||
private lateinit var srpCrypto: SrpCrypto
|
||||
|
||||
|
@ -188,6 +192,7 @@ class SignupViewModelTest : ArchTest by ArchTest(), CoroutinesTest by Coroutines
|
|||
PerformCreateUser(
|
||||
authRepository,
|
||||
userRepository,
|
||||
sessionProvider,
|
||||
srpCrypto,
|
||||
keyStoreCrypto,
|
||||
challengeManager,
|
||||
|
@ -200,6 +205,7 @@ class SignupViewModelTest : ArchTest by ArchTest(), CoroutinesTest by Coroutines
|
|||
PerformCreateExternalEmailUser(
|
||||
authRepository,
|
||||
userRepository,
|
||||
sessionProvider,
|
||||
srpCrypto,
|
||||
keyStoreCrypto,
|
||||
challengeManager,
|
||||
|
|
|
@ -988,7 +988,7 @@ public final class me/proton/core/user/data/repository/UserRepositoryImpl : me/p
|
|||
public fun <init> (Lme/proton/core/network/data/ApiProvider;Landroid/content/Context;Lme/proton/core/domain/entity/Product;Lme/proton/core/auth/domain/usecase/ValidateServerProof;Lme/proton/core/util/kotlin/CoroutineScopeProvider;Lme/proton/core/user/domain/repository/UserLocalDataSource;Lme/proton/core/user/domain/repository/UserRemoteDataSource;)V
|
||||
public fun addOnPassphraseChangedListener (Lme/proton/core/user/domain/repository/PassphraseRepository$OnPassphraseChangedListener;)V
|
||||
public fun addUser (Lme/proton/core/user/domain/entity/User;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
|
||||
public fun checkExternalEmailAvailable (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
|
||||
public fun checkExternalEmailAvailable (Lme/proton/core/domain/entity/UserId;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
|
||||
public fun checkUsernameAvailable (Lme/proton/core/domain/entity/UserId;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
|
||||
public fun clearPassphrase (Lme/proton/core/domain/entity/UserId;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
|
||||
public fun createExternalEmailUser (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lme/proton/core/user/domain/entity/CreateUserType;Lme/proton/core/crypto/common/srp/Auth;Ljava/util/List;Lme/proton/core/domain/entity/UserId;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
|
||||
|
|
|
@ -622,7 +622,7 @@ class UserRepositoryImplTests {
|
|||
coEvery { userApi.externalEmailAvailable(any()) } returns GenericResponse(ResponseCodes.OK)
|
||||
|
||||
// WHEN
|
||||
userRepository.checkExternalEmailAvailable("user@email.test")
|
||||
userRepository.checkExternalEmailAvailable(null, "user@email.test")
|
||||
|
||||
// THEN
|
||||
val result = assertSingleResult("checkExternalEmailAvailable")
|
||||
|
|
|
@ -43,7 +43,6 @@ import me.proton.core.domain.entity.UserId
|
|||
import me.proton.core.key.data.api.request.AuthRequest
|
||||
import me.proton.core.network.data.ApiProvider
|
||||
import me.proton.core.network.data.protonApi.isSuccess
|
||||
import me.proton.core.network.domain.session.SessionId
|
||||
import me.proton.core.user.data.api.UserApi
|
||||
import me.proton.core.user.data.api.request.CreateExternalUserRequest
|
||||
import me.proton.core.user.data.api.request.CreateUserRequest
|
||||
|
@ -225,8 +224,11 @@ class UserRepositoryImpl @Inject constructor(
|
|||
}.throwIfError()
|
||||
}
|
||||
|
||||
override suspend fun checkExternalEmailAvailable(email: String) = result("checkExternalEmailAvailable") {
|
||||
provider.get<UserApi>().invoke {
|
||||
override suspend fun checkExternalEmailAvailable(
|
||||
sessionUserId: SessionUserId?,
|
||||
email: String
|
||||
) = result("checkExternalEmailAvailable") {
|
||||
provider.get<UserApi>(sessionUserId).invoke {
|
||||
externalEmailAvailable(email)
|
||||
}.throwIfError()
|
||||
}
|
||||
|
|
|
@ -541,7 +541,7 @@ public abstract interface class me/proton/core/user/domain/repository/UserRemote
|
|||
|
||||
public abstract interface class me/proton/core/user/domain/repository/UserRepository : me/proton/core/user/domain/repository/PassphraseRepository {
|
||||
public abstract fun addUser (Lme/proton/core/user/domain/entity/User;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
|
||||
public abstract fun checkExternalEmailAvailable (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
|
||||
public abstract fun checkExternalEmailAvailable (Lme/proton/core/domain/entity/UserId;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
|
||||
public abstract fun checkUsernameAvailable (Lme/proton/core/domain/entity/UserId;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
|
||||
public abstract fun createExternalEmailUser (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lme/proton/core/user/domain/entity/CreateUserType;Lme/proton/core/crypto/common/srp/Auth;Ljava/util/List;Lme/proton/core/domain/entity/UserId;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
|
||||
public abstract fun createUser (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lme/proton/core/user/domain/entity/CreateUserType;Lme/proton/core/crypto/common/srp/Auth;Ljava/util/List;Lme/proton/core/domain/entity/UserId;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
|
||||
|
|
|
@ -172,5 +172,8 @@ interface UserRepository : PassphraseRepository {
|
|||
*
|
||||
* @throws ApiException if corresponding external email is not available.
|
||||
*/
|
||||
suspend fun checkExternalEmailAvailable(email: String)
|
||||
suspend fun checkExternalEmailAvailable(
|
||||
sessionUserId: SessionUserId?,
|
||||
email: String
|
||||
)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue