ChooseAccountProviderEvents -> ChooseAccountProviderEvent

This commit is contained in:
Benoit Marty
2026-08-25 10:01:04 +02:00
parent 0ee7ed3a78
commit 1fd102ffc3
7 changed files with 25 additions and 25 deletions
@@ -10,8 +10,8 @@ package io.element.android.features.login.impl.screens.chooseaccountprovider
import io.element.android.features.login.impl.accountprovider.AccountProvider import io.element.android.features.login.impl.accountprovider.AccountProvider
sealed interface ChooseAccountProviderEvents { sealed interface ChooseAccountProviderEvent {
data class SelectAccountProvider(val accountProvider: AccountProvider) : ChooseAccountProviderEvents data class SelectAccountProvider(val accountProvider: AccountProvider) : ChooseAccountProviderEvent
data object Continue : ChooseAccountProviderEvents data object Continue : ChooseAccountProviderEvent
data object ClearError : ChooseAccountProviderEvents data object ClearError : ChooseAccountProviderEvent
} }
@@ -34,9 +34,9 @@ class ChooseAccountProviderPresenter(
val loginModeState = loginModePresenter.present() val loginModeState = loginModePresenter.present()
var selectedAccountProvider: AccountProvider? by remember { mutableStateOf(null) } var selectedAccountProvider: AccountProvider? by remember { mutableStateOf(null) }
fun handleEvent(event: ChooseAccountProviderEvents) { fun handleEvent(event: ChooseAccountProviderEvent) {
when (event) { when (event) {
ChooseAccountProviderEvents.Continue -> { ChooseAccountProviderEvent.Continue -> {
selectedAccountProvider?.let { provider -> selectedAccountProvider?.let { provider ->
loginModeState.eventSink( loginModeState.eventSink(
LoginModeEvent.Submit( LoginModeEvent.Submit(
@@ -48,13 +48,13 @@ class ChooseAccountProviderPresenter(
) )
} }
} }
is ChooseAccountProviderEvents.SelectAccountProvider -> { is ChooseAccountProviderEvent.SelectAccountProvider -> {
// Ensure that the user does not change the server during processing. // Ensure that the user does not change the server during processing.
if (loginModeState.loginMode is AsyncData.Uninitialized) { if (loginModeState.loginMode is AsyncData.Uninitialized) {
selectedAccountProvider = event.accountProvider selectedAccountProvider = event.accountProvider
} }
} }
ChooseAccountProviderEvents.ClearError -> loginModeState.eventSink(LoginModeEvent.ClearError) ChooseAccountProviderEvent.ClearError -> loginModeState.eventSink(LoginModeEvent.ClearError)
} }
} }
@@ -17,7 +17,7 @@ data class ChooseAccountProviderState(
val accountProviders: ImmutableList<AccountProvider>, val accountProviders: ImmutableList<AccountProvider>,
val selectedAccountProvider: AccountProvider?, val selectedAccountProvider: AccountProvider?,
val loginModeState: LoginModeState, val loginModeState: LoginModeState,
val eventSink: (ChooseAccountProviderEvents) -> Unit, val eventSink: (ChooseAccountProviderEvent) -> Unit,
) { ) {
val submitEnabled: Boolean val submitEnabled: Boolean
get() = selectedAccountProvider != null && get() = selectedAccountProvider != null &&
@@ -71,7 +71,7 @@ fun aChooseAccountProviderState(
), ),
selectedAccountProvider: AccountProvider? = null, selectedAccountProvider: AccountProvider? = null,
loginModeState: LoginModeState = aLoginModeState(), loginModeState: LoginModeState = aLoginModeState(),
eventSink: (ChooseAccountProviderEvents) -> Unit = {}, eventSink: (ChooseAccountProviderEvent) -> Unit = {},
) = ChooseAccountProviderState( ) = ChooseAccountProviderState(
accountProviders = accountProviders.toImmutableList(), accountProviders = accountProviders.toImmutableList(),
selectedAccountProvider = selectedAccountProvider, selectedAccountProvider = selectedAccountProvider,
@@ -108,7 +108,7 @@ fun ChooseAccountProviderView(
item = alteredItem, item = alteredItem,
selected = item == state.selectedAccountProvider, selected = item == state.selectedAccountProvider,
onClick = { onClick = {
state.eventSink(ChooseAccountProviderEvents.SelectAccountProvider(item)) state.eventSink(ChooseAccountProviderEvent.SelectAccountProvider(item))
} }
) )
} }
@@ -119,7 +119,7 @@ fun ChooseAccountProviderView(
text = stringResource(id = CommonStrings.action_continue), text = stringResource(id = CommonStrings.action_continue),
showProgress = isLoading, showProgress = isLoading,
onClick = { onClick = {
state.eventSink(ChooseAccountProviderEvents.Continue) state.eventSink(ChooseAccountProviderEvent.Continue)
}, },
enabled = state.submitEnabled || isLoading, enabled = state.submitEnabled || isLoading,
modifier = Modifier modifier = Modifier
@@ -131,7 +131,7 @@ fun ChooseAccountProviderView(
LoginModeView( LoginModeView(
loginMode = state.loginModeState.loginMode, loginMode = state.loginModeState.loginMode,
onClearError = { onClearError = {
state.eventSink(ChooseAccountProviderEvents.ClearError) state.eventSink(ChooseAccountProviderEvent.ClearError)
}, },
onLearnMoreClick = onLearnMoreClick, onLearnMoreClick = onLearnMoreClick,
onOAuthDetails = onOAuthDetails, onOAuthDetails = onOAuthDetails,
@@ -88,7 +88,7 @@ class ChooseAccountProviderPresenterTest {
presenter.test { presenter.test {
awaitItem().also { awaitItem().also {
assertThat(it.selectedAccountProvider).isNull() assertThat(it.selectedAccountProvider).isNull()
it.eventSink(ChooseAccountProviderEvents.Continue) it.eventSink(ChooseAccountProviderEvent.Continue)
expectNoEvents() expectNoEvents()
} }
} }
@@ -112,11 +112,11 @@ class ChooseAccountProviderPresenterTest {
presenter.test { presenter.test {
awaitItem().also { awaitItem().also {
assertThat(it.selectedAccountProvider).isNull() assertThat(it.selectedAccountProvider).isNull()
it.eventSink(ChooseAccountProviderEvents.SelectAccountProvider(accountProvider1)) it.eventSink(ChooseAccountProviderEvent.SelectAccountProvider(accountProvider1))
} }
awaitItem().also { awaitItem().also {
assertThat(it.selectedAccountProvider).isEqualTo(accountProvider1) assertThat(it.selectedAccountProvider).isEqualTo(accountProvider1)
it.eventSink(ChooseAccountProviderEvents.Continue) it.eventSink(ChooseAccountProviderEvent.Continue)
skipItems(1) // Loading skipItems(1) // Loading
// Check an error was returned // Check an error was returned
@@ -124,7 +124,7 @@ class ChooseAccountProviderPresenterTest {
assertThat(submittedState.loginModeState.loginMode).isInstanceOf(AsyncData.Failure::class.java) assertThat(submittedState.loginModeState.loginMode).isInstanceOf(AsyncData.Failure::class.java)
// Assert the error is then cleared // Assert the error is then cleared
submittedState.eventSink(ChooseAccountProviderEvents.ClearError) submittedState.eventSink(ChooseAccountProviderEvent.ClearError)
val clearedState = awaitItem() val clearedState = awaitItem()
assertThat(clearedState.loginModeState.loginMode).isEqualTo(AsyncData.Uninitialized) assertThat(clearedState.loginModeState.loginMode).isEqualTo(AsyncData.Uninitialized)
} }
@@ -145,15 +145,15 @@ class ChooseAccountProviderPresenterTest {
presenter.test { presenter.test {
awaitItem().also { awaitItem().also {
assertThat(it.selectedAccountProvider).isNull() assertThat(it.selectedAccountProvider).isNull()
it.eventSink(ChooseAccountProviderEvents.SelectAccountProvider(accountProvider1)) it.eventSink(ChooseAccountProviderEvent.SelectAccountProvider(accountProvider1))
} }
awaitItem().also { awaitItem().also {
assertThat(it.selectedAccountProvider).isEqualTo(accountProvider1) assertThat(it.selectedAccountProvider).isEqualTo(accountProvider1)
it.eventSink(ChooseAccountProviderEvents.Continue) it.eventSink(ChooseAccountProviderEvent.Continue)
} }
awaitItem().also { awaitItem().also {
assertThat(it.loginModeState.loginMode.isLoading()).isTrue() assertThat(it.loginModeState.loginMode.isLoading()).isTrue()
it.eventSink(ChooseAccountProviderEvents.SelectAccountProvider(accountProvider2)) it.eventSink(ChooseAccountProviderEvent.SelectAccountProvider(accountProvider2))
} }
expectNoEvents() expectNoEvents()
} }
@@ -35,7 +35,7 @@ import org.robolectric.annotation.Config
class ChooseAccountProviderViewTest : RobolectricTest() { class ChooseAccountProviderViewTest : RobolectricTest() {
@Test @Test
fun `clicking on back invokes the expected callback`() = runAndroidComposeUiTest { fun `clicking on back invokes the expected callback`() = runAndroidComposeUiTest {
val eventSink = EventsRecorder<ChooseAccountProviderEvents>(expectEvents = false) val eventSink = EventsRecorder<ChooseAccountProviderEvent>(expectEvents = false)
ensureCalledOnce { ensureCalledOnce {
setChooseAccountProviderView( setChooseAccountProviderView(
state = aChooseAccountProviderState( state = aChooseAccountProviderState(
@@ -50,7 +50,7 @@ class ChooseAccountProviderViewTest : RobolectricTest() {
@Config(qualifiers = "h1024dp") @Config(qualifiers = "h1024dp")
@Test @Test
fun `selecting an account provider emits the the expected event`() = runAndroidComposeUiTest { fun `selecting an account provider emits the the expected event`() = runAndroidComposeUiTest {
val eventSink = EventsRecorder<ChooseAccountProviderEvents>() val eventSink = EventsRecorder<ChooseAccountProviderEvent>()
setChooseAccountProviderView( setChooseAccountProviderView(
state = aChooseAccountProviderState( state = aChooseAccountProviderState(
accountProviders = listOf( accountProviders = listOf(
@@ -62,12 +62,12 @@ class ChooseAccountProviderViewTest : RobolectricTest() {
), ),
) )
onNodeWithText(ChooseAccountProviderPresenterTest.accountProvider1.title).performClick() onNodeWithText(ChooseAccountProviderPresenterTest.accountProvider1.title).performClick()
eventSink.assertSingle(ChooseAccountProviderEvents.SelectAccountProvider(ChooseAccountProviderPresenterTest.accountProvider1)) eventSink.assertSingle(ChooseAccountProviderEvent.SelectAccountProvider(ChooseAccountProviderPresenterTest.accountProvider1))
} }
@Test @Test
fun `when error is displayed - closing the dialog emits the expected event`() = runAndroidComposeUiTest { fun `when error is displayed - closing the dialog emits the expected event`() = runAndroidComposeUiTest {
val eventSink = EventsRecorder<ChooseAccountProviderEvents>() val eventSink = EventsRecorder<ChooseAccountProviderEvent>()
setChooseAccountProviderView( setChooseAccountProviderView(
state = aChooseAccountProviderState( state = aChooseAccountProviderState(
loginModeState = aLoginModeState(loginMode = AsyncData.Failure(AN_EXCEPTION)), loginModeState = aLoginModeState(loginMode = AsyncData.Failure(AN_EXCEPTION)),
@@ -75,7 +75,7 @@ class ChooseAccountProviderViewTest : RobolectricTest() {
), ),
) )
clickOn(CommonStrings.action_ok) clickOn(CommonStrings.action_ok)
eventSink.assertSingle(ChooseAccountProviderEvents.ClearError) eventSink.assertSingle(ChooseAccountProviderEvent.ClearError)
} }
private fun AndroidComposeUiTest<ComponentActivity>.setChooseAccountProviderView( private fun AndroidComposeUiTest<ComponentActivity>.setChooseAccountProviderView(