xref: /expo/apps/test-suite/TestModules.js (revision 90ff9d99)
1*90ff9d99SŁukasz Kosmaty'use strict';
2*90ff9d99SŁukasz Kosmaty
3*90ff9d99SŁukasz Kosmatyimport { Platform } from '@unimodules/core';
4*90ff9d99SŁukasz Kosmatyimport Constants from 'expo-constants';
5*90ff9d99SŁukasz Kosmaty
6*90ff9d99SŁukasz Kosmatyimport ExponentTest from './ExponentTest';
7*90ff9d99SŁukasz Kosmatyimport { isDeviceFarm } from './utils/Environment';
8*90ff9d99SŁukasz Kosmaty
9*90ff9d99SŁukasz Kosmatyfunction browserSupportsWebGL() {
10*90ff9d99SŁukasz Kosmaty  try {
11*90ff9d99SŁukasz Kosmaty    const canvas = document.createElement('canvas');
12*90ff9d99SŁukasz Kosmaty    return (
13*90ff9d99SŁukasz Kosmaty      !!window.WebGLRenderingContext &&
14*90ff9d99SŁukasz Kosmaty      (canvas.getContext('webgl') || canvas.getContext('experimental-webgl'))
15*90ff9d99SŁukasz Kosmaty    );
16*90ff9d99SŁukasz Kosmaty  } catch (e) {
17*90ff9d99SŁukasz Kosmaty    return false;
18*90ff9d99SŁukasz Kosmaty  }
19*90ff9d99SŁukasz Kosmaty}
20*90ff9d99SŁukasz Kosmaty
21*90ff9d99SŁukasz Kosmatyfunction optionalRequire(requirer) {
22*90ff9d99SŁukasz Kosmaty  try {
23*90ff9d99SŁukasz Kosmaty    return requirer();
24*90ff9d99SŁukasz Kosmaty  } catch (e) {
25*90ff9d99SŁukasz Kosmaty    // eslint-disable-next-line
26*90ff9d99SŁukasz Kosmaty    return;
27*90ff9d99SŁukasz Kosmaty  }
28*90ff9d99SŁukasz Kosmaty}
29*90ff9d99SŁukasz Kosmaty
30*90ff9d99SŁukasz Kosmaty// Both Location and TaskManager test suites define tasks in TaskManager.
31*90ff9d99SŁukasz Kosmaty// Since tasks can only be defined during initialization phase (not as a result
32*90ff9d99SŁukasz Kosmaty// of calling some function when the application is running, but rather in global scope),
33*90ff9d99SŁukasz Kosmaty// we need to trigger code execution of these modules here (not in `getTestModules`
34*90ff9d99SŁukasz Kosmaty// which is called in one of the components).
35*90ff9d99SŁukasz Kosmatyconst LocationTestScreen = optionalRequire(() => require('./tests/Location'));
36*90ff9d99SŁukasz Kosmatyconst TaskManagerTestScreen = optionalRequire(() => require('./tests/TaskManager'));
37*90ff9d99SŁukasz Kosmaty// I have a hunch that optionalRequire doesn't work when *not* in global scope
38*90ff9d99SŁukasz Kosmaty// since I had to move Camera screen import here too to get rid of an error
39*90ff9d99SŁukasz Kosmaty// caused by missing native module.
40*90ff9d99SŁukasz Kosmatyconst CameraTestScreen = optionalRequire(() => require('./tests/Camera'));
41*90ff9d99SŁukasz Kosmaty
42*90ff9d99SŁukasz Kosmaty// List of all modules for tests. Each file path must be statically present for
43*90ff9d99SŁukasz Kosmaty// the packager to pick them all up.
44*90ff9d99SŁukasz Kosmatyexport function getTestModules() {
45*90ff9d99SŁukasz Kosmaty  const modules = [
46*90ff9d99SŁukasz Kosmaty    // Sanity
47*90ff9d99SŁukasz Kosmaty    require('./tests/Basic'),
48*90ff9d99SŁukasz Kosmaty  ];
49*90ff9d99SŁukasz Kosmaty
50*90ff9d99SŁukasz Kosmaty  // Expo core modules should run everywhere
51*90ff9d99SŁukasz Kosmaty  modules.push(
52*90ff9d99SŁukasz Kosmaty    require('./tests/Asset'),
53*90ff9d99SŁukasz Kosmaty    require('./tests/Constants'),
54*90ff9d99SŁukasz Kosmaty    require('./tests/FileSystem'),
55*90ff9d99SŁukasz Kosmaty    require('./tests/Font'),
56*90ff9d99SŁukasz Kosmaty    require('./tests/Permissions'),
57*90ff9d99SŁukasz Kosmaty    require('./tests/ImagePicker')
58*90ff9d99SŁukasz Kosmaty  );
59*90ff9d99SŁukasz Kosmaty
60*90ff9d99SŁukasz Kosmaty  // Universally tested APIs
61*90ff9d99SŁukasz Kosmaty  modules.push(
62*90ff9d99SŁukasz Kosmaty    require('./tests/Random'),
63*90ff9d99SŁukasz Kosmaty    require('./tests/Crypto'),
64*90ff9d99SŁukasz Kosmaty    require('./tests/KeepAwake'),
65*90ff9d99SŁukasz Kosmaty    require('./tests/Blur'),
66*90ff9d99SŁukasz Kosmaty    require('./tests/LinearGradient'),
67*90ff9d99SŁukasz Kosmaty    require('./tests/Facebook'),
68*90ff9d99SŁukasz Kosmaty    require('./tests/HTML'),
69*90ff9d99SŁukasz Kosmaty    require('./tests/FirebaseCore'),
70*90ff9d99SŁukasz Kosmaty    require('./tests/FirebaseAnalytics')
71*90ff9d99SŁukasz Kosmaty  );
72*90ff9d99SŁukasz Kosmaty
73*90ff9d99SŁukasz Kosmaty  if (Platform.OS === 'android') {
74*90ff9d99SŁukasz Kosmaty    modules.push(require('./tests/JSC'));
75*90ff9d99SŁukasz Kosmaty  }
76*90ff9d99SŁukasz Kosmaty
77*90ff9d99SŁukasz Kosmaty  if (global.DETOX) {
78*90ff9d99SŁukasz Kosmaty    modules.push(
79*90ff9d99SŁukasz Kosmaty      require('./tests/Contacts'),
80*90ff9d99SŁukasz Kosmaty      require('./tests/Haptics'),
81*90ff9d99SŁukasz Kosmaty      require('./tests/Localization'),
82*90ff9d99SŁukasz Kosmaty      require('./tests/SecureStore'),
83*90ff9d99SŁukasz Kosmaty      require('./tests/SMS'),
84*90ff9d99SŁukasz Kosmaty      require('./tests/StoreReview'),
85*90ff9d99SŁukasz Kosmaty      require('./tests/NewNotifications')
86*90ff9d99SŁukasz Kosmaty    );
87*90ff9d99SŁukasz Kosmaty    return modules;
88*90ff9d99SŁukasz Kosmaty  }
89*90ff9d99SŁukasz Kosmaty
90*90ff9d99SŁukasz Kosmaty  if (Platform.OS === 'web') {
91*90ff9d99SŁukasz Kosmaty    modules.push(
92*90ff9d99SŁukasz Kosmaty      require('./tests/Contacts'),
93*90ff9d99SŁukasz Kosmaty      // require('./tests/SVG'),
94*90ff9d99SŁukasz Kosmaty      require('./tests/Localization'),
95*90ff9d99SŁukasz Kosmaty      optionalRequire(() => require('./tests/NewNotifications'))
96*90ff9d99SŁukasz Kosmaty    );
97*90ff9d99SŁukasz Kosmaty
98*90ff9d99SŁukasz Kosmaty    if (browserSupportsWebGL()) {
99*90ff9d99SŁukasz Kosmaty      modules.push(optionalRequire(() => require('./tests/GLView')));
100*90ff9d99SŁukasz Kosmaty    }
101*90ff9d99SŁukasz Kosmaty
102*90ff9d99SŁukasz Kosmaty    if (ExponentTest && !ExponentTest.isInCI) {
103*90ff9d99SŁukasz Kosmaty      // modules.push(optionalRequire(() => require('./tests/Speech')));
104*90ff9d99SŁukasz Kosmaty    }
105*90ff9d99SŁukasz Kosmaty    return modules.filter(Boolean);
106*90ff9d99SŁukasz Kosmaty  }
107*90ff9d99SŁukasz Kosmaty
108*90ff9d99SŁukasz Kosmaty  modules.push(
109*90ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Application')),
110*90ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Device')),
111*90ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/GLView')),
112*90ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Haptics')),
113*90ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Localization')),
114*90ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Network')),
115*90ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/SecureStore')),
116*90ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Segment')),
117*90ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/SQLite')),
118*90ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Speech')),
119*90ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Recording')),
120*90ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/ScreenOrientation')),
121*90ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/Payments')),
122*90ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/AdMobInterstitial')),
123*90ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/AdMobRewarded')),
124*90ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/FBBannerAd')),
125*90ff9d99SŁukasz Kosmaty    optionalRequire(() => require('./tests/NewNotifications'))
126*90ff9d99SŁukasz Kosmaty  );
127*90ff9d99SŁukasz Kosmaty
128*90ff9d99SŁukasz Kosmaty  if (!isDeviceFarm()) {
129*90ff9d99SŁukasz Kosmaty    // Times out sometimes
130*90ff9d99SŁukasz Kosmaty    modules.push(
131*90ff9d99SŁukasz Kosmaty      optionalRequire(() => require('./tests/AdMobPublisherBanner')),
132*90ff9d99SŁukasz Kosmaty      optionalRequire(() => require('./tests/AdMobBanner'))
133*90ff9d99SŁukasz Kosmaty    );
134*90ff9d99SŁukasz Kosmaty    // Invalid placementId in CI (all tests fail)
135*90ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/FBNativeAd')));
136*90ff9d99SŁukasz Kosmaty    // Requires interaction (sign in popup)
137*90ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/GoogleSignIn')));
138*90ff9d99SŁukasz Kosmaty    // Popup to request device's location which uses Google's location service
139*90ff9d99SŁukasz Kosmaty    modules.push(LocationTestScreen);
140*90ff9d99SŁukasz Kosmaty    // Fails to redirect because of malformed URL in published version with release channel parameter
141*90ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Linking')));
142*90ff9d99SŁukasz Kosmaty    // Has uncontrolled view controllers
143*90ff9d99SŁukasz Kosmaty    modules.push(require('./tests/SMS'));
144*90ff9d99SŁukasz Kosmaty    // Requires permission
145*90ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Calendar')));
146*90ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/MediaLibrary')));
147*90ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Notifications')));
148*90ff9d99SŁukasz Kosmaty
149*90ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Battery')));
150*90ff9d99SŁukasz Kosmaty    if (Constants.isDevice) {
151*90ff9d99SŁukasz Kosmaty      modules.push(optionalRequire(() => require('./tests/Brightness')));
152*90ff9d99SŁukasz Kosmaty    }
153*90ff9d99SŁukasz Kosmaty    // Crashes app when mounting component
154*90ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Video')));
155*90ff9d99SŁukasz Kosmaty    // "sdkUnversionedTestSuite failed: java.lang.NullPointerException: Attempt to invoke interface method
156*90ff9d99SŁukasz Kosmaty    // 'java.util.Map org.unimodules.interfaces.taskManager.TaskInterface.getOptions()' on a null object reference"
157*90ff9d99SŁukasz Kosmaty    modules.push(TaskManagerTestScreen);
158*90ff9d99SŁukasz Kosmaty    // Audio tests are flaky in CI due to asynchronous fetching of resources
159*90ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Audio')));
160*90ff9d99SŁukasz Kosmaty    // The Camera tests are flaky on iOS, i.e. they fail randomly
161*90ff9d99SŁukasz Kosmaty    if (Constants.isDevice && Platform.OS === 'android') {
162*90ff9d99SŁukasz Kosmaty      modules.push(CameraTestScreen);
163*90ff9d99SŁukasz Kosmaty    }
164*90ff9d99SŁukasz Kosmaty  }
165*90ff9d99SŁukasz Kosmaty  if (Constants.isDevice) {
166*90ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/Cellular')));
167*90ff9d99SŁukasz Kosmaty    modules.push(optionalRequire(() => require('./tests/BarCodeScanner')));
168*90ff9d99SŁukasz Kosmaty  }
169*90ff9d99SŁukasz Kosmaty  return modules.filter(Boolean);
170*90ff9d99SŁukasz Kosmaty}
171