From f05faaa949930df3e6fde77748e5fb1791bd82bd Mon Sep 17 00:00:00 2001 From: Saturnino Abril Date: Sat, 29 Aug 2020 07:18:41 +0800 Subject: [PATCH] E2E: Initial Detox setup for Mobile UI automation (#4535) * initial Detox setup for mobile UI automation * fix iOS allow permission on opening the app, add npm script to root folder, fix test when using longer site URL and add detox dependency to root for android build dependency * remove detox proguardFile * update packages and emulator * change folder build on local and CI * add test to post a message, ability to have test in isolation, server API commands, server config, dependency updates and update folder structure * update snapshot * update detox and do clean up * update dependencies --- .eslintrc.json | 17 + android/app/build.gradle | 5 +- .../java/com/mattermost/rnbeta/DetoxTest.java | 28 + android/build.gradle | 3 + .../__snapshots__/error_text.test.js.snap | 1 + app/components/error_text/error_text.js | 6 +- app/components/formatted_text.js | 1 + .../__snapshots__/index.test.js.snap | 1 + app/components/pasteable_text_input/index.js | 1 + .../__snapshots__/post_draft.test.js.snap | 2 + .../__snapshots__/send.test.js.snap | 3 + .../post_draft/send_action/index.js | 6 +- app/components/sidebars/drawer_layout.js | 1 + .../sidebars/main/main_sidebar.ios.js | 1 + app/screens/channel/channel.android.js | 5 +- app/screens/channel/channel.ios.js | 5 +- app/screens/login/login.js | 5 +- app/screens/select_server/select_server.js | 3 + detox/.babelrc | 12 + detox/.detoxrc.json | 42 + detox/e2e/config.json | 9 + detox/e2e/environment.js | 25 + detox/e2e/init.js | 21 + detox/e2e/support/server_api/channel.js | 81 + detox/e2e/support/server_api/client.js | 13 + detox/e2e/support/server_api/common.js | 8 + .../support/server_api/default_config.json | 296 + detox/e2e/support/server_api/index.js | 16 + detox/e2e/support/server_api/setup.js | 41 + detox/e2e/support/server_api/system.js | 72 + detox/e2e/support/server_api/team.js | 77 + detox/e2e/support/server_api/user.js | 136 + detox/e2e/support/test_config.js | 9 + detox/e2e/support/ui/screen.js | 56 + detox/e2e/support/utils.js | 53 + .../e2e/test/messaging/message_posting.e2e.js | 29 + detox/e2e/test/on_boarding/login.e2e.js | 163 + detox/package-lock.json | 7681 +++++++++++++++++ detox/package.json | 35 + fastlane/Fastfile | 11 +- package-lock.json | 454 + package.json | 5 +- 42 files changed, 9430 insertions(+), 9 deletions(-) create mode 100644 android/app/src/androidTest/java/com/mattermost/rnbeta/DetoxTest.java create mode 100644 detox/.babelrc create mode 100644 detox/.detoxrc.json create mode 100644 detox/e2e/config.json create mode 100644 detox/e2e/environment.js create mode 100644 detox/e2e/init.js create mode 100644 detox/e2e/support/server_api/channel.js create mode 100644 detox/e2e/support/server_api/client.js create mode 100644 detox/e2e/support/server_api/common.js create mode 100644 detox/e2e/support/server_api/default_config.json create mode 100644 detox/e2e/support/server_api/index.js create mode 100644 detox/e2e/support/server_api/setup.js create mode 100644 detox/e2e/support/server_api/system.js create mode 100644 detox/e2e/support/server_api/team.js create mode 100644 detox/e2e/support/server_api/user.js create mode 100644 detox/e2e/support/test_config.js create mode 100644 detox/e2e/support/ui/screen.js create mode 100644 detox/e2e/support/utils.js create mode 100644 detox/e2e/test/messaging/message_posting.e2e.js create mode 100644 detox/e2e/test/on_boarding/login.e2e.js create mode 100644 detox/package-lock.json create mode 100644 detox/package.json diff --git a/.eslintrc.json b/.eslintrc.json index 9f9fcc020..d97204ec3 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -53,6 +53,23 @@ "env": { "jest": true } + }, + { + "files": ["detox/e2e/**"], + "globals": { + "by": true, + "detox": true, + "device": true, + "element": true, + "waitFor": true + }, + "rules": { + "func-names": 0, + "import/no-unresolved": 0, + "max-nested-callbacks": 0, + "no-process-env": 0, + "no-unused-expressions": 0 + } } ] } diff --git a/android/app/build.gradle b/android/app/build.gradle index 69445ad36..0f1b4c259 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -138,7 +138,8 @@ android { ndk { abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64' } - + testBuildType System.getProperty('testBuildType', 'debug') + testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } signingConfigs { release { @@ -260,6 +261,8 @@ dependencies { // For WebP support, including animated WebP implementation 'com.facebook.fresco:animated-webp:2.0.0' implementation 'com.facebook.fresco:webpsupport:2.0.0' + + androidTestImplementation('com.wix:detox:+') } // Run this once to be able to run the application with BUCK diff --git a/android/app/src/androidTest/java/com/mattermost/rnbeta/DetoxTest.java b/android/app/src/androidTest/java/com/mattermost/rnbeta/DetoxTest.java new file mode 100644 index 000000000..220be5e4a --- /dev/null +++ b/android/app/src/androidTest/java/com/mattermost/rnbeta/DetoxTest.java @@ -0,0 +1,28 @@ +package com.mattermost.rnbeta; + +import com.wix.detox.Detox; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.LargeTest; +import androidx.test.rule.ActivityTestRule; + +@RunWith(AndroidJUnit4.class) +@LargeTest +public class DetoxTest { + + @Rule + public ActivityTestRule mActivityRule = new ActivityTestRule<>(MainActivity.class, false, false); + + @Test + public void runDetoxTests() { + Detox.DetoxIdlePolicyConfig idlePolicyConfig = new Detox.DetoxIdlePolicyConfig(); + idlePolicyConfig.masterTimeoutSec = 60; + idlePolicyConfig.idleResourceTimeoutSec = 30; + + Detox.runTests(mActivityRule, idlePolicyConfig); + } +} diff --git a/android/build.gradle b/android/build.gradle index 5a7d521df..e0764e7e5 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -66,5 +66,8 @@ allprojects { maven { url ("https://dl.bintray.com/rudderstack/rudderstack") } + maven { + url "$rootDir/../node_modules/detox/Detox-android" + } } } diff --git a/app/components/error_text/__snapshots__/error_text.test.js.snap b/app/components/error_text/__snapshots__/error_text.test.js.snap index 875a00a5e..0e0ba2b38 100644 --- a/app/components/error_text/__snapshots__/error_text.test.js.snap +++ b/app/components/error_text/__snapshots__/error_text.test.js.snap @@ -20,6 +20,7 @@ exports[`ErrorText should match snapshot 1`] = ` }, ] } + testID="error_text" > Username must begin with a letter and contain between 3 and 22 characters including numbers, lowercase letters, and the symbols diff --git a/app/components/error_text/error_text.js b/app/components/error_text/error_text.js index b582ec90e..6da48bd6a 100644 --- a/app/components/error_text/error_text.js +++ b/app/components/error_text/error_text.js @@ -29,6 +29,7 @@ export default class ErrorText extends PureComponent { if (intl) { return ( + {error.message || error} ); diff --git a/app/components/formatted_text.js b/app/components/formatted_text.js index e9d95f853..2af3f6f35 100644 --- a/app/components/formatted_text.js +++ b/app/components/formatted_text.js @@ -11,6 +11,7 @@ export default class FormattedText extends React.PureComponent { id: PropTypes.string.isRequired, defaultMessage: PropTypes.string, values: PropTypes.object, + testID: PropTypes.string, }; static defaultProps = { diff --git a/app/components/pasteable_text_input/__snapshots__/index.test.js.snap b/app/components/pasteable_text_input/__snapshots__/index.test.js.snap index d5fe97c90..39a292f1c 100644 --- a/app/components/pasteable_text_input/__snapshots__/index.test.js.snap +++ b/app/components/pasteable_text_input/__snapshots__/index.test.js.snap @@ -5,6 +5,7 @@ exports[`PasteableTextInput should render pasteable text input 1`] = ` allowFontScaling={true} onPaste={[Function]} rejectResponderTermination={true} + testID="post_input" underlineColorAndroid="transparent" > My Text diff --git a/app/components/pasteable_text_input/index.js b/app/components/pasteable_text_input/index.js index bee514471..01ea5ec7e 100644 --- a/app/components/pasteable_text_input/index.js +++ b/app/components/pasteable_text_input/index.js @@ -47,6 +47,7 @@ export class PasteableTextInput extends React.PureComponent { return ( + diff --git a/app/components/sidebars/main/main_sidebar.ios.js b/app/components/sidebars/main/main_sidebar.ios.js index 26a49f99b..21bc1c02b 100644 --- a/app/components/sidebars/main/main_sidebar.ios.js +++ b/app/components/sidebars/main/main_sidebar.ios.js @@ -124,6 +124,7 @@ export default class MainSidebarIOS extends MainSidebarBase { return ( - + + {drawerContent} diff --git a/app/screens/login/login.js b/app/screens/login/login.js index 3f8ac0ce0..3598066da 100644 --- a/app/screens/login/login.js +++ b/app/screens/login/login.js @@ -339,6 +339,7 @@ export default class Login extends PureComponent { proceed = (