Migrate to v2 testing APIs

This commit is contained in:
Benoit Marty 2026-04-30 15:54:33 +02:00
parent 21795a86c1
commit 723b9b8d61
83 changed files with 2197 additions and 2320 deletions

View file

@ -6,11 +6,14 @@
* Please see LICENSE files in the repository root for full details.
*/
@file:OptIn(ExperimentalTestApi::class)
package io.element.android.features.rolesandpermissions.impl.permissions
import androidx.activity.ComponentActivity
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.AndroidComposeUiTest
import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.v2.runAndroidComposeUiTest
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.element.android.features.rolesandpermissions.impl.R
import io.element.android.libraries.architecture.AsyncAction
@ -23,84 +26,80 @@ import io.element.android.tests.testutils.pressBack
import io.element.android.tests.testutils.pressBackKey
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.persistentMapOf
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class ChangeRoomPermissionsViewTest {
@get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
@Test
fun `click on back icon invokes Exit`() {
fun `click on back icon invokes Exit`() = runAndroidComposeUiTest {
val recorder = EventsRecorder<ChangeRoomPermissionsEvent>()
rule.setChangeRoomPermissionsRule(
setChangeRoomPermissionsRule(
state = aChangeRoomPermissionsState(
eventSink = recorder
)
)
rule.pressBack()
pressBack()
recorder.assertSingle(ChangeRoomPermissionsEvent.Exit)
}
@Test
fun `click on back key invokes Exit`() {
fun `click on back key invokes Exit`() = runAndroidComposeUiTest {
val recorder = EventsRecorder<ChangeRoomPermissionsEvent>()
rule.setChangeRoomPermissionsRule(
setChangeRoomPermissionsRule(
state = aChangeRoomPermissionsState(
eventSink = recorder
)
)
rule.pressBackKey()
pressBackKey()
recorder.assertSingle(ChangeRoomPermissionsEvent.Exit)
}
@Test
fun `when confirming exit with pending changes, using the back key actually exits`() {
fun `when confirming exit with pending changes, using the back key actually exits`() = runAndroidComposeUiTest {
val recorder = EventsRecorder<ChangeRoomPermissionsEvent>()
rule.setChangeRoomPermissionsRule(
setChangeRoomPermissionsRule(
state = aChangeRoomPermissionsState(
hasChanges = true,
eventSink = recorder,
),
)
rule.pressBackKey()
pressBackKey()
recorder.assertSingle(ChangeRoomPermissionsEvent.Exit)
}
@Test
fun `when confirming exit with pending changes, clicking on 'discard' button in the dialog actually exits`() {
fun `when confirming exit with pending changes, clicking on 'discard' button in the dialog actually exits`() = runAndroidComposeUiTest {
val recorder = EventsRecorder<ChangeRoomPermissionsEvent>()
rule.setChangeRoomPermissionsRule(
setChangeRoomPermissionsRule(
state = aChangeRoomPermissionsState(
hasChanges = true,
saveAction = AsyncAction.ConfirmingCancellation,
eventSink = recorder,
),
)
rule.clickOn(CommonStrings.action_discard)
clickOn(CommonStrings.action_discard)
recorder.assertSingle(ChangeRoomPermissionsEvent.Exit)
}
@Test
fun `when confirming exit with pending changes, clicking on 'save' button in the dialog saves the changes`() {
fun `when confirming exit with pending changes, clicking on 'save' button in the dialog saves the changes`() = runAndroidComposeUiTest {
val recorder = EventsRecorder<ChangeRoomPermissionsEvent>()
rule.setChangeRoomPermissionsRule(
setChangeRoomPermissionsRule(
state = aChangeRoomPermissionsState(
hasChanges = true,
saveAction = AsyncAction.ConfirmingCancellation,
eventSink = recorder,
),
)
rule.clickOn(CommonStrings.action_save, inDialog = true)
clickOn(CommonStrings.action_save, inDialog = true)
recorder.assertSingle(ChangeRoomPermissionsEvent.Save)
}
@Test
fun `click on a role item triggers ChangeRole event`() {
fun `click on a role item triggers ChangeRole event`() = runAndroidComposeUiTest {
val recorder = EventsRecorder<ChangeRoomPermissionsEvent>()
rule.setChangeRoomPermissionsRule(
setChangeRoomPermissionsRule(
state = aChangeRoomPermissionsState(
itemsBySection = persistentMapOf(
// Makes sure there is only one item to click on
@ -109,70 +108,70 @@ class ChangeRoomPermissionsViewTest {
eventSink = recorder,
)
)
rule.clickOn(R.string.screen_room_change_permissions_room_name)
rule.clickOn(R.string.screen_room_change_permissions_everyone)
clickOn(R.string.screen_room_change_permissions_room_name)
clickOn(R.string.screen_room_change_permissions_everyone)
recorder.assertSingle(
ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_NAME, SelectableRole.Everyone),
)
}
@Test
fun `click on the Save menu item triggers Save event`() {
fun `click on the Save menu item triggers Save event`() = runAndroidComposeUiTest {
val recorder = EventsRecorder<ChangeRoomPermissionsEvent>()
rule.setChangeRoomPermissionsRule(
setChangeRoomPermissionsRule(
state = aChangeRoomPermissionsState(
hasChanges = true,
eventSink = recorder,
),
)
rule.clickOn(CommonStrings.action_save)
clickOn(CommonStrings.action_save)
recorder.assertSingle(ChangeRoomPermissionsEvent.Save)
}
@Test
fun `a successful save exits the screen`() {
fun `a successful save exits the screen`() = runAndroidComposeUiTest {
ensureCalledOnceWithParam(true) { callback ->
rule.setChangeRoomPermissionsRule(
setChangeRoomPermissionsRule(
state = aChangeRoomPermissionsState(
hasChanges = true,
saveAction = AsyncAction.Success(true),
),
onComplete = callback,
)
rule.clickOn(CommonStrings.action_save)
clickOn(CommonStrings.action_save)
}
}
@Test
fun `a cancellation exits the screen`() {
fun `a cancellation exits the screen`() = runAndroidComposeUiTest {
ensureCalledOnceWithParam(false) { callback ->
rule.setChangeRoomPermissionsRule(
setChangeRoomPermissionsRule(
state = aChangeRoomPermissionsState(
hasChanges = true,
saveAction = AsyncAction.Success(false),
),
onComplete = callback,
)
rule.clickOn(CommonStrings.action_save)
clickOn(CommonStrings.action_save)
}
}
@Test
fun `click on the Ok option in save error dialog triggers ResetPendingAction event`() {
fun `click on the Ok option in save error dialog triggers ResetPendingAction event`() = runAndroidComposeUiTest {
val recorder = EventsRecorder<ChangeRoomPermissionsEvent>()
rule.setChangeRoomPermissionsRule(
setChangeRoomPermissionsRule(
state = aChangeRoomPermissionsState(
hasChanges = true,
saveAction = AsyncAction.Failure(IllegalStateException("Failed to set room power levels")),
eventSink = recorder,
),
)
rule.clickOn(CommonStrings.action_ok)
clickOn(CommonStrings.action_ok)
recorder.assertSingle(ChangeRoomPermissionsEvent.ResetPendingActions)
}
}
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setChangeRoomPermissionsRule(
private fun AndroidComposeUiTest<ComponentActivity>.setChangeRoomPermissionsRule(
state: ChangeRoomPermissionsState = aChangeRoomPermissionsState(),
onComplete: (Boolean) -> Unit = EnsureNeverCalledWithParam(),
) {

View file

@ -6,15 +6,18 @@
* Please see LICENSE files in the repository root for full details.
*/
@file:OptIn(ExperimentalTestApi::class)
package io.element.android.features.rolesandpermissions.impl.roles
import androidx.activity.ComponentActivity
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.AndroidComposeUiTest
import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.onAllNodesWithText
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.v2.runAndroidComposeUiTest
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.architecture.AsyncAction
@ -30,20 +33,16 @@ import io.element.android.tests.testutils.clickOn
import io.element.android.tests.testutils.pressBack
import io.element.android.tests.testutils.pressBackKey
import kotlinx.collections.immutable.toImmutableList
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
import org.junit.runner.RunWith
import org.robolectric.annotation.Config
@RunWith(AndroidJUnit4::class)
class ChangeRolesViewTest {
@get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
@Test
fun `passing a 'User' role throws an exception`() {
fun `passing a 'User' role throws an exception`() = runAndroidComposeUiTest {
val exception = runCatchingExceptions {
rule.setChangeRolesContent(
setChangeRolesContent(
state = aChangeRolesState(
role = RoomMember.Role.User,
eventSink = EnsureNeverCalledWithParam(),
@ -54,106 +53,106 @@ class ChangeRolesViewTest {
}
@Test
fun `back key - with search active toggles the search`() {
fun `back key - with search active toggles the search`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ChangeRolesEvent>()
rule.setChangeRolesContent(
setChangeRolesContent(
state = aChangeRolesState(
isSearchActive = true,
eventSink = eventsRecorder,
),
)
rule.pressBackKey()
pressBackKey()
// Advance time to let the event be processed, as the search toggle might have some delay (e.g. for the animation)
rule.mainClock.advanceTimeBy(1)
mainClock.advanceTimeBy(1)
eventsRecorder.assertSingle(ChangeRolesEvent.ToggleSearchActive)
}
@Test
fun `back key - with search inactive exits the screen`() {
fun `back key - with search inactive exits the screen`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ChangeRolesEvent>()
rule.setChangeRolesContent(
setChangeRolesContent(
state = aChangeRolesState(
isSearchActive = false,
eventSink = eventsRecorder,
),
)
rule.pressBackKey()
pressBackKey()
eventsRecorder.assertSingle(ChangeRolesEvent.Exit)
}
@Test
fun `back button - exits the screen`() {
fun `back button - exits the screen`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ChangeRolesEvent>()
rule.setChangeRolesContent(
setChangeRolesContent(
state = aChangeRolesState(
isSearchActive = false,
eventSink = eventsRecorder,
),
)
rule.pressBack()
pressBack()
eventsRecorder.assertSingle(ChangeRolesEvent.Exit)
}
@Test
fun `save button - with changes, it saves them`() {
fun `save button - with changes, it saves them`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ChangeRolesEvent>()
rule.setChangeRolesContent(
setChangeRolesContent(
state = aChangeRolesState(
hasPendingChanges = true,
eventSink = eventsRecorder,
),
)
rule.clickOn(CommonStrings.action_save)
clickOn(CommonStrings.action_save)
eventsRecorder.assertSingle(ChangeRolesEvent.Save)
}
@Test
fun `save button - with no changes, does nothing`() {
fun `save button - with no changes, does nothing`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ChangeRolesEvent>()
rule.setChangeRolesContent(
setChangeRolesContent(
state = aChangeRolesState(
hasPendingChanges = false,
eventSink = eventsRecorder,
),
)
rule.clickOn(CommonStrings.action_save)
clickOn(CommonStrings.action_save)
eventsRecorder.assertEmpty()
}
@Test
fun `exit confirmation dialog - discard exits the screen`() {
fun `exit confirmation dialog - discard exits the screen`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ChangeRolesEvent>()
rule.setChangeRolesContent(
setChangeRolesContent(
state = aChangeRolesState(
isSearchActive = true,
savingState = AsyncAction.ConfirmingCancellation,
eventSink = eventsRecorder,
),
)
rule.clickOn(CommonStrings.action_discard)
clickOn(CommonStrings.action_discard)
eventsRecorder.assertSingle(ChangeRolesEvent.Exit)
}
@Test
fun `exit confirmation dialog - save emits the save event`() {
fun `exit confirmation dialog - save emits the save event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ChangeRolesEvent>()
rule.setChangeRolesContent(
setChangeRolesContent(
state = aChangeRolesState(
isSearchActive = true,
savingState = AsyncAction.ConfirmingCancellation,
eventSink = eventsRecorder,
),
)
rule.clickOn(CommonStrings.action_save)
clickOn(CommonStrings.action_save)
eventsRecorder.assertSingle(ChangeRolesEvent.Save)
}
@Test
fun `save admins confirmation dialog - submit saves the changes`() {
fun `save admins confirmation dialog - submit saves the changes`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ChangeRolesEvent>()
rule.setChangeRolesContent(
setChangeRolesContent(
state = aChangeRolesState(
role = RoomMember.Role.Admin,
isSearchActive = true,
@ -161,14 +160,14 @@ class ChangeRolesViewTest {
eventSink = eventsRecorder,
),
)
rule.clickOn(CommonStrings.action_ok)
clickOn(CommonStrings.action_ok)
eventsRecorder.assertSingle(ChangeRolesEvent.Save)
}
@Test
fun `save owners confirmation dialog - continue saves the changes`() {
fun `save owners confirmation dialog - continue saves the changes`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ChangeRolesEvent>()
rule.setChangeRolesContent(
setChangeRolesContent(
state = aChangeRolesState(
role = RoomMember.Role.Owner(isCreator = false),
isSearchActive = true,
@ -176,14 +175,14 @@ class ChangeRolesViewTest {
eventSink = eventsRecorder,
),
)
rule.clickOn(CommonStrings.action_continue)
clickOn(CommonStrings.action_continue)
eventsRecorder.assertSingle(ChangeRolesEvent.Save)
}
@Test
fun `save admins confirmation dialog - cancel removes the dialog`() {
fun `save admins confirmation dialog - cancel removes the dialog`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ChangeRolesEvent>()
rule.setChangeRolesContent(
setChangeRolesContent(
state = aChangeRolesState(
role = RoomMember.Role.Admin,
isSearchActive = true,
@ -191,14 +190,14 @@ class ChangeRolesViewTest {
eventSink = eventsRecorder,
),
)
rule.clickOn(CommonStrings.action_cancel)
clickOn(CommonStrings.action_cancel)
eventsRecorder.assertSingle(ChangeRolesEvent.CloseDialog)
}
@Test
fun `save owners confirmation dialog - cancel removes the dialog`() {
fun `save owners confirmation dialog - cancel removes the dialog`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ChangeRolesEvent>()
rule.setChangeRolesContent(
setChangeRolesContent(
state = aChangeRolesState(
role = RoomMember.Role.Owner(isCreator = false),
isSearchActive = true,
@ -206,39 +205,39 @@ class ChangeRolesViewTest {
eventSink = eventsRecorder,
),
)
rule.clickOn(CommonStrings.action_cancel)
clickOn(CommonStrings.action_cancel)
eventsRecorder.assertSingle(ChangeRolesEvent.CloseDialog)
}
@Test
fun `error dialog - dismissing removes the dialog`() {
fun `error dialog - dismissing removes the dialog`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ChangeRolesEvent>()
rule.setChangeRolesContent(
setChangeRolesContent(
state = aChangeRolesState(
isSearchActive = true,
savingState = AsyncAction.Failure(IllegalStateException("boom")),
eventSink = eventsRecorder,
),
)
rule.clickOn(CommonStrings.action_ok)
clickOn(CommonStrings.action_ok)
eventsRecorder.assertSingle(ChangeRolesEvent.CloseDialog)
}
@Test
fun `testing removing user from selected list emits the expected event`() {
fun `testing removing user from selected list emits the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ChangeRolesEvent>()
val selectedUsers = aMatrixUserList().take(2)
val userToDeselect = selectedUsers[1]
assertThat(userToDeselect.displayName).isEqualTo("Bob")
rule.setChangeRolesContent(
setChangeRolesContent(
state = aChangeRolesStateWithSelectedUsers().copy(
selectedUsers = selectedUsers.toImmutableList(),
eventSink = eventsRecorder,
),
)
// Unselect the user from the row list
val contentDescription = rule.activity.getString(CommonStrings.action_remove)
rule.onNodeWithContentDescription(
val contentDescription = activity!!.getString(CommonStrings.action_remove)
onNodeWithContentDescription(
label = contentDescription,
useUnmergedTree = true,
).performClick()
@ -247,7 +246,7 @@ class ChangeRolesViewTest {
@Test
@Config(qualifiers = "h1000dp")
fun `testing adding user to the selected list emits the expected event`() {
fun `testing adding user to the selected list emits the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ChangeRolesEvent>()
val selectedUsers = aMatrixUserList().take(2)
val state = aChangeRolesStateWithSelectedUsers().copy(
@ -256,16 +255,16 @@ class ChangeRolesViewTest {
)
val userToSelect = (state.searchResults as SearchBarResultState.Results).results.members.first().toMatrixUser()
assertThat(userToSelect.displayName).isEqualTo("Carol")
rule.setChangeRolesContent(
setChangeRolesContent(
state = state,
)
// Select the user from the user list
rule.onNodeWithText("Carol").performClick()
onNodeWithText("Carol").performClick()
eventsRecorder.assertSingle(ChangeRolesEvent.UserSelectionToggled(userToSelect))
}
@Test
fun `testing removing user to the selected list emits the expected event`() {
fun `testing removing user to the selected list emits the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ChangeRolesEvent>()
val selectedUsers = aMatrixUserList().take(2)
val state = aChangeRolesStateWithSelectedUsers().copy(
@ -274,18 +273,18 @@ class ChangeRolesViewTest {
)
val userToSelect = (state.searchResults as SearchBarResultState.Results).results.moderators.first().toMatrixUser()
assertThat(userToSelect.displayName).isEqualTo("Bob")
rule.setChangeRolesContent(
setChangeRolesContent(
state = state,
)
// Unselect the user from the user list
rule.onAllNodesWithText(
onAllNodesWithText(
text = "Bob",
useUnmergedTree = true,
)[1].performClick()
eventsRecorder.assertSingle(ChangeRolesEvent.UserSelectionToggled(userToSelect))
}
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setChangeRolesContent(
private fun AndroidComposeUiTest<ComponentActivity>.setChangeRolesContent(
state: ChangeRolesState,
) {
setContent {

View file

@ -6,11 +6,14 @@
* Please see LICENSE files in the repository root for full details.
*/
@file:OptIn(ExperimentalTestApi::class)
package io.element.android.features.rolesandpermissions.impl.root
import androidx.activity.ComponentActivity
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.AndroidComposeUiTest
import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.v2.runAndroidComposeUiTest
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.element.android.features.rolesandpermissions.impl.R
import io.element.android.libraries.architecture.AsyncAction
@ -23,159 +26,154 @@ import io.element.android.tests.testutils.ensureCalledOnce
import io.element.android.tests.testutils.ensureCalledTimes
import io.element.android.tests.testutils.pressBack
import io.element.android.tests.testutils.setSafeContent
import kotlinx.coroutines.test.runTest
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
import org.junit.runner.RunWith
import org.robolectric.annotation.Config
@RunWith(AndroidJUnit4::class)
class RolesAndPermissionsViewTest {
@get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
@Test
fun `click on back invokes expected callback`() {
fun `click on back invokes expected callback`() = runAndroidComposeUiTest {
ensureCalledOnce { callback ->
rule.setRolesAndPermissionsView(
setRolesAndPermissionsView(
goBack = callback,
)
rule.pressBack()
pressBack()
}
}
@Test
fun `tapping on Admins opens admin list`() {
fun `tapping on Admins opens admin list`() = runAndroidComposeUiTest {
ensureCalledOnce { callback ->
rule.setRolesAndPermissionsView(
setRolesAndPermissionsView(
aRolesAndPermissionsState(
roomSupportsOwners = false,
eventSink = EventsRecorder(expectEvents = false)
),
openAdminList = callback,
)
rule.clickOn(R.string.screen_room_roles_and_permissions_admins)
clickOn(R.string.screen_room_roles_and_permissions_admins)
}
}
@Test
fun `tapping on Admins and Owners opens admin list`() {
fun `tapping on Admins and Owners opens admin list`() = runAndroidComposeUiTest {
ensureCalledOnce { callback ->
rule.setRolesAndPermissionsView(
setRolesAndPermissionsView(
aRolesAndPermissionsState(
roomSupportsOwners = true,
eventSink = EventsRecorder(expectEvents = false)
),
openAdminList = callback,
)
rule.clickOn(R.string.screen_room_roles_and_permissions_admins_and_owners)
clickOn(R.string.screen_room_roles_and_permissions_admins_and_owners)
}
}
@Test
fun `tapping on Moderators opens moderators list`() {
fun `tapping on Moderators opens moderators list`() = runAndroidComposeUiTest {
ensureCalledOnce { callback ->
rule.setRolesAndPermissionsView(
setRolesAndPermissionsView(
openModeratorList = callback,
)
rule.clickOn(R.string.screen_room_roles_and_permissions_moderators)
clickOn(R.string.screen_room_roles_and_permissions_moderators)
}
}
@Test
@Config(qualifiers = "h640dp")
fun `tapping permission item open the change permissions screen`() {
fun `tapping permission item open the change permissions screen`() = runAndroidComposeUiTest {
ensureCalledTimes(1) { callback ->
rule.setRolesAndPermissionsView(
setRolesAndPermissionsView(
openEditPermissions = callback,
)
rule.clickOn(R.string.screen_room_roles_and_permissions_permissions_header)
clickOn(R.string.screen_room_roles_and_permissions_permissions_header)
}
}
@Test
@Config(qualifiers = "h640dp")
fun `tapping on reset permissions triggers ResetPermissions event`() {
fun `tapping on reset permissions triggers ResetPermissions event`() = runAndroidComposeUiTest {
val recorder = EventsRecorder<RolesAndPermissionsEvents>()
rule.setRolesAndPermissionsView(
setRolesAndPermissionsView(
state = aRolesAndPermissionsState(
eventSink = recorder,
),
)
rule.clickOn(R.string.screen_room_roles_and_permissions_reset)
clickOn(R.string.screen_room_roles_and_permissions_reset)
recorder.assertSingle(RolesAndPermissionsEvents.ResetPermissions)
}
@Test
fun `tapping on Reset in the reset permissions confirmation dialog triggers ResetPermissions event`() {
fun `tapping on Reset in the reset permissions confirmation dialog triggers ResetPermissions event`() = runAndroidComposeUiTest {
val recorder = EventsRecorder<RolesAndPermissionsEvents>()
rule.setRolesAndPermissionsView(
setRolesAndPermissionsView(
state = aRolesAndPermissionsState(
resetPermissionsAction = AsyncAction.ConfirmingNoParams,
eventSink = recorder,
),
)
rule.clickOn(CommonStrings.action_reset)
clickOn(CommonStrings.action_reset)
recorder.assertSingle(RolesAndPermissionsEvents.ResetPermissions)
}
@Test
fun `tapping on Cancel in the reset permissions confirmation dialog triggers CancelPendingAction event`() {
fun `tapping on Cancel in the reset permissions confirmation dialog triggers CancelPendingAction event`() = runAndroidComposeUiTest {
val recorder = EventsRecorder<RolesAndPermissionsEvents>()
rule.setRolesAndPermissionsView(
setRolesAndPermissionsView(
state = aRolesAndPermissionsState(
resetPermissionsAction = AsyncAction.ConfirmingNoParams,
eventSink = recorder,
),
)
rule.clickOn(CommonStrings.action_cancel)
clickOn(CommonStrings.action_cancel)
recorder.assertSingle(RolesAndPermissionsEvents.CancelPendingAction)
}
@Test
fun `tapping on 'Demote to moderator' in the demote self bottom sheet triggers the right event`() {
fun `tapping on 'Demote to moderator' in the demote self bottom sheet triggers the right event`() = runAndroidComposeUiTest {
val recorder = EventsRecorder<RolesAndPermissionsEvents>()
rule.setRolesAndPermissionsView(
setRolesAndPermissionsView(
state = aRolesAndPermissionsState(
changeOwnRoleAction = AsyncAction.ConfirmingNoParams,
eventSink = recorder,
),
)
rule.clickOn(R.string.screen_room_roles_and_permissions_change_role_demote_to_moderator)
rule.mainClock.advanceTimeBy(1_000L)
clickOn(R.string.screen_room_roles_and_permissions_change_role_demote_to_moderator)
mainClock.advanceTimeBy(1_000L)
recorder.assertSingle(RolesAndPermissionsEvents.DemoteSelfTo(RoomMember.Role.Moderator))
}
@Test
fun `tapping on 'Demote to member' in the demote self bottom sheet triggers the right event`() = runTest {
fun `tapping on 'Demote to member' in the demote self bottom sheet triggers the right event`() = runAndroidComposeUiTest {
val recorder = EventsRecorder<RolesAndPermissionsEvents>()
rule.setRolesAndPermissionsView(
setRolesAndPermissionsView(
state = aRolesAndPermissionsState(
changeOwnRoleAction = AsyncAction.ConfirmingNoParams,
eventSink = recorder,
),
)
rule.clickOn(R.string.screen_room_roles_and_permissions_change_role_demote_to_member)
rule.mainClock.advanceTimeBy(1_000L)
clickOn(R.string.screen_room_roles_and_permissions_change_role_demote_to_member)
mainClock.advanceTimeBy(1_000L)
recorder.assertSingle(RolesAndPermissionsEvents.DemoteSelfTo(RoomMember.Role.User))
}
@Test
fun `tapping on 'Cancel' in the demote self bottom sheet triggers the right event`() {
fun `tapping on 'Cancel' in the demote self bottom sheet triggers the right event`() = runAndroidComposeUiTest {
val recorder = EventsRecorder<RolesAndPermissionsEvents>()
rule.setRolesAndPermissionsView(
setRolesAndPermissionsView(
state = aRolesAndPermissionsState(
changeOwnRoleAction = AsyncAction.ConfirmingNoParams,
eventSink = recorder,
),
)
rule.clickOn(CommonStrings.action_cancel)
rule.mainClock.advanceTimeBy(1_000L)
clickOn(CommonStrings.action_cancel)
mainClock.advanceTimeBy(1_000L)
recorder.assertSingle(RolesAndPermissionsEvents.CancelPendingAction)
}
}
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setRolesAndPermissionsView(
private fun AndroidComposeUiTest<ComponentActivity>.setRolesAndPermissionsView(
state: RolesAndPermissionsState = aRolesAndPermissionsState(
roomSupportsOwners = false,
eventSink = EventsRecorder(expectEvents = false),