From dff0b5dce5565cc73c1b13c7907d1eac152a8c86 Mon Sep 17 00:00:00 2001 From: NIkita Fedrunov Date: Wed, 26 Jan 2022 16:07:56 +0100 Subject: [PATCH 1/2] Add all screens about Spaces in allScreensTest --- .../vector/app/ui/UiAllScreensSanityTest.kt | 18 ++ .../im/vector/app/ui/robot/ElementRobot.kt | 4 + .../java/im/vector/app/ui/robot/SpaceRobot.kt | 214 ++++++++++++++++++ 3 files changed, 236 insertions(+) create mode 100644 vector/src/androidTest/java/im/vector/app/ui/robot/SpaceRobot.kt diff --git a/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt b/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt index 042e9ef3ee..8d1f93bc1a 100644 --- a/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt +++ b/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt @@ -20,6 +20,7 @@ import androidx.test.espresso.IdlingPolicies import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest +import com.adevinta.android.barista.interaction.BaristaDrawerInteractions.openDrawer import im.vector.app.R import im.vector.app.espresso.tools.ScreenshotFailureRule import im.vector.app.features.MainActivity @@ -95,6 +96,23 @@ class UiAllScreensSanityTest { } } + elementRobot.space { + openDrawer() + createSpace() + openDrawer() + openSpaceMenu() + invitePeople() + openSpaceMenu() + spaceMembers() + spaceSettings() + exploreRooms() + addRoom() + openSpaceMenu() + addSpace() + openSpaceMenu() + leaveSpace() + } + elementRobot.withDeveloperMode { settings { advancedSettings { crawlDeveloperOptions() } diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt index d7e99c63dd..4363f69fb9 100644 --- a/vector/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt +++ b/vector/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt @@ -147,6 +147,10 @@ class ElementRobot { waitUntilViewVisible(withId(R.id.bottomSheetFragmentContainer)) }.onFailure { Timber.w("Verification popup missing", it) } } + + fun space(block: SpaceRobot.() -> Unit) { + block(SpaceRobot()) + } } private fun Boolean.toWarningType() = if (this) "shown" else "skipped" diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/SpaceRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/SpaceRobot.kt new file mode 100644 index 0000000000..154582f2ad --- /dev/null +++ b/vector/src/androidTest/java/im/vector/app/ui/robot/SpaceRobot.kt @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.ui.robot + +import androidx.recyclerview.widget.RecyclerView +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.Espresso.pressBack +import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.action.ViewActions.replaceText +import androidx.test.espresso.contrib.RecyclerViewActions +import androidx.test.espresso.matcher.ViewMatchers +import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility +import androidx.test.espresso.matcher.ViewMatchers.withHint +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withText +import com.adevinta.android.barista.interaction.BaristaClickInteractions.clickOn +import com.adevinta.android.barista.internal.viewaction.ClickChildAction.clickChildWithId +import im.vector.app.EspressoHelper +import im.vector.app.R +import im.vector.app.espresso.tools.waitUntilActivityVisible +import im.vector.app.espresso.tools.waitUntilDialogVisible +import im.vector.app.espresso.tools.waitUntilViewVisible +import im.vector.app.features.home.HomeActivity +import im.vector.app.features.invite.InviteUsersToRoomActivity +import im.vector.app.features.roomprofile.RoomProfileActivity +import im.vector.app.features.roomprofile.settings.joinrule.RoomJoinRuleActivity +import im.vector.app.features.spaces.SpaceCreationActivity +import im.vector.app.features.spaces.SpaceExploreActivity +import im.vector.app.features.spaces.leave.SpaceLeaveAdvancedActivity +import im.vector.app.features.spaces.manage.SpaceManageActivity +import org.hamcrest.Matchers.allOf +import java.util.UUID + +class SpaceRobot { + + fun createSpace() { + clickOn(R.string.add_space) + waitUntilActivityVisible { + waitUntilViewVisible(withId(R.id.privateButton)) + } + crawlCreate() + + onView(withId(R.id.roomList)) + .perform( + RecyclerViewActions.actionOnItem( + ViewMatchers.hasDescendant(withText(R.string.room_displayname_empty_room)), + click() + ).atPosition(0) + ) + clickOn(R.id.spaceAddRoomSaveItem) + waitUntilActivityVisible { + waitUntilViewVisible(withId(R.id.roomListContainer)) + } + } + + private fun crawlCreate() { + //public + clickOn(R.id.publicButton) + waitUntilViewVisible(withId(R.id.recyclerView)) + onView(withHint(R.string.create_room_name_hint)).perform(replaceText(UUID.randomUUID().toString())) + clickOn(R.id.nextButton) + waitUntilViewVisible(withId(R.id.recyclerView)) + pressBack() + pressBack() + + //private + clickOn(R.id.privateButton) + waitUntilViewVisible(withId(R.id.recyclerView)) + clickOn(R.id.nextButton) + + waitUntilViewVisible(withId(R.id.teammatesButton)) + //me and teammates + clickOn(R.id.teammatesButton) + waitUntilViewVisible(withId(R.id.recyclerView)) + clickOn(R.id.nextButton) + pressBack() + pressBack() + + //just me + waitUntilViewVisible(withId(R.id.justMeButton)) + clickOn(R.id.justMeButton) + waitUntilActivityVisible { + waitUntilViewVisible(withId(R.id.roomList)) + } + } + + fun openSpaceMenu() { + waitUntilViewVisible(withId(R.id.groupListView)) + onView(withId(R.id.groupListView)) + .perform( + RecyclerViewActions.actionOnItem( + ViewMatchers.hasDescendant(allOf(withId(R.id.groupTmpLeave), withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))), + clickChildWithId(R.id.groupTmpLeave) + ).atPosition(0) + ) + waitUntilDialogVisible(withId(R.id.spaceNameView)) + } + + fun invitePeople() { + clickOn(R.id.invitePeople) + waitUntilDialogVisible(withId(R.id.inviteByMxidButton)) + clickOn(R.id.inviteByMxidButton) + waitUntilActivityVisible { + waitUntilViewVisible(withId(R.id.userListRecyclerView)) + } + EspressoHelper.getCurrentActivity()!!.finish() + //close invite dialog + pressBack() + } + + fun spaceMembers() { + clickOn(R.id.showMemberList) + waitUntilActivityVisible { + waitUntilViewVisible(withId(R.id.roomSettingsRecyclerView)) + } + pressBack() + } + + fun spaceSettings() { + clickOn(R.id.spaceSettings) + waitUntilActivityVisible() { + waitUntilViewVisible(withId(R.id.roomSettingsRecyclerView)) + } + crawlSettings() + } + + private fun crawlSettings() { + onView(withId(R.id.roomSettingsRecyclerView)) + .perform( + RecyclerViewActions.actionOnItem( + ViewMatchers.hasDescendant(withText(R.string.room_settings_space_access_title)), + click() + ) + ) + + waitUntilActivityVisible() { + waitUntilViewVisible(withId(R.id.genericRecyclerView)) + } + + pressBack() + + onView(withId(R.id.roomSettingsRecyclerView)) + .perform( + RecyclerViewActions.actionOnItem( + ViewMatchers.hasDescendant(withText(R.string.space_settings_manage_rooms)), + click() + ) + ) + + waitUntilViewVisible(withId(R.id.roomList)) + pressBack() + + onView(withId(R.id.roomSettingsRecyclerView)) + .perform( + RecyclerViewActions.actionOnItem( + ViewMatchers.hasDescendant(withText(R.string.space_settings_permissions_title)), + click() + ) + ) + + waitUntilViewVisible(withId(R.id.roomSettingsRecyclerView)) + pressBack() + pressBack() + } + + fun exploreRooms() { + clickOn(R.id.exploreRooms) + waitUntilActivityVisible { + waitUntilViewVisible(withId(R.id.spaceDirectoryList)) + } + pressBack() + } + + fun addRoom() { + clickOn(R.id.addRooms) + waitUntilActivityVisible { + waitUntilViewVisible(withId(R.id.roomList)) + } + pressBack() + } + + fun addSpace() { + clickOn(R.id.addSpaces) + waitUntilActivityVisible { + waitUntilViewVisible(withId(R.id.roomList)) + } + pressBack() + } + + fun leaveSpace() { + clickOn(R.id.leaveSpace) + waitUntilDialogVisible(withId(R.id.leaveButton)) + clickOn(R.id.leave_selected) + waitUntilActivityVisible { + waitUntilViewVisible(withId(R.id.roomList)) + } + clickOn(R.id.spaceLeaveButton) + waitUntilViewVisible(withId(R.id.groupListView)) + } +} From 29088acdb324c447951dacbac8d619077cf15a5a Mon Sep 17 00:00:00 2001 From: NIkita Fedrunov Date: Wed, 2 Feb 2022 11:29:27 +0100 Subject: [PATCH 2/2] Code review fixes --- .../java/im/vector/app/EspressoExt.kt | 1 + .../vector/app/ui/UiAllScreensSanityTest.kt | 147 ++++++------ .../im/vector/app/ui/robot/ElementRobot.kt | 1 + .../java/im/vector/app/ui/robot/SpaceRobot.kt | 214 ------------------ .../app/ui/robot/space/SpaceCreateRobot.kt | 102 +++++++++ .../app/ui/robot/space/SpaceMenuRobot.kt | 116 ++++++++++ .../vector/app/ui/robot/space/SpaceRobot.kt | 38 ++++ .../app/ui/robot/space/SpaceSettingsRobot.kt | 68 ++++++ 8 files changed, 401 insertions(+), 286 deletions(-) delete mode 100644 vector/src/androidTest/java/im/vector/app/ui/robot/SpaceRobot.kt create mode 100644 vector/src/androidTest/java/im/vector/app/ui/robot/space/SpaceCreateRobot.kt create mode 100644 vector/src/androidTest/java/im/vector/app/ui/robot/space/SpaceMenuRobot.kt create mode 100644 vector/src/androidTest/java/im/vector/app/ui/robot/space/SpaceRobot.kt create mode 100644 vector/src/androidTest/java/im/vector/app/ui/robot/space/SpaceSettingsRobot.kt diff --git a/vector/src/androidTest/java/im/vector/app/EspressoExt.kt b/vector/src/androidTest/java/im/vector/app/EspressoExt.kt index 59ad122f36..1c3799f81d 100644 --- a/vector/src/androidTest/java/im/vector/app/EspressoExt.kt +++ b/vector/src/androidTest/java/im/vector/app/EspressoExt.kt @@ -195,6 +195,7 @@ fun activityIdlingResource(activityClass: Class<*>): IdlingResource { println("*** [$name] onActivityLifecycleChanged callback: $callback") callback?.onTransitionToIdle() } + else -> {} } } } diff --git a/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt b/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt index 8d1f93bc1a..1f47f3a798 100644 --- a/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt +++ b/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt @@ -20,13 +20,9 @@ import androidx.test.espresso.IdlingPolicies import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest -import com.adevinta.android.barista.interaction.BaristaDrawerInteractions.openDrawer -import im.vector.app.R import im.vector.app.espresso.tools.ScreenshotFailureRule import im.vector.app.features.MainActivity -import im.vector.app.getString import im.vector.app.ui.robot.ElementRobot -import im.vector.app.ui.robot.withDeveloperMode import org.junit.Rule import org.junit.Test import org.junit.rules.RuleChain @@ -56,88 +52,95 @@ class UiAllScreensSanityTest { fun allScreensTest() { IdlingPolicies.setMasterPolicyTimeout(120, TimeUnit.SECONDS) - elementRobot.onboarding { - crawl() - } +// elementRobot.onboarding { +// crawl() +// } // Create an account - val userId = "UiTest_" + UUID.randomUUID().toString() - elementRobot.signUp(userId) +// val userId = "UiTest_" + UUID.randomUUID().toString() +// elementRobot.signUp(userId) - elementRobot.settings { - general { crawl() } - notifications { crawl() } - preferences { crawl() } - voiceAndVideo() - ignoredUsers() - // TODO Test analytics - securityAndPrivacy { crawl() } - labs() - advancedSettings { crawl() } - // TODO Rework this part (Legals, etc.) - // helpAndAbout { crawl() } - } +// elementRobot.settings { +// general { crawl() } +// notifications { crawl() } +// preferences { crawl() } +// voiceAndVideo() +// ignoredUsers() +// // TODO Test analytics +// securityAndPrivacy { crawl() } +// labs() +// advancedSettings { crawl() } +// // TODO Rework this part (Legals, etc.) +// // helpAndAbout { crawl() } +// } - elementRobot.newDirectMessage { - verifyQrCodeButton() - verifyInviteFriendsButton() - } +// elementRobot.newDirectMessage { +// verifyQrCodeButton() +// verifyInviteFriendsButton() +// } - elementRobot.newRoom { - createNewRoom { - crawl() - createRoom { - val message = "Hello world!" - postMessage(message) - crawl() - crawlMessage(message) - openSettings { crawl() } - } - } - } +// elementRobot.newRoom { +// createNewRoom { +// crawl() +// createRoom { +// val message = "Hello world!" +// postMessage(message) +// crawl() +// crawlMessage(message) +// openSettings { crawl() } +// } +// } +// } elementRobot.space { - openDrawer() - createSpace() - openDrawer() - openSpaceMenu() - invitePeople() - openSpaceMenu() - spaceMembers() - spaceSettings() - exploreRooms() - addRoom() - openSpaceMenu() - addSpace() - openSpaceMenu() - leaveSpace() - } - - elementRobot.withDeveloperMode { - settings { - advancedSettings { crawlDeveloperOptions() } + createSpace { + crawl() } - roomList { - openRoom(getString(R.string.room_displayname_empty_room)) { - val message = "Test view source" - postMessage(message) - openMessageMenu(message) { - viewSource() - } + val spaceName = UUID.randomUUID().toString() + createSpace { + createPublicSpace(spaceName) + } + + spaceMenu(spaceName) { + spaceMembers() + spaceSettings { + crawl() } + exploreRooms() + + invitePeople().also { openMenu(spaceName) } + addRoom().also { openMenu(spaceName) } + addSpace().also { openMenu(spaceName) } + + leaveSpace() } } - elementRobot.roomList { - verifyCreatedRoom() - } +// elementRobot.withDeveloperMode { +// settings { +// advancedSettings { crawlDeveloperOptions() } +// } +// roomList { +// openRoom(getString(R.string.room_displayname_empty_room)) { +// val message = "Test view source" +// postMessage(message) +// openMessageMenu(message) { +// viewSource() +// } +// } +// } +// } - elementRobot.signout(expectSignOutWarning = true) +// elementRobot.roomList { +// verifyCreatedRoom() +// } + +// elementRobot.signout(expectSignOutWarning = true) // Login again on the same account - elementRobot.login(userId) - elementRobot.dismissVerificationIfPresent() - // TODO Deactivate account instead of logout? - elementRobot.signout(expectSignOutWarning = false) +// elementRobot.login(userId) +// elementRobot.dismissVerificationIfPresent() +// TODO Deactivate account instead of logout? +// elementRobot.signout(expectSignOutWarning = false) } } diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt index 4363f69fb9..023ee6ad99 100644 --- a/vector/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt +++ b/vector/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt @@ -35,6 +35,7 @@ import im.vector.app.features.home.HomeActivity import im.vector.app.features.onboarding.OnboardingActivity import im.vector.app.initialSyncIdlingResource import im.vector.app.ui.robot.settings.SettingsRobot +import im.vector.app.ui.robot.space.SpaceRobot import im.vector.app.withIdlingResource import timber.log.Timber diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/SpaceRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/SpaceRobot.kt deleted file mode 100644 index 154582f2ad..0000000000 --- a/vector/src/androidTest/java/im/vector/app/ui/robot/SpaceRobot.kt +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (c) 2021 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.app.ui.robot - -import androidx.recyclerview.widget.RecyclerView -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.Espresso.pressBack -import androidx.test.espresso.action.ViewActions.click -import androidx.test.espresso.action.ViewActions.replaceText -import androidx.test.espresso.contrib.RecyclerViewActions -import androidx.test.espresso.matcher.ViewMatchers -import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility -import androidx.test.espresso.matcher.ViewMatchers.withHint -import androidx.test.espresso.matcher.ViewMatchers.withId -import androidx.test.espresso.matcher.ViewMatchers.withText -import com.adevinta.android.barista.interaction.BaristaClickInteractions.clickOn -import com.adevinta.android.barista.internal.viewaction.ClickChildAction.clickChildWithId -import im.vector.app.EspressoHelper -import im.vector.app.R -import im.vector.app.espresso.tools.waitUntilActivityVisible -import im.vector.app.espresso.tools.waitUntilDialogVisible -import im.vector.app.espresso.tools.waitUntilViewVisible -import im.vector.app.features.home.HomeActivity -import im.vector.app.features.invite.InviteUsersToRoomActivity -import im.vector.app.features.roomprofile.RoomProfileActivity -import im.vector.app.features.roomprofile.settings.joinrule.RoomJoinRuleActivity -import im.vector.app.features.spaces.SpaceCreationActivity -import im.vector.app.features.spaces.SpaceExploreActivity -import im.vector.app.features.spaces.leave.SpaceLeaveAdvancedActivity -import im.vector.app.features.spaces.manage.SpaceManageActivity -import org.hamcrest.Matchers.allOf -import java.util.UUID - -class SpaceRobot { - - fun createSpace() { - clickOn(R.string.add_space) - waitUntilActivityVisible { - waitUntilViewVisible(withId(R.id.privateButton)) - } - crawlCreate() - - onView(withId(R.id.roomList)) - .perform( - RecyclerViewActions.actionOnItem( - ViewMatchers.hasDescendant(withText(R.string.room_displayname_empty_room)), - click() - ).atPosition(0) - ) - clickOn(R.id.spaceAddRoomSaveItem) - waitUntilActivityVisible { - waitUntilViewVisible(withId(R.id.roomListContainer)) - } - } - - private fun crawlCreate() { - //public - clickOn(R.id.publicButton) - waitUntilViewVisible(withId(R.id.recyclerView)) - onView(withHint(R.string.create_room_name_hint)).perform(replaceText(UUID.randomUUID().toString())) - clickOn(R.id.nextButton) - waitUntilViewVisible(withId(R.id.recyclerView)) - pressBack() - pressBack() - - //private - clickOn(R.id.privateButton) - waitUntilViewVisible(withId(R.id.recyclerView)) - clickOn(R.id.nextButton) - - waitUntilViewVisible(withId(R.id.teammatesButton)) - //me and teammates - clickOn(R.id.teammatesButton) - waitUntilViewVisible(withId(R.id.recyclerView)) - clickOn(R.id.nextButton) - pressBack() - pressBack() - - //just me - waitUntilViewVisible(withId(R.id.justMeButton)) - clickOn(R.id.justMeButton) - waitUntilActivityVisible { - waitUntilViewVisible(withId(R.id.roomList)) - } - } - - fun openSpaceMenu() { - waitUntilViewVisible(withId(R.id.groupListView)) - onView(withId(R.id.groupListView)) - .perform( - RecyclerViewActions.actionOnItem( - ViewMatchers.hasDescendant(allOf(withId(R.id.groupTmpLeave), withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))), - clickChildWithId(R.id.groupTmpLeave) - ).atPosition(0) - ) - waitUntilDialogVisible(withId(R.id.spaceNameView)) - } - - fun invitePeople() { - clickOn(R.id.invitePeople) - waitUntilDialogVisible(withId(R.id.inviteByMxidButton)) - clickOn(R.id.inviteByMxidButton) - waitUntilActivityVisible { - waitUntilViewVisible(withId(R.id.userListRecyclerView)) - } - EspressoHelper.getCurrentActivity()!!.finish() - //close invite dialog - pressBack() - } - - fun spaceMembers() { - clickOn(R.id.showMemberList) - waitUntilActivityVisible { - waitUntilViewVisible(withId(R.id.roomSettingsRecyclerView)) - } - pressBack() - } - - fun spaceSettings() { - clickOn(R.id.spaceSettings) - waitUntilActivityVisible() { - waitUntilViewVisible(withId(R.id.roomSettingsRecyclerView)) - } - crawlSettings() - } - - private fun crawlSettings() { - onView(withId(R.id.roomSettingsRecyclerView)) - .perform( - RecyclerViewActions.actionOnItem( - ViewMatchers.hasDescendant(withText(R.string.room_settings_space_access_title)), - click() - ) - ) - - waitUntilActivityVisible() { - waitUntilViewVisible(withId(R.id.genericRecyclerView)) - } - - pressBack() - - onView(withId(R.id.roomSettingsRecyclerView)) - .perform( - RecyclerViewActions.actionOnItem( - ViewMatchers.hasDescendant(withText(R.string.space_settings_manage_rooms)), - click() - ) - ) - - waitUntilViewVisible(withId(R.id.roomList)) - pressBack() - - onView(withId(R.id.roomSettingsRecyclerView)) - .perform( - RecyclerViewActions.actionOnItem( - ViewMatchers.hasDescendant(withText(R.string.space_settings_permissions_title)), - click() - ) - ) - - waitUntilViewVisible(withId(R.id.roomSettingsRecyclerView)) - pressBack() - pressBack() - } - - fun exploreRooms() { - clickOn(R.id.exploreRooms) - waitUntilActivityVisible { - waitUntilViewVisible(withId(R.id.spaceDirectoryList)) - } - pressBack() - } - - fun addRoom() { - clickOn(R.id.addRooms) - waitUntilActivityVisible { - waitUntilViewVisible(withId(R.id.roomList)) - } - pressBack() - } - - fun addSpace() { - clickOn(R.id.addSpaces) - waitUntilActivityVisible { - waitUntilViewVisible(withId(R.id.roomList)) - } - pressBack() - } - - fun leaveSpace() { - clickOn(R.id.leaveSpace) - waitUntilDialogVisible(withId(R.id.leaveButton)) - clickOn(R.id.leave_selected) - waitUntilActivityVisible { - waitUntilViewVisible(withId(R.id.roomList)) - } - clickOn(R.id.spaceLeaveButton) - waitUntilViewVisible(withId(R.id.groupListView)) - } -} diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/space/SpaceCreateRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/space/SpaceCreateRobot.kt new file mode 100644 index 0000000000..082adcb173 --- /dev/null +++ b/vector/src/androidTest/java/im/vector/app/ui/robot/space/SpaceCreateRobot.kt @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.ui.robot.space + +import androidx.recyclerview.widget.RecyclerView +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.Espresso.pressBack +import androidx.test.espresso.action.ViewActions +import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.contrib.RecyclerViewActions +import androidx.test.espresso.matcher.ViewMatchers +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withText +import com.adevinta.android.barista.interaction.BaristaClickInteractions.clickOn +import im.vector.app.R +import im.vector.app.espresso.tools.waitUntilActivityVisible +import im.vector.app.espresso.tools.waitUntilDialogVisible +import im.vector.app.espresso.tools.waitUntilViewVisible +import im.vector.app.features.home.HomeActivity +import im.vector.app.features.home.room.detail.RoomDetailActivity +import im.vector.app.features.spaces.manage.SpaceManageActivity +import java.util.UUID + +class SpaceCreateRobot { + + fun crawl() { + // public + clickOn(R.id.publicButton) + waitUntilViewVisible(withId(R.id.recyclerView)) + onView(ViewMatchers.withHint(R.string.create_room_name_hint)).perform(ViewActions.replaceText(UUID.randomUUID().toString())) + clickOn(R.id.nextButton) + waitUntilViewVisible(withId(R.id.recyclerView)) + pressBack() + pressBack() + + // private + clickOn(R.id.privateButton) + waitUntilViewVisible(withId(R.id.recyclerView)) + clickOn(R.id.nextButton) + + waitUntilViewVisible(withId(R.id.teammatesButton)) + // me and teammates + clickOn(R.id.teammatesButton) + waitUntilViewVisible(withId(R.id.recyclerView)) + clickOn(R.id.nextButton) + pressBack() + pressBack() + + // just me + waitUntilViewVisible(withId(R.id.justMeButton)) + clickOn(R.id.justMeButton) + waitUntilActivityVisible { + waitUntilViewVisible(withId(R.id.roomList)) + } + + onView(withId(R.id.roomList)) + .perform( + RecyclerViewActions.actionOnItem( + ViewMatchers.hasDescendant(withText(R.string.room_displayname_empty_room)), + click() + ).atPosition(0) + ) + clickOn(R.id.spaceAddRoomSaveItem) + waitUntilActivityVisible { + waitUntilViewVisible(withId(R.id.roomListContainer)) + } + } + + fun createPublicSpace(spaceName: String) { + clickOn(R.id.publicButton) + waitUntilViewVisible(withId(R.id.recyclerView)) + onView(ViewMatchers.withHint(R.string.create_room_name_hint)).perform(ViewActions.replaceText(spaceName)) + clickOn(R.id.nextButton) + waitUntilViewVisible(withId(R.id.recyclerView)) + clickOn(R.id.nextButton) + waitUntilActivityVisible { + waitUntilDialogVisible(withId(R.id.inviteByMxidButton)) + } + // close invite dialog + pressBack() + + waitUntilViewVisible(withId(R.id.timelineRecyclerView)) + // close room + pressBack() + + waitUntilViewVisible(withId(R.id.roomListContainer)) + } +} diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/space/SpaceMenuRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/space/SpaceMenuRobot.kt new file mode 100644 index 0000000000..74389fa723 --- /dev/null +++ b/vector/src/androidTest/java/im/vector/app/ui/robot/space/SpaceMenuRobot.kt @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.ui.robot.space + +import androidx.recyclerview.widget.RecyclerView +import androidx.test.espresso.Espresso +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.contrib.RecyclerViewActions +import androidx.test.espresso.matcher.ViewMatchers +import com.adevinta.android.barista.interaction.BaristaClickInteractions.clickOn +import com.adevinta.android.barista.internal.viewaction.ClickChildAction +import im.vector.app.R +import im.vector.app.espresso.tools.waitUntilActivityVisible +import im.vector.app.espresso.tools.waitUntilDialogVisible +import im.vector.app.espresso.tools.waitUntilViewVisible +import im.vector.app.features.invite.InviteUsersToRoomActivity +import im.vector.app.features.roomprofile.RoomProfileActivity +import im.vector.app.features.spaces.SpaceExploreActivity +import im.vector.app.features.spaces.leave.SpaceLeaveAdvancedActivity +import im.vector.app.features.spaces.manage.SpaceManageActivity +import org.hamcrest.Matchers + +class SpaceMenuRobot { + + fun openMenu(spaceName: String) { + waitUntilViewVisible(ViewMatchers.withId(R.id.groupListView)) + onView(ViewMatchers.withId(R.id.groupListView)) + .perform( + RecyclerViewActions.actionOnItem( + ViewMatchers.hasDescendant(Matchers.allOf(ViewMatchers.withId(R.id.groupNameView), ViewMatchers.withText(spaceName))), + ClickChildAction.clickChildWithId(R.id.groupTmpLeave) + ).atPosition(0) + ) + waitUntilDialogVisible(ViewMatchers.withId(R.id.spaceNameView)) + } + + fun invitePeople() = apply { + clickOn(R.id.invitePeople) + waitUntilDialogVisible(ViewMatchers.withId(R.id.inviteByMxidButton)) + clickOn(R.id.inviteByMxidButton) + waitUntilActivityVisible { + waitUntilViewVisible(ViewMatchers.withId(R.id.userListRecyclerView)) + } + // close keyboard + Espresso.pressBack() + // close invite view + Espresso.pressBack() + + Espresso.pressBack() + } + + fun spaceMembers() { + clickOn(R.id.showMemberList) + waitUntilActivityVisible { + waitUntilViewVisible(ViewMatchers.withId(R.id.roomSettingsRecyclerView)) + } + Espresso.pressBack() + } + + fun spaceSettings(block: SpaceSettingsRobot.() -> Unit) { + clickOn(R.id.spaceSettings) + waitUntilActivityVisible { + waitUntilViewVisible(ViewMatchers.withId(R.id.roomSettingsRecyclerView)) + } + block(SpaceSettingsRobot()) + } + + fun exploreRooms() { + clickOn(R.id.exploreRooms) + waitUntilActivityVisible { + waitUntilViewVisible(ViewMatchers.withId(R.id.spaceDirectoryList)) + } + Espresso.pressBack() + } + + fun addRoom() = apply { + clickOn(R.id.addRooms) + waitUntilActivityVisible { + waitUntilViewVisible(ViewMatchers.withId(R.id.roomList)) + } + Espresso.pressBack() + } + + fun addSpace() = apply { + clickOn(R.id.addSpaces) + waitUntilActivityVisible { + waitUntilViewVisible(ViewMatchers.withId(R.id.roomList)) + } + Espresso.pressBack() + } + + fun leaveSpace() { + clickOn(R.id.leaveSpace) + waitUntilDialogVisible(ViewMatchers.withId(R.id.leaveButton)) + clickOn(R.id.leave_selected) + waitUntilActivityVisible { + waitUntilViewVisible(ViewMatchers.withId(R.id.roomList)) + } + clickOn(R.id.spaceLeaveButton) + waitUntilViewVisible(ViewMatchers.withId(R.id.groupListView)) + } +} diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/space/SpaceRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/space/SpaceRobot.kt new file mode 100644 index 0000000000..ffb3c24051 --- /dev/null +++ b/vector/src/androidTest/java/im/vector/app/ui/robot/space/SpaceRobot.kt @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.ui.robot.space + +import com.adevinta.android.barista.interaction.BaristaClickInteractions.clickOn +import com.adevinta.android.barista.interaction.BaristaDrawerInteractions.openDrawer +import im.vector.app.R + +class SpaceRobot { + + fun createSpace(block: SpaceCreateRobot.() -> Unit) { + openDrawer() + clickOn(R.string.add_space) + block(SpaceCreateRobot()) + } + + fun spaceMenu(spaceName: String, block: SpaceMenuRobot.() -> Unit) { + openDrawer() + with(SpaceMenuRobot()) { + openMenu(spaceName) + block() + } + } +} diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/space/SpaceSettingsRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/space/SpaceSettingsRobot.kt new file mode 100644 index 0000000000..dcd003da98 --- /dev/null +++ b/vector/src/androidTest/java/im/vector/app/ui/robot/space/SpaceSettingsRobot.kt @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.ui.robot.space + +import androidx.recyclerview.widget.RecyclerView +import androidx.test.espresso.Espresso +import androidx.test.espresso.action.ViewActions +import androidx.test.espresso.contrib.RecyclerViewActions +import androidx.test.espresso.matcher.ViewMatchers +import im.vector.app.R +import im.vector.app.espresso.tools.waitUntilActivityVisible +import im.vector.app.espresso.tools.waitUntilViewVisible +import im.vector.app.features.roomprofile.settings.joinrule.RoomJoinRuleActivity + +class SpaceSettingsRobot { + fun crawl() { + Espresso.onView(ViewMatchers.withId(R.id.roomSettingsRecyclerView)) + .perform( + RecyclerViewActions.actionOnItem( + ViewMatchers.hasDescendant(ViewMatchers.withText(R.string.room_settings_space_access_title)), + ViewActions.click() + ) + ) + + waitUntilActivityVisible { + waitUntilViewVisible(ViewMatchers.withId(R.id.genericRecyclerView)) + } + + Espresso.pressBack() + + Espresso.onView(ViewMatchers.withId(R.id.roomSettingsRecyclerView)) + .perform( + RecyclerViewActions.actionOnItem( + ViewMatchers.hasDescendant(ViewMatchers.withText(R.string.space_settings_manage_rooms)), + ViewActions.click() + ) + ) + + waitUntilViewVisible(ViewMatchers.withId(R.id.roomList)) + Espresso.pressBack() + + Espresso.onView(ViewMatchers.withId(R.id.roomSettingsRecyclerView)) + .perform( + RecyclerViewActions.actionOnItem( + ViewMatchers.hasDescendant(ViewMatchers.withText(R.string.space_settings_permissions_title)), + ViewActions.click() + ) + ) + + waitUntilViewVisible(ViewMatchers.withId(R.id.roomSettingsRecyclerView)) + Espresso.pressBack() + Espresso.pressBack() + } +}