xref: /expo/apps/test-suite/TestModules.js (revision e11b7986)
190ff9d99SŁukasz Kosmaty'use strict';
290ff9d99SŁukasz Kosmaty
390ff9d99SŁukasz Kosmatyimport { Platform } from '@unimodules/core';
490ff9d99SŁukasz Kosmatyimport Constants from 'expo-constants';
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'),
72*e11b7986SStanisław Chmiela    require('./tests/FirebaseRecaptcha'),
73*e11b7986SStanisław Chmiela    optionalRequire(() => require('./tests/SQLite'))
7490ff9d99SŁukasz Kosmaty  );
7590ff9d99SŁukasz Kosmaty
7690ff9d99SŁukasz Kosmaty  if (Platform.OS === 'android') {
7790ff9d99SŁukasz Kosmaty    modules.push(require('./tests/JSC'));
7890ff9d99SŁukasz Kosmaty  }
7990ff9d99SŁukasz Kosmaty
8090ff9d99SŁukasz Kosmaty  if (global.DETOX) {
8190ff9d99SŁukasz Kosmaty    modules.push(
8290ff9d99SŁukasz Kosmaty      require('./tests/Contacts'),
8390ff9d99SŁukasz Kosmaty      require('./tests/Haptics'),
8490ff9d99SŁukasz Kosmaty      require('./tests/Localization'),
8590ff9d99SŁukasz Kosmaty      require('./tests/SecureStore'),
8690ff9d99SŁukasz Kosmaty      require('./tests/SMS'),
8790ff9d99SŁukasz Kosmaty      require('./tests/StoreReview'),
8890ff9d99SŁukasz Kosmaty      require('./tests/NewNotifications')
8990ff9d99SŁukasz Kosmaty    );
9090ff9d99SŁukasz Kosmaty    return modules;
9190ff9d99SŁukasz Kosmaty  }
9290ff9d99SŁukasz Kosmaty
9390ff9d99SŁukasz Kosmaty  if (Platform.OS === 'web') {
9490ff9d99SŁukasz Kosmaty    modules.push(
9590ff9d99SŁukasz Kosmaty      require('./tests/Contacts'),
9690ff9d99SŁukasz Kosmaty      // require('./tests/SVG'),
9790ff9d99SŁukasz Kosmaty      require('./tests/Localization'),
9890ff9d99SŁukasz Kosmaty      optionalRequire(() => require('./tests/NewNotifications'))
9990ff9d99SŁukasz Kosmaty    );
10090ff9d99SŁukasz Kosmaty
10190ff9d99SŁukasz Kosmaty    if (browserSupportsWebGL()) {
10290ff9d99SŁukasz Kosmaty      modules.push(optionalRequire(() => require('./tests/GLView')));
10390ff9d99SŁukasz Kosmaty    }
10490ff9d99SŁukasz Kosmaty
10590ff9d99SŁukasz Kosmaty    if (ExponentTest && !ExponentTest.isInCI) {
10690ff9d99SŁukasz Kosmaty      // modules.push(optionalRequire(() => require('./tests/Speech')));
10790ff9d99SŁukasz Kosmaty    }
10890ff9d99SŁukasz Kosmaty    return modules.filter(Boolean);
10990ff9d99SŁukasz Kosmaty  }
11090ff9d99SŁukasz Kosmaty
11190ff9d99SŁukasz Kosmaty  modules.push(
11290ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Application')),
11356b27c56SEvan Bacon    optionalRequire(() => require('./tests/AuthSession')),
11490ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Device')),
11590ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/GLView')),
11690ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Haptics')),
11790ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Localization')),
11890ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Network')),
11990ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/SecureStore')),
12090ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Segment')),
12190ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Speech')),
12290ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Recording')),
12390ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/ScreenOrientation')),
12490ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Payments')),
12590ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/AdMobInterstitial')),
12690ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/AdMobRewarded')),
12790ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/FBBannerAd')),
12890ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/NewNotifications'))
12990ff9d99SŁukasz Kosmaty  );
13090ff9d99SŁukasz Kosmaty
13190ff9d99SŁukasz Kosmaty  if (!isDeviceFarm()) {
13290ff9d99SŁukasz Kosmaty    // Times out sometimes
13390ff9d99SŁukasz Kosmaty    modules.push(
13490ff9d99SŁukasz Kosmaty      optionalRequire(() => require('./tests/AdMobPublisherBanner')),
13590ff9d99SŁukasz Kosmaty      optionalRequire(() => require('./tests/AdMobBanner'))
13690ff9d99SŁukasz Kosmaty    );
13790ff9d99SŁukasz Kosmaty    // Invalid placementId in CI (all tests fail)
13890ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/FBNativeAd')));
13990ff9d99SŁukasz Kosmaty    // Requires interaction (sign in popup)
14090ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/GoogleSignIn')));
14190ff9d99SŁukasz Kosmaty    // Popup to request device's location which uses Google's location service
14290ff9d99SŁukasz Kosmaty    modules.push(LocationTestScreen);
14390ff9d99SŁukasz Kosmaty    // Fails to redirect because of malformed URL in published version with release channel parameter
14490ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Linking')));
14590ff9d99SŁukasz Kosmaty    // Has uncontrolled view controllers
14690ff9d99SŁukasz Kosmaty    modules.push(require('./tests/SMS'));
14790ff9d99SŁukasz Kosmaty    // Requires permission
14890ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Calendar')));
14990ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/MediaLibrary')));
15090ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Notifications')));
15190ff9d99SŁukasz Kosmaty
15290ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Battery')));
15390ff9d99SŁukasz Kosmaty    if (Constants.isDevice) {
15490ff9d99SŁukasz Kosmaty      modules.push(optionalRequire(() => require('./tests/Brightness')));
15590ff9d99SŁukasz Kosmaty    }
15690ff9d99SŁukasz Kosmaty    // Crashes app when mounting component
15790ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Video')));
15890ff9d99SŁukasz Kosmaty    // "sdkUnversionedTestSuite failed: java.lang.NullPointerException: Attempt to invoke interface method
15990ff9d99SŁukasz Kosmaty    // 'java.util.Map org.unimodules.interfaces.taskManager.TaskInterface.getOptions()' on a null object reference"
16090ff9d99SŁukasz Kosmaty    modules.push(TaskManagerTestScreen);
16190ff9d99SŁukasz Kosmaty    // Audio tests are flaky in CI due to asynchronous fetching of resources
16290ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Audio')));
16390ff9d99SŁukasz Kosmaty    // The Camera tests are flaky on iOS, i.e. they fail randomly
16490ff9d99SŁukasz Kosmaty    if (Constants.isDevice && Platform.OS === 'android') {
16590ff9d99SŁukasz Kosmaty      modules.push(CameraTestScreen);
16690ff9d99SŁukasz Kosmaty    }
16790ff9d99SŁukasz Kosmaty  }
16890ff9d99SŁukasz Kosmaty  if (Constants.isDevice) {
16990ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Cellular')));
17090ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/BarCodeScanner')));
17190ff9d99SŁukasz Kosmaty  }
17290ff9d99SŁukasz Kosmaty  return modules.filter(Boolean);
17390ff9d99SŁukasz Kosmaty}
174