Add missing tests.
This commit is contained in:
parent
79aa128377
commit
3f8e7eaef8
2 changed files with 151 additions and 0 deletions
|
|
@ -20,6 +20,7 @@ import app.cash.molecule.RecompositionMode
|
||||||
import app.cash.molecule.moleculeFlow
|
import app.cash.molecule.moleculeFlow
|
||||||
import app.cash.turbine.test
|
import app.cash.turbine.test
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
|
import io.element.android.features.login.api.oidc.OidcAction
|
||||||
import io.element.android.features.login.impl.DefaultLoginUserStory
|
import io.element.android.features.login.impl.DefaultLoginUserStory
|
||||||
import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource
|
import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource
|
||||||
import io.element.android.features.login.impl.oidc.customtab.DefaultOidcActionFlow
|
import io.element.android.features.login.impl.oidc.customtab.DefaultOidcActionFlow
|
||||||
|
|
@ -30,6 +31,7 @@ import io.element.android.libraries.matrix.test.A_HOMESERVER
|
||||||
import io.element.android.libraries.matrix.test.A_HOMESERVER_OIDC
|
import io.element.android.libraries.matrix.test.A_HOMESERVER_OIDC
|
||||||
import io.element.android.libraries.matrix.test.A_THROWABLE
|
import io.element.android.libraries.matrix.test.A_THROWABLE
|
||||||
import io.element.android.libraries.matrix.test.auth.FakeAuthenticationService
|
import io.element.android.libraries.matrix.test.auth.FakeAuthenticationService
|
||||||
|
import io.element.android.tests.testutils.waitForPredicate
|
||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
|
|
@ -92,6 +94,124 @@ class ConfirmAccountProviderPresenterTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `present - oidc - cancel with failure`() = runTest {
|
||||||
|
val authenticationService = FakeAuthenticationService()
|
||||||
|
val defaultOidcActionFlow = DefaultOidcActionFlow()
|
||||||
|
val presenter = createConfirmAccountProviderPresenter(
|
||||||
|
matrixAuthenticationService = authenticationService,
|
||||||
|
defaultOidcActionFlow = defaultOidcActionFlow,
|
||||||
|
)
|
||||||
|
authenticationService.givenHomeserver(A_HOMESERVER_OIDC)
|
||||||
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
|
presenter.present()
|
||||||
|
}.test {
|
||||||
|
val initialState = awaitItem()
|
||||||
|
initialState.eventSink.invoke(ConfirmAccountProviderEvents.Continue)
|
||||||
|
val loadingState = awaitItem()
|
||||||
|
assertThat(loadingState.submitEnabled).isTrue()
|
||||||
|
assertThat(loadingState.loginFlow).isInstanceOf(Async.Loading::class.java)
|
||||||
|
val successState = awaitItem()
|
||||||
|
assertThat(successState.submitEnabled).isFalse()
|
||||||
|
assertThat(successState.loginFlow).isInstanceOf(Async.Success::class.java)
|
||||||
|
assertThat(successState.loginFlow.dataOrNull()).isInstanceOf(LoginFlow.OidcFlow::class.java)
|
||||||
|
authenticationService.givenOidcCancelError(A_THROWABLE)
|
||||||
|
defaultOidcActionFlow.post(OidcAction.GoBack)
|
||||||
|
val cancelFailureState = awaitItem()
|
||||||
|
assertThat(cancelFailureState.loginFlow).isInstanceOf(Async.Failure::class.java)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `present - oidc - cancel with success`() = runTest {
|
||||||
|
val authenticationService = FakeAuthenticationService()
|
||||||
|
val defaultOidcActionFlow = DefaultOidcActionFlow()
|
||||||
|
val presenter = createConfirmAccountProviderPresenter(
|
||||||
|
matrixAuthenticationService = authenticationService,
|
||||||
|
defaultOidcActionFlow = defaultOidcActionFlow,
|
||||||
|
)
|
||||||
|
authenticationService.givenHomeserver(A_HOMESERVER_OIDC)
|
||||||
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
|
presenter.present()
|
||||||
|
}.test {
|
||||||
|
val initialState = awaitItem()
|
||||||
|
initialState.eventSink.invoke(ConfirmAccountProviderEvents.Continue)
|
||||||
|
val loadingState = awaitItem()
|
||||||
|
assertThat(loadingState.submitEnabled).isTrue()
|
||||||
|
assertThat(loadingState.loginFlow).isInstanceOf(Async.Loading::class.java)
|
||||||
|
val successState = awaitItem()
|
||||||
|
assertThat(successState.submitEnabled).isFalse()
|
||||||
|
assertThat(successState.loginFlow).isInstanceOf(Async.Success::class.java)
|
||||||
|
assertThat(successState.loginFlow.dataOrNull()).isInstanceOf(LoginFlow.OidcFlow::class.java)
|
||||||
|
defaultOidcActionFlow.post(OidcAction.GoBack)
|
||||||
|
val cancelFinalState = awaitItem()
|
||||||
|
assertThat(cancelFinalState.loginFlow).isInstanceOf(Async.Uninitialized::class.java)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `present - oidc - success with failure`() = runTest {
|
||||||
|
val authenticationService = FakeAuthenticationService()
|
||||||
|
val defaultOidcActionFlow = DefaultOidcActionFlow()
|
||||||
|
val presenter = createConfirmAccountProviderPresenter(
|
||||||
|
matrixAuthenticationService = authenticationService,
|
||||||
|
defaultOidcActionFlow = defaultOidcActionFlow,
|
||||||
|
)
|
||||||
|
authenticationService.givenHomeserver(A_HOMESERVER_OIDC)
|
||||||
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
|
presenter.present()
|
||||||
|
}.test {
|
||||||
|
val initialState = awaitItem()
|
||||||
|
initialState.eventSink.invoke(ConfirmAccountProviderEvents.Continue)
|
||||||
|
val loadingState = awaitItem()
|
||||||
|
assertThat(loadingState.submitEnabled).isTrue()
|
||||||
|
assertThat(loadingState.loginFlow).isInstanceOf(Async.Loading::class.java)
|
||||||
|
val successState = awaitItem()
|
||||||
|
assertThat(successState.submitEnabled).isFalse()
|
||||||
|
assertThat(successState.loginFlow).isInstanceOf(Async.Success::class.java)
|
||||||
|
assertThat(successState.loginFlow.dataOrNull()).isInstanceOf(LoginFlow.OidcFlow::class.java)
|
||||||
|
authenticationService.givenLoginError(A_THROWABLE)
|
||||||
|
defaultOidcActionFlow.post(OidcAction.Success("aUrl"))
|
||||||
|
val cancelLoadingState = awaitItem()
|
||||||
|
assertThat(cancelLoadingState.loginFlow).isInstanceOf(Async.Loading::class.java)
|
||||||
|
val cancelFailureState = awaitItem()
|
||||||
|
assertThat(cancelFailureState.loginFlow).isInstanceOf(Async.Failure::class.java)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `present - oidc - success with success`() = runTest {
|
||||||
|
val authenticationService = FakeAuthenticationService()
|
||||||
|
val defaultOidcActionFlow = DefaultOidcActionFlow()
|
||||||
|
val defaultLoginUserStory = DefaultLoginUserStory().apply {
|
||||||
|
setLoginFlowIsDone(false)
|
||||||
|
}
|
||||||
|
val presenter = createConfirmAccountProviderPresenter(
|
||||||
|
matrixAuthenticationService = authenticationService,
|
||||||
|
defaultOidcActionFlow = defaultOidcActionFlow,
|
||||||
|
defaultLoginUserStory = defaultLoginUserStory,
|
||||||
|
)
|
||||||
|
authenticationService.givenHomeserver(A_HOMESERVER_OIDC)
|
||||||
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
|
presenter.present()
|
||||||
|
}.test {
|
||||||
|
val initialState = awaitItem()
|
||||||
|
initialState.eventSink.invoke(ConfirmAccountProviderEvents.Continue)
|
||||||
|
val loadingState = awaitItem()
|
||||||
|
assertThat(loadingState.submitEnabled).isTrue()
|
||||||
|
assertThat(loadingState.loginFlow).isInstanceOf(Async.Loading::class.java)
|
||||||
|
val successState = awaitItem()
|
||||||
|
assertThat(successState.submitEnabled).isFalse()
|
||||||
|
assertThat(successState.loginFlow).isInstanceOf(Async.Success::class.java)
|
||||||
|
assertThat(successState.loginFlow.dataOrNull()).isInstanceOf(LoginFlow.OidcFlow::class.java)
|
||||||
|
assertThat(defaultLoginUserStory.loginFlowIsDone.value).isFalse()
|
||||||
|
defaultOidcActionFlow.post(OidcAction.Success("aUrl"))
|
||||||
|
val successSuccessState = awaitItem()
|
||||||
|
assertThat(successSuccessState.loginFlow).isInstanceOf(Async.Loading::class.java)
|
||||||
|
waitForPredicate { defaultLoginUserStory.loginFlowIsDone.value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `present - submit fails`() = runTest {
|
fun `present - submit fails`() = runTest {
|
||||||
val authenticationService = FakeAuthenticationService()
|
val authenticationService = FakeAuthenticationService()
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.tests.testutils
|
||||||
|
|
||||||
|
import kotlinx.coroutines.delay
|
||||||
|
|
||||||
|
suspend fun waitForPredicate(
|
||||||
|
delayBetweenAttemptsMillis: Long = 1,
|
||||||
|
maxNumberOfAttempts: Int = 20,
|
||||||
|
predicate: () -> Boolean,
|
||||||
|
) {
|
||||||
|
for (i in 0..maxNumberOfAttempts) {
|
||||||
|
if (predicate()) return
|
||||||
|
if (i < maxNumberOfAttempts) delay(delayBetweenAttemptsMillis)
|
||||||
|
}
|
||||||
|
throw AssertionError("Predicate was not true after $maxNumberOfAttempts attempts")
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue