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 = (