Skip to content

Commit 8dbcd68

Browse files
committed
Improve tests.
1 parent dcda037 commit 8dbcd68

File tree

3 files changed

+77
-33
lines changed

3 files changed

+77
-33
lines changed

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

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@ package io.element.android.features.login.impl.login
99

1010
import androidx.compose.runtime.Composable
1111
import androidx.compose.ui.res.stringResource
12+
import io.element.android.features.login.impl.R
1213
import io.element.android.features.login.impl.dialogs.SlidingSyncNotSupportedDialog
1314
import io.element.android.features.login.impl.error.ChangeServerError
1415
import io.element.android.features.login.impl.screens.confirmaccountprovider.LoginFlow
1516
import io.element.android.features.login.impl.screens.createaccount.AccountCreationNotSupported
1617
import io.element.android.libraries.architecture.AsyncData
1718
import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog
19+
import io.element.android.libraries.designsystem.theme.LocalBuildMeta
1820
import io.element.android.libraries.matrix.api.auth.OidcDetails
1921
import io.element.android.libraries.ui.strings.CommonStrings
2022

@@ -30,29 +32,47 @@ fun LoginFlowView(
3032
when (loginFlow) {
3133
is AsyncData.Failure -> {
3234
when (val error = loginFlow.error) {
33-
is ChangeServerError.Error -> {
34-
ErrorDialog(
35-
content = error.message(),
36-
onSubmit = onClearError,
37-
)
38-
}
39-
is ChangeServerError.SlidingSyncAlert -> {
40-
SlidingSyncNotSupportedDialog(
41-
onLearnMoreClick = {
42-
onLearnMoreClick()
43-
onClearError()
44-
},
45-
onDismiss = {
46-
onClearError()
35+
is ChangeServerError -> {
36+
when (error) {
37+
is ChangeServerError.Error -> {
38+
ErrorDialog(
39+
content = error.message(),
40+
onSubmit = onClearError,
41+
)
4742
}
48-
)
43+
is ChangeServerError.SlidingSyncAlert -> {
44+
SlidingSyncNotSupportedDialog(
45+
onLearnMoreClick = {
46+
onLearnMoreClick()
47+
onClearError()
48+
},
49+
onDismiss = onClearError,
50+
)
51+
}
52+
is ChangeServerError.UnauthorizedAccountProvider -> {
53+
ErrorDialog(
54+
content = stringResource(
55+
id = R.string.screen_change_server_error_unauthorized_homeserver,
56+
LocalBuildMeta.current.applicationName,
57+
error.unauthorisedAccountProviderTitle,
58+
),
59+
onSubmit = onClearError,
60+
)
61+
}
62+
}
4963
}
5064
is AccountCreationNotSupported -> {
5165
ErrorDialog(
5266
content = stringResource(CommonStrings.error_account_creation_not_possible),
5367
onSubmit = onClearError,
5468
)
5569
}
70+
else -> {
71+
ErrorDialog(
72+
content = stringResource(CommonStrings.error_unknown),
73+
onSubmit = onClearError,
74+
)
75+
}
5676
}
5777
}
5878
is AsyncData.Loading -> Unit // The Continue button shows the loading state

features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingView.kt

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,16 @@ fun OnBoardingView(
6969
modifier = modifier,
7070
content = {
7171
OnBoardingContent(state = state)
72+
LoginFlowView(
73+
state.loginFlow,
74+
onClearError = {
75+
state.eventSink(OnBoardingEvents.ClearError)
76+
},
77+
onLearnMoreClick,
78+
onOidcDetails,
79+
onNeedLoginPassword,
80+
onCreateAccountContinue,
81+
)
7282
},
7383
footer = {
7484
OnBoardingButtons(
@@ -77,10 +87,6 @@ fun OnBoardingView(
7787
onSignIn = onSignIn,
7888
onCreateAccount = onCreateAccount,
7989
onReportProblem = onReportProblem,
80-
onOidcDetails = onOidcDetails,
81-
onNeedLoginPassword = onNeedLoginPassword,
82-
onLearnMoreClick = onLearnMoreClick,
83-
onCreateAccountContinue = onCreateAccountContinue,
8490
)
8591
}
8692
)
@@ -140,10 +146,6 @@ private fun OnBoardingButtons(
140146
onSignIn: () -> Unit,
141147
onCreateAccount: () -> Unit,
142148
onReportProblem: () -> Unit,
143-
onOidcDetails: (OidcDetails) -> Unit,
144-
onNeedLoginPassword: () -> Unit,
145-
onLearnMoreClick: () -> Unit,
146-
onCreateAccountContinue: (url: String) -> Unit,
147149
) {
148150
val isLoading by remember(state.loginFlow) {
149151
derivedStateOf {
@@ -185,16 +187,6 @@ private fun OnBoardingButtons(
185187
modifier = Modifier
186188
.fillMaxWidth()
187189
)
188-
LoginFlowView(
189-
state.loginFlow,
190-
onClearError = {
191-
state.eventSink(OnBoardingEvents.ClearError)
192-
},
193-
onLearnMoreClick,
194-
onOidcDetails,
195-
onNeedLoginPassword,
196-
onCreateAccountContinue,
197-
)
198190
}
199191
if (state.canCreateAccount) {
200192
TextButton(

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@ import androidx.activity.ComponentActivity
1111
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
1212
import androidx.compose.ui.test.junit4.createAndroidComposeRule
1313
import androidx.compose.ui.test.onNodeWithText
14+
import androidx.compose.ui.test.performClick
1415
import androidx.test.ext.junit.runners.AndroidJUnit4
1516
import io.element.android.features.login.impl.R
17+
import io.element.android.libraries.architecture.AsyncData
1618
import io.element.android.libraries.matrix.api.auth.OidcDetails
19+
import io.element.android.libraries.matrix.test.AN_EXCEPTION
1720
import io.element.android.libraries.ui.strings.CommonStrings
1821
import io.element.android.tests.testutils.EnsureNeverCalled
1922
import io.element.android.tests.testutils.EnsureNeverCalledWithParam
23+
import io.element.android.tests.testutils.EventsRecorder
2024
import io.element.android.tests.testutils.clickOn
2125
import io.element.android.tests.testutils.ensureCalledOnce
2226
import org.junit.Rule
@@ -76,6 +80,34 @@ class OnboardingViewTest {
7680
}
7781
}
7882

83+
@Test
84+
fun `when sign in to pre defined account provider - clicking on button emits the expected event`() {
85+
val eventSink = EventsRecorder<OnBoardingEvents>()
86+
rule.setOnboardingView(
87+
state = anOnBoardingState(
88+
defaultAccountProvider = "element.io",
89+
eventSink = eventSink,
90+
),
91+
)
92+
val buttonText = rule.activity.getString(R.string.screen_onboarding_sign_in_to, "element.io")
93+
rule.onNodeWithText(buttonText).performClick()
94+
eventSink.assertSingle(OnBoardingEvents.OnSignIn("element.io"))
95+
}
96+
97+
@Test
98+
fun `when error is displayed - closing the dialog emits the expected event`() {
99+
val eventSink = EventsRecorder<OnBoardingEvents>()
100+
rule.setOnboardingView(
101+
state = anOnBoardingState(
102+
defaultAccountProvider = "element.io",
103+
loginFlow = AsyncData.Failure(AN_EXCEPTION),
104+
eventSink = eventSink,
105+
),
106+
)
107+
rule.clickOn(CommonStrings.action_ok)
108+
eventSink.assertSingle(OnBoardingEvents.ClearError)
109+
}
110+
79111
@Test
80112
fun `clicking on report a problem calls the sign in callback`() {
81113
ensureCalledOnce { callback ->

0 commit comments

Comments
 (0)