This commit is contained in:
Benoit Marty 2025-11-06 14:23:41 +01:00
parent cee6475eb8
commit 4cc5cf0084
6 changed files with 111 additions and 59 deletions

View file

@ -18,6 +18,7 @@ import io.element.android.features.wellknown.test.FakeWellknownRetriever
import io.element.android.features.wellknown.test.anElementWellKnown
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.core.uri.ensureProtocol
import io.element.android.libraries.matrix.test.AN_EXCEPTION
import io.element.android.libraries.matrix.test.A_HOMESERVER
import io.element.android.libraries.matrix.test.A_HOMESERVER_URL
import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationService
@ -46,7 +47,11 @@ class ChangeServerPresenterTest {
@Test
fun `present - change server ok`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.success(A_HOMESERVER)
},
)
createPresenter(
authenticationService = authenticationService,
enterpriseService = FakeEnterpriseService(
@ -55,7 +60,6 @@ class ChangeServerPresenterTest {
).test {
val initialState = awaitItem()
assertThat(initialState.changeServerAction).isEqualTo(AsyncData.Uninitialized)
authenticationService.givenHomeserver(A_HOMESERVER)
initialState.eventSink.invoke(ChangeServerEvents.ChangeServer(AccountProvider(url = A_HOMESERVER_URL)))
val loadingState = awaitItem()
assertThat(loadingState.changeServerAction).isInstanceOf(AsyncData.Loading::class.java)
@ -66,10 +70,16 @@ class ChangeServerPresenterTest {
@Test
fun `present - change server error`() = runTest {
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.failure(AN_EXCEPTION)
},
)
createPresenter(
enterpriseService = FakeEnterpriseService(
isAllowedToConnectToHomeserverResult = { true },
),
authenticationService = authenticationService,
).test {
val initialState = awaitItem()
assertThat(initialState.changeServerAction).isEqualTo(AsyncData.Uninitialized)

View file

@ -95,7 +95,11 @@ class ChooseAccountProviderPresenterTest {
@Test
fun `present - select account provider and continue - error then clear error`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.failure(AN_EXCEPTION)
},
)
val presenter = createPresenter(
enterpriseService = FakeEnterpriseService(
defaultHomeserverListResult = { listOf(ACCOUNT_PROVIDER_FROM_CONFIG_1, ACCOUNT_PROVIDER_FROM_CONFIG_2) },
@ -111,7 +115,6 @@ class ChooseAccountProviderPresenterTest {
}
awaitItem().also {
assertThat(it.selectedAccountProvider).isEqualTo(accountProvider1)
authenticationService.givenChangeServerError(AN_EXCEPTION)
it.eventSink(ChooseAccountProviderEvents.Continue)
skipItems(1) // Loading

View file

@ -53,11 +53,14 @@ class ConfirmAccountProviderPresenterTest {
@Test
fun `present - continue password login`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.success(A_HOMESERVER)
},
)
val presenter = createConfirmAccountProviderPresenter(
matrixAuthenticationService = authenticationService,
)
authenticationService.givenHomeserver(A_HOMESERVER)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
@ -75,11 +78,14 @@ class ConfirmAccountProviderPresenterTest {
@Test
fun `present - continue oidc`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.success(A_HOMESERVER_OIDC)
},
)
val presenter = createConfirmAccountProviderPresenter(
matrixAuthenticationService = authenticationService,
)
authenticationService.givenHomeserver(A_HOMESERVER_OIDC)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
@ -97,13 +103,16 @@ class ConfirmAccountProviderPresenterTest {
@Test
fun `present - oidc - cancel with failure`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.success(A_HOMESERVER_OIDC)
},
)
val defaultOidcActionFlow = FakeOidcActionFlow()
val presenter = createConfirmAccountProviderPresenter(
matrixAuthenticationService = authenticationService,
defaultOidcActionFlow = defaultOidcActionFlow,
)
authenticationService.givenHomeserver(A_HOMESERVER_OIDC)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
@ -125,13 +134,16 @@ class ConfirmAccountProviderPresenterTest {
@Test
fun `present - oidc - cancel with success`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.success(A_HOMESERVER_OIDC)
},
)
val defaultOidcActionFlow = FakeOidcActionFlow()
val presenter = createConfirmAccountProviderPresenter(
matrixAuthenticationService = authenticationService,
defaultOidcActionFlow = defaultOidcActionFlow,
)
authenticationService.givenHomeserver(A_HOMESERVER_OIDC)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
@ -152,13 +164,16 @@ class ConfirmAccountProviderPresenterTest {
@Test
fun `present - oidc - cancel to unblock`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.success(A_HOMESERVER_OIDC)
},
)
val defaultOidcActionFlow = FakeOidcActionFlow()
val presenter = createConfirmAccountProviderPresenter(
matrixAuthenticationService = authenticationService,
defaultOidcActionFlow = defaultOidcActionFlow,
)
authenticationService.givenHomeserver(A_HOMESERVER_OIDC)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
@ -175,13 +190,16 @@ class ConfirmAccountProviderPresenterTest {
@Test
fun `present - oidc - success with failure`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.success(A_HOMESERVER_OIDC)
},
)
val defaultOidcActionFlow = FakeOidcActionFlow()
val presenter = createConfirmAccountProviderPresenter(
matrixAuthenticationService = authenticationService,
defaultOidcActionFlow = defaultOidcActionFlow,
)
authenticationService.givenHomeserver(A_HOMESERVER_OIDC)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
@ -205,13 +223,16 @@ class ConfirmAccountProviderPresenterTest {
@Test
fun `present - oidc - success with success`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.success(A_HOMESERVER_OIDC)
},
)
val defaultOidcActionFlow = FakeOidcActionFlow()
val presenter = createConfirmAccountProviderPresenter(
matrixAuthenticationService = authenticationService,
defaultOidcActionFlow = defaultOidcActionFlow,
)
authenticationService.givenHomeserver(A_HOMESERVER_OIDC)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
@ -232,7 +253,11 @@ class ConfirmAccountProviderPresenterTest {
@Test
fun `present - submit fails`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.failure(AN_EXCEPTION)
},
)
val presenter = createConfirmAccountProviderPresenter(
matrixAuthenticationService = authenticationService,
)
@ -240,7 +265,6 @@ class ConfirmAccountProviderPresenterTest {
presenter.present()
}.test {
val initialState = awaitItem()
authenticationService.givenChangeServerError(RuntimeException())
initialState.eventSink.invoke(ConfirmAccountProviderEvents.Continue)
skipItems(1) // Loading
val failureState = awaitItem()
@ -251,7 +275,11 @@ class ConfirmAccountProviderPresenterTest {
@Test
fun `present - clear error`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.failure(AN_EXCEPTION)
},
)
val presenter = createConfirmAccountProviderPresenter(
matrixAuthenticationService = authenticationService,
)
@ -261,7 +289,6 @@ class ConfirmAccountProviderPresenterTest {
val initialState = awaitItem()
// Submit will return an error
authenticationService.givenChangeServerError(AN_EXCEPTION)
initialState.eventSink(ConfirmAccountProviderEvents.Continue)
skipItems(1) // Loading
@ -279,8 +306,11 @@ class ConfirmAccountProviderPresenterTest {
@Test
fun `present - confirm account creation without oidc and without url generates an error`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
authenticationService.givenHomeserver(A_HOMESERVER)
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.success(A_HOMESERVER)
},
)
val presenter = createConfirmAccountProviderPresenter(
params = ConfirmAccountProviderPresenter.Params(isAccountCreation = true),
matrixAuthenticationService = authenticationService,
@ -306,8 +336,11 @@ class ConfirmAccountProviderPresenterTest {
@Test
fun `present - confirm account creation with oidc is successful`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
authenticationService.givenHomeserver(A_HOMESERVER_OIDC)
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.success(A_HOMESERVER_OIDC)
},
)
val presenter = createConfirmAccountProviderPresenter(
params = ConfirmAccountProviderPresenter.Params(isAccountCreation = true),
matrixAuthenticationService = authenticationService,
@ -327,8 +360,11 @@ class ConfirmAccountProviderPresenterTest {
@Test
fun `present - confirm account creation with oidc and url continues with oidc`() = runTest {
val aUrl = "aUrl"
val authenticationService = FakeMatrixAuthenticationService()
authenticationService.givenHomeserver(A_HOMESERVER_OIDC)
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.success(A_HOMESERVER_OIDC)
},
)
val presenter = createConfirmAccountProviderPresenter(
params = ConfirmAccountProviderPresenter.Params(isAccountCreation = true),
matrixAuthenticationService = authenticationService,
@ -349,8 +385,11 @@ class ConfirmAccountProviderPresenterTest {
@Test
fun `present - confirm account creation without oidc and with url continuing with url`() = runTest {
val aUrl = "aUrl"
val authenticationService = FakeMatrixAuthenticationService()
authenticationService.givenHomeserver(A_HOMESERVER)
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.success(A_HOMESERVER)
},
)
val presenter = createConfirmAccountProviderPresenter(
params = ConfirmAccountProviderPresenter.Params(isAccountCreation = true),
matrixAuthenticationService = authenticationService,

View file

@ -42,8 +42,11 @@ class LoginPasswordPresenterTest {
@Test
fun `present - enter login and password`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
authenticationService.givenHomeserver(A_HOMESERVER)
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.success(A_HOMESERVER)
},
)
createLoginPasswordPresenter(
authenticationService = authenticationService,
).test {
@ -61,8 +64,11 @@ class LoginPasswordPresenterTest {
@Test
fun `present - submit`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
authenticationService.givenHomeserver(A_HOMESERVER)
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.success(A_HOMESERVER)
},
)
createLoginPasswordPresenter(
authenticationService = authenticationService,
).test {
@ -81,8 +87,11 @@ class LoginPasswordPresenterTest {
@Test
fun `present - submit with error`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
authenticationService.givenHomeserver(A_HOMESERVER)
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.success(A_HOMESERVER)
},
)
createLoginPasswordPresenter(
authenticationService = authenticationService,
).test {
@ -102,8 +111,11 @@ class LoginPasswordPresenterTest {
@Test
fun `present - clear error`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
authenticationService.givenHomeserver(A_HOMESERVER)
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.success(A_HOMESERVER)
},
)
createLoginPasswordPresenter(
authenticationService = authenticationService,
).test {

View file

@ -214,7 +214,11 @@ class OnBoardingPresenterTest {
@Test
fun `present - default account provider - login and clear error`() = runTest {
val authenticationService = FakeMatrixAuthenticationService()
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.failure(AN_EXCEPTION)
},
)
val presenter = createPresenter(
params = OnBoardingNode.Params(
accountProvider = A_HOMESERVER_URL,
@ -231,7 +235,6 @@ class OnBoardingPresenterTest {
skipItems(3)
awaitItem().also {
assertThat(it.defaultAccountProvider).isEqualTo(A_HOMESERVER_URL)
authenticationService.givenChangeServerError(AN_EXCEPTION)
it.eventSink(OnBoardingEvents.OnSignIn(A_HOMESERVER_URL))
skipItems(1) // Loading

View file

@ -22,8 +22,6 @@ import io.element.android.libraries.matrix.test.FakeMatrixClient
import io.element.android.tests.testutils.lambda.lambdaError
import io.element.android.tests.testutils.lambda.lambdaRecorder
import io.element.android.tests.testutils.simulateLongTask
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
val A_OIDC_DATA = OidcDetails(url = "a-url")
@ -31,13 +29,12 @@ class FakeMatrixAuthenticationService(
var matrixClientResult: ((SessionId) -> Result<MatrixClient>)? = null,
var loginWithQrCodeResult: (qrCodeData: MatrixQrCodeLoginData, progress: (QrCodeLoginStep) -> Unit) -> Result<SessionId> =
lambdaRecorder<MatrixQrCodeLoginData, (QrCodeLoginStep) -> Unit, Result<SessionId>> { _, _ -> Result.success(A_SESSION_ID) },
private val importCreatedSessionLambda: (ExternalSession) -> Result<SessionId> = { lambdaError() }
private val importCreatedSessionLambda: (ExternalSession) -> Result<SessionId> = { lambdaError() },
private val setHomeserverResult: (String) -> Result<MatrixHomeServerDetails> = { lambdaError() },
) : MatrixAuthenticationService {
private val homeserver = MutableStateFlow<MatrixHomeServerDetails?>(null)
private var oidcError: Throwable? = null
private var oidcCancelError: Throwable? = null
private var loginError: Throwable? = null
private var changeServerError: Throwable? = null
private var matrixClient: MatrixClient? = null
private var onAuthenticationListener: ((MatrixClient) -> Unit)? = null
@ -53,16 +50,8 @@ class FakeMatrixAuthenticationService(
}
}
override fun getHomeserverDetails(): StateFlow<MatrixHomeServerDetails?> {
return homeserver
}
fun givenHomeserver(homeserver: MatrixHomeServerDetails) {
this.homeserver.value = homeserver
}
override suspend fun setHomeserver(homeserver: String): Result<Unit> = simulateLongTask {
changeServerError?.let { Result.failure(it) } ?: Result.success(Unit)
override suspend fun setHomeserver(homeserver: String): Result<MatrixHomeServerDetails> = simulateLongTask {
setHomeserverResult(homeserver)
}
override suspend fun login(username: String, password: String): Result<SessionId> = simulateLongTask {
@ -115,10 +104,6 @@ class FakeMatrixAuthenticationService(
loginError = throwable
}
fun givenChangeServerError(throwable: Throwable?) {
changeServerError = throwable
}
fun givenMatrixClient(matrixClient: MatrixClient) {
this.matrixClient = matrixClient
}