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