Migrate to v2 testing APIs
This commit is contained in:
parent
21795a86c1
commit
723b9b8d61
83 changed files with 2197 additions and 2320 deletions
|
|
@ -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(),
|
||||
) {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue