xref: /expo/apps/test-suite/TestModules.js (revision 22d1e005)
190ff9d99SŁukasz Kosmaty'use strict';
290ff9d99SŁukasz Kosmaty
390ff9d99SŁukasz Kosmatyimport Constants from 'expo-constants';
419cbf4dcSBartłomiej Bukowskiimport { Platform } from 'expo-modules-core';
590ff9d99SŁukasz Kosmaty
690ff9d99SŁukasz Kosmatyimport ExponentTest from './ExponentTest';
790ff9d99SŁukasz Kosmatyimport { isDeviceFarm } from './utils/Environment';
890ff9d99SŁukasz Kosmaty
990ff9d99SŁukasz Kosmatyfunction browserSupportsWebGL() {
1090ff9d99SŁukasz Kosmaty  try {
1190ff9d99SŁukasz Kosmaty    const canvas = document.createElement('canvas');
1290ff9d99SŁukasz Kosmaty    return (
1390ff9d99SŁukasz Kosmaty      !!window.WebGLRenderingContext &&
1490ff9d99SŁukasz Kosmaty      (canvas.getContext('webgl') || canvas.getContext('experimental-webgl'))
1590ff9d99SŁukasz Kosmaty    );
1690ff9d99SŁukasz Kosmaty  } catch (e) {
1790ff9d99SŁukasz Kosmaty    return false;
1890ff9d99SŁukasz Kosmaty  }
1990ff9d99SŁukasz Kosmaty}
2090ff9d99SŁukasz Kosmaty
2190ff9d99SŁukasz Kosmatyfunction optionalRequire(requirer) {
2290ff9d99SŁukasz Kosmaty  try {
2390ff9d99SŁukasz Kosmaty    return requirer();
2490ff9d99SŁukasz Kosmaty  } catch (e) {
2590ff9d99SŁukasz Kosmaty    // eslint-disable-next-line
2690ff9d99SŁukasz Kosmaty    return;
2790ff9d99SŁukasz Kosmaty  }
2890ff9d99SŁukasz Kosmaty}
2990ff9d99SŁukasz Kosmaty
3090ff9d99SŁukasz Kosmaty// Both Location and TaskManager test suites define tasks in TaskManager.
3190ff9d99SŁukasz Kosmaty// Since tasks can only be defined during initialization phase (not as a result
3290ff9d99SŁukasz Kosmaty// of calling some function when the application is running, but rather in global scope),
3390ff9d99SŁukasz Kosmaty// we need to trigger code execution of these modules here (not in `getTestModules`
3490ff9d99SŁukasz Kosmaty// which is called in one of the components).
3590ff9d99SŁukasz Kosmatyconst LocationTestScreen = optionalRequire(() => require('./tests/Location'));
3690ff9d99SŁukasz Kosmatyconst TaskManagerTestScreen = optionalRequire(() => require('./tests/TaskManager'));
3790ff9d99SŁukasz Kosmaty// I have a hunch that optionalRequire doesn't work when *not* in global scope
3890ff9d99SŁukasz Kosmaty// since I had to move Camera screen import here too to get rid of an error
3990ff9d99SŁukasz Kosmaty// caused by missing native module.
4090ff9d99SŁukasz Kosmatyconst CameraTestScreen = optionalRequire(() => require('./tests/Camera'));
4190ff9d99SŁukasz Kosmaty
4290ff9d99SŁukasz Kosmaty// List of all modules for tests. Each file path must be statically present for
4390ff9d99SŁukasz Kosmaty// the packager to pick them all up.
4490ff9d99SŁukasz Kosmatyexport function getTestModules() {
4590ff9d99SŁukasz Kosmaty  const modules = [
4690ff9d99SŁukasz Kosmaty    // Sanity
4790ff9d99SŁukasz Kosmaty    require('./tests/Basic'),
4890ff9d99SŁukasz Kosmaty  ];
4990ff9d99SŁukasz Kosmaty
5090ff9d99SŁukasz Kosmaty  // Expo core modules should run everywhere
5190ff9d99SŁukasz Kosmaty  modules.push(
5290ff9d99SŁukasz Kosmaty    require('./tests/Asset'),
5390ff9d99SŁukasz Kosmaty    require('./tests/Constants'),
5490ff9d99SŁukasz Kosmaty    require('./tests/FileSystem'),
5590ff9d99SŁukasz Kosmaty    require('./tests/Font'),
5690ff9d99SŁukasz Kosmaty    require('./tests/Permissions'),
57e16679f7SStanisław Chmiela    require('./tests/ImagePicker'),
58e16679f7SStanisław Chmiela    optionalRequire(() => require('./tests/Image'))
5990ff9d99SŁukasz Kosmaty  );
6090ff9d99SŁukasz Kosmaty
6190ff9d99SŁukasz Kosmaty  // Universally tested APIs
6290ff9d99SŁukasz Kosmaty  modules.push(
6390ff9d99SŁukasz Kosmaty    require('./tests/Random'),
6490ff9d99SŁukasz Kosmaty    require('./tests/Crypto'),
6590ff9d99SŁukasz Kosmaty    require('./tests/KeepAwake'),
6690ff9d99SŁukasz Kosmaty    require('./tests/Blur'),
6790ff9d99SŁukasz Kosmaty    require('./tests/LinearGradient'),
6890ff9d99SŁukasz Kosmaty    require('./tests/Facebook'),
6990ff9d99SŁukasz Kosmaty    require('./tests/HTML'),
7090ff9d99SŁukasz Kosmaty    require('./tests/FirebaseCore'),
719158859eSHein Rutjes    require('./tests/FirebaseAnalytics'),
72e11b7986SStanisław Chmiela    require('./tests/FirebaseRecaptcha'),
7385ce611fSCedric van Putten    require('./tests/FirebaseJSSDKCompat'),
74626595cbSHein Rutjes    require('./tests/FirebaseJSSDK'),
7561c2143aSmnightingale    require('./tests/ImageManipulator'),
76e11b7986SStanisław Chmiela    optionalRequire(() => require('./tests/SQLite'))
7790ff9d99SŁukasz Kosmaty  );
7890ff9d99SŁukasz Kosmaty
7990ff9d99SŁukasz Kosmaty  if (Platform.OS === 'android') {
8090ff9d99SŁukasz Kosmaty    modules.push(require('./tests/JSC'));
8105f47bb5SKudo Chien    modules.push(require('./tests/Hermes'));
8290ff9d99SŁukasz Kosmaty  }
8390ff9d99SŁukasz Kosmaty
8490ff9d99SŁukasz Kosmaty  if (global.DETOX) {
8590ff9d99SŁukasz Kosmaty    modules.push(
8690ff9d99SŁukasz Kosmaty      require('./tests/Contacts'),
8790ff9d99SŁukasz Kosmaty      require('./tests/Haptics'),
8890ff9d99SŁukasz Kosmaty      require('./tests/Localization'),
8990ff9d99SŁukasz Kosmaty      require('./tests/SecureStore'),
9090ff9d99SŁukasz Kosmaty      require('./tests/SMS'),
9190ff9d99SŁukasz Kosmaty      require('./tests/StoreReview'),
9247b314f0SCharlie Cruzan      require('./tests/Notifications')
9390ff9d99SŁukasz Kosmaty    );
9490ff9d99SŁukasz Kosmaty    return modules;
9590ff9d99SŁukasz Kosmaty  }
9690ff9d99SŁukasz Kosmaty
9790ff9d99SŁukasz Kosmaty  if (Platform.OS === 'web') {
9890ff9d99SŁukasz Kosmaty    modules.push(
9990ff9d99SŁukasz Kosmaty      require('./tests/Contacts'),
10090ff9d99SŁukasz Kosmaty      // require('./tests/SVG'),
10190ff9d99SŁukasz Kosmaty      require('./tests/Localization'),
102dc7b526eSWarren Bickley      require('./tests/Recording'),
10347b314f0SCharlie Cruzan      optionalRequire(() => require('./tests/Notifications')),
104731f34a7STomasz Sapeta      LocationTestScreen
10590ff9d99SŁukasz Kosmaty    );
10690ff9d99SŁukasz Kosmaty
10790ff9d99SŁukasz Kosmaty    if (browserSupportsWebGL()) {
10890ff9d99SŁukasz Kosmaty      modules.push(optionalRequire(() => require('./tests/GLView')));
10990ff9d99SŁukasz Kosmaty    }
11090ff9d99SŁukasz Kosmaty
11190ff9d99SŁukasz Kosmaty    if (ExponentTest && !ExponentTest.isInCI) {
11290ff9d99SŁukasz Kosmaty      // modules.push(optionalRequire(() => require('./tests/Speech')));
11390ff9d99SŁukasz Kosmaty    }
11490ff9d99SŁukasz Kosmaty    return modules.filter(Boolean);
11590ff9d99SŁukasz Kosmaty  }
11690ff9d99SŁukasz Kosmaty
11790ff9d99SŁukasz Kosmaty  modules.push(
11890ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Application')),
11956b27c56SEvan Bacon    optionalRequire(() => require('./tests/AuthSession')),
12090ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Device')),
12190ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/GLView')),
12290ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Haptics')),
12390ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Localization')),
12490ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Network')),
12590ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/SecureStore')),
12690ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Segment')),
12790ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Speech')),
12890ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Recording')),
12990ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/ScreenOrientation')),
13090ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/AdMobInterstitial')),
13190ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/AdMobRewarded')),
13290ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/FBBannerAd')),
1334281e48eSEvan Bacon    optionalRequire(() => require('./tests/Notifications')),
13413c5c8bdSEvan Bacon    optionalRequire(() => require('./tests/NavigationBar')),
13513c5c8bdSEvan Bacon    optionalRequire(() => require('./tests/SystemUI'))
13690ff9d99SŁukasz Kosmaty  );
13790ff9d99SŁukasz Kosmaty
13890ff9d99SŁukasz Kosmaty  if (!isDeviceFarm()) {
13990ff9d99SŁukasz Kosmaty    // Times out sometimes
14090ff9d99SŁukasz Kosmaty    modules.push(
14190ff9d99SŁukasz Kosmaty      optionalRequire(() => require('./tests/AdMobPublisherBanner')),
14290ff9d99SŁukasz Kosmaty      optionalRequire(() => require('./tests/AdMobBanner'))
14390ff9d99SŁukasz Kosmaty    );
14490ff9d99SŁukasz Kosmaty    // Invalid placementId in CI (all tests fail)
14590ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/FBNativeAd')));
14690ff9d99SŁukasz Kosmaty    // Requires interaction (sign in popup)
14790ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/GoogleSignIn')));
14890ff9d99SŁukasz Kosmaty    // Popup to request device's location which uses Google's location service
14990ff9d99SŁukasz Kosmaty    modules.push(LocationTestScreen);
15090ff9d99SŁukasz Kosmaty    // Fails to redirect because of malformed URL in published version with release channel parameter
15190ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Linking')));
15290ff9d99SŁukasz Kosmaty    // Has uncontrolled view controllers
15390ff9d99SŁukasz Kosmaty    modules.push(require('./tests/SMS'));
15490ff9d99SŁukasz Kosmaty    // Requires permission
1559b1f804bSŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Contacts')));
15690ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Calendar')));
157aa2d439aSTomasz Sapeta    modules.push(optionalRequire(() => require('./tests/CalendarReminders')));
15890ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/MediaLibrary')));
15990ff9d99SŁukasz Kosmaty
16090ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Battery')));
16190ff9d99SŁukasz Kosmaty    if (Constants.isDevice) {
16290ff9d99SŁukasz Kosmaty      modules.push(optionalRequire(() => require('./tests/Brightness')));
16390ff9d99SŁukasz Kosmaty    }
16490ff9d99SŁukasz Kosmaty    // Crashes app when mounting component
16590ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Video')));
16690ff9d99SŁukasz Kosmaty    // "sdkUnversionedTestSuite failed: java.lang.NullPointerException: Attempt to invoke interface method
16790ff9d99SŁukasz Kosmaty    // 'java.util.Map org.unimodules.interfaces.taskManager.TaskInterface.getOptions()' on a null object reference"
16890ff9d99SŁukasz Kosmaty    modules.push(TaskManagerTestScreen);
16990ff9d99SŁukasz Kosmaty    // Audio tests are flaky in CI due to asynchronous fetching of resources
17090ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Audio')));
171bd6ca857Sandy
17290ff9d99SŁukasz Kosmaty    // The Camera tests are flaky on iOS, i.e. they fail randomly
173bd6ca857Sandy    if (Constants.isDevice) {
17490ff9d99SŁukasz Kosmaty      modules.push(CameraTestScreen);
17590ff9d99SŁukasz Kosmaty    }
17690ff9d99SŁukasz Kosmaty  }
17790ff9d99SŁukasz Kosmaty  if (Constants.isDevice) {
17890ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Cellular')));
17990ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/BarCodeScanner')));
18090ff9d99SŁukasz Kosmaty  }
181*22d1e005SBartosz Kaszubowski  return modules
182*22d1e005SBartosz Kaszubowski    .filter(Boolean)
183*22d1e005SBartosz Kaszubowski    .sort((a, b) => (a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1));
18490ff9d99SŁukasz Kosmaty}
185