This commit is contained in:
Benoit Marty 2025-11-06 14:23:41 +01:00
parent 786d6f5642
commit 04584412f9
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.features.wellknown.test.anElementWellKnown
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.core.uri.ensureProtocol 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
import io.element.android.libraries.matrix.test.A_HOMESERVER_URL import io.element.android.libraries.matrix.test.A_HOMESERVER_URL
import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationService import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationService
@ -46,7 +47,11 @@ class ChangeServerPresenterTest {
@Test @Test
fun `present - change server ok`() = runTest { fun `present - change server ok`() = runTest {
val authenticationService = FakeMatrixAuthenticationService() val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.success(A_HOMESERVER)
},
)
createPresenter( createPresenter(
authenticationService = authenticationService, authenticationService = authenticationService,
enterpriseService = FakeEnterpriseService( enterpriseService = FakeEnterpriseService(
@ -55,7 +60,6 @@ class ChangeServerPresenterTest {
).test { ).test {
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.changeServerAction).isEqualTo(AsyncData.Uninitialized) assertThat(initialState.changeServerAction).isEqualTo(AsyncData.Uninitialized)
authenticationService.givenHomeserver(A_HOMESERVER)
initialState.eventSink.invoke(ChangeServerEvents.ChangeServer(AccountProvider(url = A_HOMESERVER_URL))) initialState.eventSink.invoke(ChangeServerEvents.ChangeServer(AccountProvider(url = A_HOMESERVER_URL)))
val loadingState = awaitItem() val loadingState = awaitItem()
assertThat(loadingState.changeServerAction).isInstanceOf(AsyncData.Loading::class.java) assertThat(loadingState.changeServerAction).isInstanceOf(AsyncData.Loading::class.java)
@ -66,10 +70,16 @@ class ChangeServerPresenterTest {
@Test @Test
fun `present - change server error`() = runTest { fun `present - change server error`() = runTest {
val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.failure(AN_EXCEPTION)
},
)
createPresenter( createPresenter(
enterpriseService = FakeEnterpriseService( enterpriseService = FakeEnterpriseService(
isAllowedToConnectToHomeserverResult = { true }, isAllowedToConnectToHomeserverResult = { true },
), ),
authenticationService = authenticationService,
).test { ).test {
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.changeServerAction).isEqualTo(AsyncData.Uninitialized) assertThat(initialState.changeServerAction).isEqualTo(AsyncData.Uninitialized)

View file

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

View file

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

View file

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

View file

@ -214,7 +214,11 @@ class OnBoardingPresenterTest {
@Test @Test
fun `present - default account provider - login and clear error`() = runTest { fun `present - default account provider - login and clear error`() = runTest {
val authenticationService = FakeMatrixAuthenticationService() val authenticationService = FakeMatrixAuthenticationService(
setHomeserverResult = {
Result.failure(AN_EXCEPTION)
},
)
val presenter = createPresenter( val presenter = createPresenter(
params = OnBoardingNode.Params( params = OnBoardingNode.Params(
accountProvider = A_HOMESERVER_URL, accountProvider = A_HOMESERVER_URL,
@ -231,7 +235,6 @@ class OnBoardingPresenterTest {
skipItems(3) skipItems(3)
awaitItem().also { awaitItem().also {
assertThat(it.defaultAccountProvider).isEqualTo(A_HOMESERVER_URL) assertThat(it.defaultAccountProvider).isEqualTo(A_HOMESERVER_URL)
authenticationService.givenChangeServerError(AN_EXCEPTION)
it.eventSink(OnBoardingEvents.OnSignIn(A_HOMESERVER_URL)) it.eventSink(OnBoardingEvents.OnSignIn(A_HOMESERVER_URL))
skipItems(1) // Loading 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.lambdaError
import io.element.android.tests.testutils.lambda.lambdaRecorder import io.element.android.tests.testutils.lambda.lambdaRecorder
import io.element.android.tests.testutils.simulateLongTask 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") val A_OIDC_DATA = OidcDetails(url = "a-url")
@ -31,13 +29,12 @@ class FakeMatrixAuthenticationService(
var matrixClientResult: ((SessionId) -> Result<MatrixClient>)? = null, var matrixClientResult: ((SessionId) -> Result<MatrixClient>)? = null,
var loginWithQrCodeResult: (qrCodeData: MatrixQrCodeLoginData, progress: (QrCodeLoginStep) -> Unit) -> Result<SessionId> = var loginWithQrCodeResult: (qrCodeData: MatrixQrCodeLoginData, progress: (QrCodeLoginStep) -> Unit) -> Result<SessionId> =
lambdaRecorder<MatrixQrCodeLoginData, (QrCodeLoginStep) -> Unit, Result<SessionId>> { _, _ -> Result.success(A_SESSION_ID) }, 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 { ) : MatrixAuthenticationService {
private val homeserver = MutableStateFlow<MatrixHomeServerDetails?>(null)
private var oidcError: Throwable? = null private var oidcError: Throwable? = null
private var oidcCancelError: Throwable? = null private var oidcCancelError: Throwable? = null
private var loginError: Throwable? = null private var loginError: Throwable? = null
private var changeServerError: Throwable? = null
private var matrixClient: MatrixClient? = null private var matrixClient: MatrixClient? = null
private var onAuthenticationListener: ((MatrixClient) -> Unit)? = null private var onAuthenticationListener: ((MatrixClient) -> Unit)? = null
@ -53,16 +50,8 @@ class FakeMatrixAuthenticationService(
} }
} }
override fun getHomeserverDetails(): StateFlow<MatrixHomeServerDetails?> { override suspend fun setHomeserver(homeserver: String): Result<MatrixHomeServerDetails> = simulateLongTask {
return homeserver setHomeserverResult(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 login(username: String, password: String): Result<SessionId> = simulateLongTask { override suspend fun login(username: String, password: String): Result<SessionId> = simulateLongTask {
@ -115,10 +104,6 @@ class FakeMatrixAuthenticationService(
loginError = throwable loginError = throwable
} }
fun givenChangeServerError(throwable: Throwable?) {
changeServerError = throwable
}
fun givenMatrixClient(matrixClient: MatrixClient) { fun givenMatrixClient(matrixClient: MatrixClient) {
this.matrixClient = matrixClient this.matrixClient = matrixClient
} }