From 69c05e63d4bbf87d33dc189d20482890ed4c2b49 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Tue, 18 Jan 2022 11:46:49 +0000 Subject: [PATCH 1/6] only reverting to the combined sign in/sign up screen when the currently login mode isn't supported - eg for a SSO only flow or unknown/unsupported --- .../app/features/onboarding/OnboardingViewModel.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt index 366ad044b3..43f37f4601 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt @@ -852,7 +852,7 @@ class OnboardingViewModel @AssistedInject constructor( } withState { - if (it.serverType == ServerType.MatrixOrg) { + if (loginMode.supportsSignModeScreen()) { when (it.onboardingFlow) { OnboardingFlow.SignIn -> handleUpdateSignMode(OnboardingAction.UpdateSignMode(SignMode.SignIn)) OnboardingFlow.SignUp -> handleUpdateSignMode(OnboardingAction.UpdateSignMode(SignMode.SignUp)) @@ -880,3 +880,13 @@ class OnboardingViewModel @AssistedInject constructor( return authenticationService.getFallbackUrl(forSignIn, deviceId) } } + +private fun LoginMode.supportsSignModeScreen(): Boolean { + return when (this) { + LoginMode.Password, + is LoginMode.SsoAndPassword -> true + is LoginMode.Sso, + LoginMode.Unknown, + LoginMode.Unsupported -> false + } +} From a3dd3a830cf2d80e092369593f6341cf6d3e07be Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Tue, 18 Jan 2022 12:37:42 +0000 Subject: [PATCH 2/6] fixing wrong wait function being used --- .../androidTest/java/im/vector/app/ui/robot/RoomDetailRobot.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/RoomDetailRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/RoomDetailRobot.kt index 53d6c16bb7..a5cd0badb3 100644 --- a/vector/src/androidTest/java/im/vector/app/ui/robot/RoomDetailRobot.kt +++ b/vector/src/androidTest/java/im/vector/app/ui/robot/RoomDetailRobot.kt @@ -127,7 +127,7 @@ class RoomDetailRobot { fun openSettings(block: RoomSettingsRobot.() -> Unit) { clickMenu(R.id.timeline_setting) - waitForView(withId(R.id.roomProfileAvatarView)) + waitUntilViewVisible(withId(R.id.roomProfileAvatarView)) sleep(1000) block(RoomSettingsRobot()) pressBack() From eb763bb5bb09d8d60f3157d929ba4334153d1c3b Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Tue, 18 Jan 2022 12:38:03 +0000 Subject: [PATCH 3/6] adding onboarding option crawling to the sanity tests --- .../vector/app/ui/UiAllScreensSanityTest.kt | 4 + .../im/vector/app/ui/robot/ElementRobot.kt | 4 + .../im/vector/app/ui/robot/OnboardingRobot.kt | 92 +++++++++++++++++++ 3 files changed, 100 insertions(+) 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 33e1e6f6b4..042e9ef3ee 100644 --- a/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt +++ b/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt @@ -55,6 +55,10 @@ class UiAllScreensSanityTest { fun allScreensTest() { IdlingPolicies.setMasterPolicyTimeout(120, TimeUnit.SECONDS) + elementRobot.onboarding { + crawl() + } + // Create an account val userId = "UiTest_" + UUID.randomUUID().toString() elementRobot.signUp(userId) 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 22a5a0790b..638cf9840e 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 @@ -40,6 +40,10 @@ import timber.log.Timber class ElementRobot { + fun onboarding(block: OnboardingRobot.() -> Unit) { + block(OnboardingRobot()) + } + fun signUp(userId: String) { val onboardingRobot = OnboardingRobot() onboardingRobot.createAccount(userId = userId) diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt index 633d3cceab..57693709c6 100644 --- a/vector/src/androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt +++ b/vector/src/androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt @@ -18,6 +18,7 @@ package im.vector.app.ui.robot import androidx.test.espresso.Espresso.closeSoftKeyboard import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.Espresso.pressBack import androidx.test.espresso.matcher.ViewMatchers.isRoot import androidx.test.espresso.matcher.ViewMatchers.withId import com.adevinta.android.barista.assertion.BaristaEnabledAssertions.assertDisabled @@ -31,6 +32,24 @@ import im.vector.app.waitForView class OnboardingRobot { + fun crawl() { + waitUntilViewVisible(withId(R.id.loginSplashSubmit)) + crawlGetStarted() + crawlAlreadyHaveAccount() + } + + private fun crawlGetStarted() { + clickOn(R.id.loginSplashSubmit) + AuthOptionsRobot().crawlGetStarted() + pressBack() + } + + private fun crawlAlreadyHaveAccount() { + clickOn(R.id.loginSplashAlreadyHaveAccount) + AuthOptionsRobot().crawlAlreadyHaveAccount() + pressBack() + } + fun createAccount(userId: String, password: String = "password", homeServerUrl: String = "http://10.0.2.2:8080") { initSession(true, userId, password, homeServerUrl) } @@ -73,3 +92,76 @@ class OnboardingRobot { clickOn(R.id.loginSubmit) } } + +class AuthOptionsRobot { + + fun crawlGetStarted() { + assertDisplayed(R.id.loginServerTitle, R.string.login_server_title) + crawlMatrixServer(isSignUp = true) + crawlEmsServer() + crawlOtherServer(isSignUp = true) + crawlSignInWithMatrixId() + } + + fun crawlAlreadyHaveAccount() { + assertDisplayed(R.id.loginServerTitle, R.string.login_server_title) + crawlMatrixServer(isSignUp = false) + crawlEmsServer() + crawlOtherServer(isSignUp = false) + crawlSignInWithMatrixId() + } + + private fun crawlOtherServer(isSignUp: Boolean) { + clickOn(R.id.loginServerChoiceOther) + waitUntilViewVisible(withId(R.id.loginServerUrlFormTitle)) + writeTo(R.id.loginServerUrlFormHomeServerUrl, "https://chat.mozilla.org") + clickOn(R.id.loginServerUrlFormSubmit) + waitUntilViewVisible(withId(R.id.loginSignupSigninTitle)) + assertDisplayed(R.id.loginSignupSigninText, "Connect to chat.mozilla.org") + assertDisplayed(R.id.loginSignupSigninSubmit, R.string.login_signin_sso) + pressBack() + + writeTo(R.id.loginServerUrlFormHomeServerUrl, "https://matrix.org") + clickOn(R.id.loginServerUrlFormSubmit) + assetMatrixSignInOptions(isSignUp) + pressBack() + pressBack() + } + + private fun crawlEmsServer() { + clickOn(R.id.loginServerChoiceEms) + waitUntilViewVisible(withId(R.id.loginServerUrlFormTitle)) + assertDisplayed(R.id.loginServerUrlFormTitle, R.string.login_connect_to_modular) + + writeTo(R.id.loginServerUrlFormHomeServerUrl, "https://one.ems.host") + clickOn(R.id.loginServerUrlFormSubmit) + + waitUntilViewVisible(withId(R.id.loginSignupSigninTitle)) + assertDisplayed(R.id.loginSignupSigninText, "one.ems.host") + assertDisplayed(R.id.loginSignupSigninSubmit, R.string.login_signin_sso) + pressBack() + pressBack() + } + + private fun crawlMatrixServer(isSignUp: Boolean) { + clickOn(R.id.loginServerChoiceMatrixOrg) + assetMatrixSignInOptions(isSignUp) + pressBack() + } + + private fun assetMatrixSignInOptions(isSignUp: Boolean) { + waitUntilViewVisible(withId(R.id.loginTitle)) + when (isSignUp) { + true -> assertDisplayed(R.id.loginTitle, "Sign up to matrix.org") + false -> assertDisplayed(R.id.loginTitle, "Connect to matrix.org") + } + } + + private fun crawlSignInWithMatrixId() { + clickOn(R.id.loginServerIKnowMyIdSubmit) + waitUntilViewVisible(withId(R.id.loginTitle)) + assertDisplayed(R.id.loginTitle, R.string.login_signin_matrix_id_title) + pressBack() + } +} + From 37c4d941090932a74d84229dafe2b36f0bcb1442 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Tue, 18 Jan 2022 12:48:17 +0000 Subject: [PATCH 4/6] adding changelog entry --- changelog.d/4975.misc | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/4975.misc diff --git a/changelog.d/4975.misc b/changelog.d/4975.misc new file mode 100644 index 0000000000..12d1fc163f --- /dev/null +++ b/changelog.d/4975.misc @@ -0,0 +1 @@ +Including onboarding server options in the all screen sanity test suite \ No newline at end of file From 030d9ef351092e644672680dd6f1280073469853 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Tue, 18 Jan 2022 12:50:00 +0000 Subject: [PATCH 5/6] extracting inner class to its own file and updating function names relative to their usage --- .../im/vector/app/ui/robot/OnboardingRobot.kt | 77 +-------------- .../app/ui/robot/OnboardingServersRobot.kt | 97 +++++++++++++++++++ 2 files changed, 99 insertions(+), 75 deletions(-) create mode 100644 vector/src/androidTest/java/im/vector/app/ui/robot/OnboardingServersRobot.kt diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt index 57693709c6..62d446fe84 100644 --- a/vector/src/androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt +++ b/vector/src/androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt @@ -40,13 +40,13 @@ class OnboardingRobot { private fun crawlGetStarted() { clickOn(R.id.loginSplashSubmit) - AuthOptionsRobot().crawlGetStarted() + OnboardingServersRobot().crawlSignUp() pressBack() } private fun crawlAlreadyHaveAccount() { clickOn(R.id.loginSplashAlreadyHaveAccount) - AuthOptionsRobot().crawlAlreadyHaveAccount() + OnboardingServersRobot().crawlSignIn() pressBack() } @@ -92,76 +92,3 @@ class OnboardingRobot { clickOn(R.id.loginSubmit) } } - -class AuthOptionsRobot { - - fun crawlGetStarted() { - assertDisplayed(R.id.loginServerTitle, R.string.login_server_title) - crawlMatrixServer(isSignUp = true) - crawlEmsServer() - crawlOtherServer(isSignUp = true) - crawlSignInWithMatrixId() - } - - fun crawlAlreadyHaveAccount() { - assertDisplayed(R.id.loginServerTitle, R.string.login_server_title) - crawlMatrixServer(isSignUp = false) - crawlEmsServer() - crawlOtherServer(isSignUp = false) - crawlSignInWithMatrixId() - } - - private fun crawlOtherServer(isSignUp: Boolean) { - clickOn(R.id.loginServerChoiceOther) - waitUntilViewVisible(withId(R.id.loginServerUrlFormTitle)) - writeTo(R.id.loginServerUrlFormHomeServerUrl, "https://chat.mozilla.org") - clickOn(R.id.loginServerUrlFormSubmit) - waitUntilViewVisible(withId(R.id.loginSignupSigninTitle)) - assertDisplayed(R.id.loginSignupSigninText, "Connect to chat.mozilla.org") - assertDisplayed(R.id.loginSignupSigninSubmit, R.string.login_signin_sso) - pressBack() - - writeTo(R.id.loginServerUrlFormHomeServerUrl, "https://matrix.org") - clickOn(R.id.loginServerUrlFormSubmit) - assetMatrixSignInOptions(isSignUp) - pressBack() - pressBack() - } - - private fun crawlEmsServer() { - clickOn(R.id.loginServerChoiceEms) - waitUntilViewVisible(withId(R.id.loginServerUrlFormTitle)) - assertDisplayed(R.id.loginServerUrlFormTitle, R.string.login_connect_to_modular) - - writeTo(R.id.loginServerUrlFormHomeServerUrl, "https://one.ems.host") - clickOn(R.id.loginServerUrlFormSubmit) - - waitUntilViewVisible(withId(R.id.loginSignupSigninTitle)) - assertDisplayed(R.id.loginSignupSigninText, "one.ems.host") - assertDisplayed(R.id.loginSignupSigninSubmit, R.string.login_signin_sso) - pressBack() - pressBack() - } - - private fun crawlMatrixServer(isSignUp: Boolean) { - clickOn(R.id.loginServerChoiceMatrixOrg) - assetMatrixSignInOptions(isSignUp) - pressBack() - } - - private fun assetMatrixSignInOptions(isSignUp: Boolean) { - waitUntilViewVisible(withId(R.id.loginTitle)) - when (isSignUp) { - true -> assertDisplayed(R.id.loginTitle, "Sign up to matrix.org") - false -> assertDisplayed(R.id.loginTitle, "Connect to matrix.org") - } - } - - private fun crawlSignInWithMatrixId() { - clickOn(R.id.loginServerIKnowMyIdSubmit) - waitUntilViewVisible(withId(R.id.loginTitle)) - assertDisplayed(R.id.loginTitle, R.string.login_signin_matrix_id_title) - pressBack() - } -} - diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/OnboardingServersRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/OnboardingServersRobot.kt new file mode 100644 index 0000000000..1625b4580d --- /dev/null +++ b/vector/src/androidTest/java/im/vector/app/ui/robot/OnboardingServersRobot.kt @@ -0,0 +1,97 @@ +/* + * 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 + +import androidx.test.espresso.Espresso +import androidx.test.espresso.matcher.ViewMatchers +import com.adevinta.android.barista.assertion.BaristaVisibilityAssertions +import com.adevinta.android.barista.interaction.BaristaClickInteractions +import com.adevinta.android.barista.interaction.BaristaEditTextInteractions +import im.vector.app.R +import im.vector.app.espresso.tools.waitUntilViewVisible + +class OnboardingServersRobot { + + fun crawlSignUp() { + BaristaVisibilityAssertions.assertDisplayed(R.id.loginServerTitle, R.string.login_server_title) + crawlMatrixServer(isSignUp = true) + crawlEmsServer() + crawlOtherServer(isSignUp = true) + crawlSignInWithMatrixId() + } + + fun crawlSignIn() { + BaristaVisibilityAssertions.assertDisplayed(R.id.loginServerTitle, R.string.login_server_title) + crawlMatrixServer(isSignUp = false) + crawlEmsServer() + crawlOtherServer(isSignUp = false) + crawlSignInWithMatrixId() + } + + private fun crawlOtherServer(isSignUp: Boolean) { + BaristaClickInteractions.clickOn(R.id.loginServerChoiceOther) + waitUntilViewVisible(ViewMatchers.withId(R.id.loginServerUrlFormTitle)) + BaristaEditTextInteractions.writeTo(R.id.loginServerUrlFormHomeServerUrl, "https://chat.mozilla.org") + BaristaClickInteractions.clickOn(R.id.loginServerUrlFormSubmit) + waitUntilViewVisible(ViewMatchers.withId(R.id.loginSignupSigninTitle)) + BaristaVisibilityAssertions.assertDisplayed(R.id.loginSignupSigninText, "Connect to chat.mozilla.org") + BaristaVisibilityAssertions.assertDisplayed(R.id.loginSignupSigninSubmit, R.string.login_signin_sso) + Espresso.pressBack() + + BaristaEditTextInteractions.writeTo(R.id.loginServerUrlFormHomeServerUrl, "https://matrix.org") + BaristaClickInteractions.clickOn(R.id.loginServerUrlFormSubmit) + assetMatrixSignInOptions(isSignUp) + Espresso.pressBack() + Espresso.pressBack() + } + + private fun crawlEmsServer() { + BaristaClickInteractions.clickOn(R.id.loginServerChoiceEms) + waitUntilViewVisible(ViewMatchers.withId(R.id.loginServerUrlFormTitle)) + BaristaVisibilityAssertions.assertDisplayed(R.id.loginServerUrlFormTitle, R.string.login_connect_to_modular) + + BaristaEditTextInteractions.writeTo(R.id.loginServerUrlFormHomeServerUrl, "https://one.ems.host") + BaristaClickInteractions.clickOn(R.id.loginServerUrlFormSubmit) + + waitUntilViewVisible(ViewMatchers.withId(R.id.loginSignupSigninTitle)) + BaristaVisibilityAssertions.assertDisplayed(R.id.loginSignupSigninText, "one.ems.host") + BaristaVisibilityAssertions.assertDisplayed(R.id.loginSignupSigninSubmit, R.string.login_signin_sso) + Espresso.pressBack() + Espresso.pressBack() + } + + private fun crawlMatrixServer(isSignUp: Boolean) { + BaristaClickInteractions.clickOn(R.id.loginServerChoiceMatrixOrg) + assetMatrixSignInOptions(isSignUp) + Espresso.pressBack() + } + + private fun assetMatrixSignInOptions(isSignUp: Boolean) { + waitUntilViewVisible(ViewMatchers.withId(R.id.loginTitle)) + when (isSignUp) { + true -> BaristaVisibilityAssertions.assertDisplayed(R.id.loginTitle, "Sign up to matrix.org") + false -> BaristaVisibilityAssertions.assertDisplayed(R.id.loginTitle, "Connect to matrix.org") + } + } + + private fun crawlSignInWithMatrixId() { + BaristaClickInteractions.clickOn(R.id.loginServerIKnowMyIdSubmit) + waitUntilViewVisible(ViewMatchers.withId(R.id.loginTitle)) + BaristaVisibilityAssertions.assertDisplayed(R.id.loginTitle, R.string.login_signin_matrix_id_title) + Espresso.pressBack() + } +} From 70a95fc373f21ca4d0229b63262aadc4c01fb730 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Tue, 18 Jan 2022 16:21:37 +0000 Subject: [PATCH 6/6] removing unused import --- .../androidTest/java/im/vector/app/ui/robot/RoomDetailRobot.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/RoomDetailRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/RoomDetailRobot.kt index a5cd0badb3..ebf5fdf23d 100644 --- a/vector/src/androidTest/java/im/vector/app/ui/robot/RoomDetailRobot.kt +++ b/vector/src/androidTest/java/im/vector/app/ui/robot/RoomDetailRobot.kt @@ -37,7 +37,6 @@ import im.vector.app.features.home.room.detail.timeline.action.MessageActionsBot import im.vector.app.features.home.room.detail.timeline.reactions.ViewReactionsBottomSheet import im.vector.app.features.reactions.data.EmojiDataSource import im.vector.app.interactWithSheet -import im.vector.app.waitForView import im.vector.app.withRetry import java.lang.Thread.sleep