Skip to content

Commit c540b61

Browse files
committed
Fix tests
1 parent 0c41834 commit c540b61

File tree

12 files changed

+78
-13
lines changed

12 files changed

+78
-13
lines changed

appnav/src/test/kotlin/io/element/android/appnav/intent/IntentResolverTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class IntentResolverTest {
111111
@Test
112112
fun `test resolve oidc`() {
113113
val sut = createIntentResolver(
114-
oidcIntentResolverResult = { OidcAction.GoBack },
114+
oidcIntentResolverResult = { OidcAction.GoBack() },
115115
)
116116
val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply {
117117
action = Intent.ACTION_VIEW
@@ -120,7 +120,7 @@ class IntentResolverTest {
120120
val result = sut.resolve(intent)
121121
assertThat(result).isEqualTo(
122122
ResolvedIntent.Oidc(
123-
oidcAction = OidcAction.GoBack
123+
oidcAction = OidcAction.GoBack()
124124
)
125125
)
126126
}

features/login/impl/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ dependencies {
3939
implementation(projects.libraries.testtags)
4040
implementation(projects.libraries.uiStrings)
4141
implementation(projects.libraries.permissions.api)
42+
implementation(projects.libraries.sessionStorage.api)
4243
implementation(projects.libraries.qrcode)
4344
implementation(projects.libraries.oidc.api)
4445
implementation(projects.libraries.uiUtils)
@@ -62,6 +63,7 @@ dependencies {
6263
testImplementation(projects.libraries.matrix.test)
6364
testImplementation(projects.libraries.oidc.test)
6465
testImplementation(projects.libraries.permissions.test)
66+
testImplementation(projects.libraries.sessionStorage.test)
6567
testImplementation(projects.libraries.wellknown.test)
6668
testImplementation(projects.tests.testutils)
6769
testReleaseImplementation(libs.androidx.compose.ui.test.manifest)

features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class LoginFlowNode(
8787
// by pressing back or by closing the Custom Chrome Tab.
8888
lifecycleScope.launch {
8989
delay(5000)
90-
oidcActionFlow.post(OidcAction.GoBack)
90+
oidcActionFlow.post(OidcAction.GoBack(toUnblock = true))
9191
}
9292
}
9393
}

features/login/impl/src/main/kotlin/io/element/android/features/login/impl/login/LoginHelper.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,14 +94,14 @@ class LoginHelper(
9494
}
9595

9696
private suspend fun onOidcAction(oidcAction: OidcAction) {
97-
if (oidcAction is OidcAction.GoBack && loginModeState.value !is AsyncData.Loading) {
97+
if (oidcAction is OidcAction.GoBack && oidcAction.toUnblock && loginModeState.value !is AsyncData.Loading) {
9898
// Ignore GoBack action if the current state is not Loading. This GoBack action is coming from LoginFlowNode.
9999
// This can happen if there is an error, for instance attempt to login again on the same account.
100100
return
101101
}
102102
loginModeState.value = AsyncData.Loading()
103103
when (oidcAction) {
104-
OidcAction.GoBack -> {
104+
is OidcAction.GoBack -> {
105105
authenticationService.cancelOidcLogin()
106106
.onSuccess {
107107
loginModeState.value = AsyncData.Uninitialized

features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenterTest.kt

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ class ConfirmAccountProviderPresenterTest {
117117
assertThat(successState.loginMode).isInstanceOf(AsyncData.Success::class.java)
118118
assertThat(successState.loginMode.dataOrNull()).isInstanceOf(LoginMode.Oidc::class.java)
119119
authenticationService.givenOidcCancelError(AN_EXCEPTION)
120-
defaultOidcActionFlow.post(OidcAction.GoBack)
120+
defaultOidcActionFlow.post(OidcAction.GoBack())
121121
val cancelFailureState = awaitItem()
122122
assertThat(cancelFailureState.loginMode).isInstanceOf(AsyncData.Failure::class.java)
123123
}
@@ -144,7 +144,30 @@ class ConfirmAccountProviderPresenterTest {
144144
assertThat(successState.submitEnabled).isFalse()
145145
assertThat(successState.loginMode).isInstanceOf(AsyncData.Success::class.java)
146146
assertThat(successState.loginMode.dataOrNull()).isInstanceOf(LoginMode.Oidc::class.java)
147-
defaultOidcActionFlow.post(OidcAction.GoBack)
147+
defaultOidcActionFlow.post(OidcAction.GoBack())
148+
val cancelFinalState = awaitItem()
149+
assertThat(cancelFinalState.loginMode).isInstanceOf(AsyncData.Uninitialized::class.java)
150+
}
151+
}
152+
153+
@Test
154+
fun `present - oidc - cancel to unblock`() = runTest {
155+
val authenticationService = FakeMatrixAuthenticationService()
156+
val defaultOidcActionFlow = FakeOidcActionFlow()
157+
val presenter = createConfirmAccountProviderPresenter(
158+
matrixAuthenticationService = authenticationService,
159+
defaultOidcActionFlow = defaultOidcActionFlow,
160+
)
161+
authenticationService.givenHomeserver(A_HOMESERVER_OIDC)
162+
moleculeFlow(RecompositionMode.Immediate) {
163+
presenter.present()
164+
}.test {
165+
val initialState = awaitItem()
166+
initialState.eventSink.invoke(ConfirmAccountProviderEvents.Continue)
167+
val loadingState = awaitItem()
168+
assertThat(loadingState.submitEnabled).isTrue()
169+
assertThat(loadingState.loginMode).isInstanceOf(AsyncData.Loading::class.java)
170+
defaultOidcActionFlow.post(OidcAction.GoBack(toUnblock = true))
148171
val cancelFinalState = awaitItem()
149172
assertThat(cancelFinalState.loginMode).isInstanceOf(AsyncData.Uninitialized::class.java)
150173
}

features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenterTest.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationSer
2929
import io.element.android.libraries.matrix.test.core.aBuildMeta
3030
import io.element.android.libraries.oidc.api.OidcActionFlow
3131
import io.element.android.libraries.oidc.test.customtab.FakeOidcActionFlow
32+
import io.element.android.libraries.sessionstorage.api.SessionStore
33+
import io.element.android.libraries.sessionstorage.test.InMemorySessionStore
34+
import io.element.android.libraries.sessionstorage.test.aSessionData
3235
import io.element.android.libraries.wellknown.api.WellknownRetriever
3336
import io.element.android.tests.testutils.WarmUpRule
3437
import io.element.android.tests.testutils.test
@@ -79,10 +82,27 @@ class OnBoardingPresenterTest {
7982
assertThat(initialState.productionApplicationName).isEqualTo("B")
8083
assertThat(initialState.canCreateAccount).isEqualTo(OnBoardingConfig.CAN_CREATE_ACCOUNT)
8184
assertThat(initialState.canReportBug).isFalse()
85+
assertThat(initialState.isAddingAccount).isFalse()
8286
assertThat(awaitItem().canLoginWithQrCode).isTrue()
8387
}
8488
}
8589

90+
@Test
91+
fun `present - initial state adding account`() = runTest {
92+
val presenter = createPresenter(
93+
sessionStore = InMemorySessionStore(
94+
initialList = listOf(
95+
aSessionData()
96+
)
97+
)
98+
)
99+
presenter.test {
100+
skipItems(1)
101+
val initialState = awaitItem()
102+
assertThat(initialState.isAddingAccount).isTrue()
103+
}
104+
}
105+
86106
@Test
87107
fun `present - on boarding logo`() = runTest {
88108
val presenter = createPresenter(
@@ -236,6 +256,7 @@ private fun createPresenter(
236256
rageshakeFeatureAvailability: () -> Flow<Boolean> = { flowOf(true) },
237257
loginHelper: LoginHelper = createLoginHelper(),
238258
onBoardingLogoResIdProvider: OnBoardingLogoResIdProvider = OnBoardingLogoResIdProvider { null },
259+
sessionStore: SessionStore = InMemorySessionStore(),
239260
) = OnBoardingPresenter(
240261
params = params,
241262
buildMeta = buildMeta,
@@ -247,6 +268,7 @@ private fun createPresenter(
247268
rageshakeFeatureAvailability = rageshakeFeatureAvailability,
248269
loginHelper = loginHelper,
249270
onBoardingLogoResIdProvider = onBoardingLogoResIdProvider,
271+
sessionStore = sessionStore,
250272
)
251273

252274
fun createLoginHelper(

features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/OnboardingViewTest.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import io.element.android.tests.testutils.EventsRecorder
2525
import io.element.android.tests.testutils.clickOn
2626
import io.element.android.tests.testutils.ensureCalledOnce
2727
import io.element.android.tests.testutils.ensureCalledOnceWithParam
28+
import io.element.android.tests.testutils.pressBack
2829
import org.junit.Rule
2930
import org.junit.Test
3031
import org.junit.rules.TestRule
@@ -50,6 +51,21 @@ class OnboardingViewTest {
5051
}
5152
}
5253

54+
@Test
55+
fun `when can go back - clicking on back calls the expected callback`() {
56+
val eventSink = EventsRecorder<OnBoardingEvents>(expectEvents = false)
57+
ensureCalledOnce { callback ->
58+
rule.setOnboardingView(
59+
state = anOnBoardingState(
60+
isAddingAccount = true,
61+
eventSink = eventSink,
62+
),
63+
onBackClick = callback,
64+
)
65+
rule.pressBack()
66+
}
67+
}
68+
5369
@Test
5470
fun `when can login with QR code - clicking on sign in with QR code calls the expected callback`() {
5571
val eventSink = EventsRecorder<OnBoardingEvents>(expectEvents = false)
@@ -235,6 +251,7 @@ class OnboardingViewTest {
235251

236252
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setOnboardingView(
237253
state: OnBoardingState,
254+
onBackClick: () -> Unit = EnsureNeverCalled(),
238255
onSignInWithQrCode: () -> Unit = EnsureNeverCalled(),
239256
onSignIn: (Boolean) -> Unit = EnsureNeverCalledWithParam(),
240257
onCreateAccount: () -> Unit = EnsureNeverCalled(),
@@ -247,6 +264,7 @@ class OnboardingViewTest {
247264
setContent {
248265
OnBoardingView(
249266
state = state,
267+
onBackClick = onBackClick,
250268
onSignInWithQrCode = onSignInWithQrCode,
251269
onSignIn = onSignIn,
252270
onCreateAccount = onCreateAccount,

libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcAction.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88
package io.element.android.libraries.oidc.api
99

1010
sealed interface OidcAction {
11-
data object GoBack : OidcAction
11+
data class GoBack(val toUnblock: Boolean = false) : OidcAction
1212
data class Success(val url: String) : OidcAction
1313
}

libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/OidcUrlParser.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class DefaultOidcUrlParser(
3636
*/
3737
override fun parse(url: String): OidcAction? {
3838
if (url.startsWith(oidcRedirectUrlProvider.provide()).not()) return null
39-
if (url.contains("error=access_denied")) return OidcAction.GoBack
39+
if (url.contains("error=access_denied")) return OidcAction.GoBack()
4040
if (url.contains("code=")) return OidcAction.Success(url)
4141

4242
// Other case not supported, let's crash the app for now

libraries/oidc/impl/src/test/kotlin/io/element/android/libraries/oidc/impl/DefaultOidcActionFlowTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ class DefaultOidcActionFlowTest {
2424
data.add(action)
2525
}
2626
}
27-
sut.post(OidcAction.GoBack)
27+
sut.post(OidcAction.GoBack())
2828
delay(1)
2929
sut.reset()
3030
delay(1)
31-
assertThat(data).containsExactly(OidcAction.GoBack, null)
31+
assertThat(data).containsExactly(OidcAction.GoBack(), null)
3232
}
3333
}

0 commit comments

Comments
 (0)