Browse Source

react must be mocked in the unit tests

Daniel Zlotin 8 years ago
parent
commit
b7af16c217

+ 71
- 3
android/app/src/main/java/com/reactnativenavigation/NavigationApplication.java View File

@@ -1,26 +1,94 @@
1 1
 package com.reactnativenavigation;
2 2
 
3
+import android.app.Activity;
3 4
 import android.app.Application;
5
+import android.os.Bundle;
4 6
 
5 7
 import com.facebook.react.ReactApplication;
6 8
 import com.facebook.react.ReactNativeHost;
9
+import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
10
+import com.reactnativenavigation.controllers.ActivityLifecycleDelegate;
7 11
 import com.reactnativenavigation.react.NavigationReactNativeHost;
8 12
 
9 13
 public abstract class NavigationApplication extends Application implements ReactApplication {
10 14
 	public static NavigationApplication instance;
11
-	private ReactNativeHost host;
15
+
16
+	public static class Config {
17
+		public final ReactNativeHost reactNativeHost;
18
+		public final ActivityLifecycleDelegate activityLifecycleDelegate;
19
+
20
+		public Config(ReactNativeHost reactNativeHost, ActivityLifecycleDelegate activityLifecycleDelegate) {
21
+			this.reactNativeHost = reactNativeHost;
22
+			this.activityLifecycleDelegate = activityLifecycleDelegate;
23
+		}
24
+	}
25
+
26
+	private Config config;
12 27
 
13 28
 	@Override
14 29
 	public void onCreate() {
15 30
 		super.onCreate();
16 31
 		instance = this;
17
-		host = new NavigationReactNativeHost(this);
32
+
33
+		config = createConfig();
34
+
35
+		registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
36
+			@Override
37
+			public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
38
+				config().activityLifecycleDelegate.onActivityCreated(activity);
39
+			}
40
+
41
+			@Override
42
+			public void onActivityStarted(Activity activity) {
43
+
44
+			}
45
+
46
+			@Override
47
+			public void onActivityResumed(Activity activity) {
48
+				config().activityLifecycleDelegate.onActivityResumed(activity, (DefaultHardwareBackBtnHandler) activity);
49
+			}
50
+
51
+			@Override
52
+			public void onActivityPaused(Activity activity) {
53
+				config().activityLifecycleDelegate.onActivityPaused(activity);
54
+			}
55
+
56
+			@Override
57
+			public void onActivityStopped(Activity activity) {
58
+
59
+			}
60
+
61
+			@Override
62
+			public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
63
+
64
+			}
65
+
66
+			@Override
67
+			public void onActivityDestroyed(Activity activity) {
68
+				config().activityLifecycleDelegate.onActivityDestroyed(activity);
69
+			}
70
+		});
18 71
 	}
19 72
 
20 73
 	@Override
21 74
 	public ReactNativeHost getReactNativeHost() {
22
-		return host;
75
+		return config().reactNativeHost;
23 76
 	}
24 77
 
25 78
 	public abstract boolean isDebug();
79
+
80
+	public Config config() {
81
+		return config;
82
+	}
83
+
84
+	/**
85
+	 * override this to inject your own configuration
86
+	 *
87
+	 * @return the Config
88
+	 */
89
+	protected Config createConfig() {
90
+		ReactNativeHost reactNativeHost = new NavigationReactNativeHost(this, isDebug());
91
+		ActivityLifecycleDelegate activityLifecycleDelegate = new ActivityLifecycleDelegate(reactNativeHost.getReactInstanceManager());
92
+		return new Config(reactNativeHost, activityLifecycleDelegate);
93
+	}
26 94
 }

+ 5
- 11
android/app/src/main/java/com/reactnativenavigation/controllers/ActivityLifecycleDelegate.java View File

@@ -12,24 +12,18 @@ import java.util.concurrent.atomic.AtomicBoolean;
12 12
 
13 13
 public class ActivityLifecycleDelegate {
14 14
 
15
-	private final Activity activity;
16
-	private final DefaultHardwareBackBtnHandler backBtnHandler;
17 15
 	private final ReactInstanceManager reactInstanceManager;
18 16
 	private final AtomicBoolean appLaunchEmitted = new AtomicBoolean(false);
19 17
 
20
-	public ActivityLifecycleDelegate(Activity activity,
21
-	                                 DefaultHardwareBackBtnHandler backBtnHandler,
22
-	                                 ReactInstanceManager reactInstanceManager) {
23
-		this.activity = activity;
24
-		this.backBtnHandler = backBtnHandler;
18
+	public ActivityLifecycleDelegate(ReactInstanceManager reactInstanceManager) {
25 19
 		this.reactInstanceManager = reactInstanceManager;
26 20
 	}
27 21
 
28
-	public void onActivityCreated() {
22
+	public void onActivityCreated(Activity activity) {
29 23
 		appLaunchEmitted.set(false);
30 24
 	}
31 25
 
32
-	public void onActivityResumed() {
26
+	public void onActivityResumed(Activity activity, DefaultHardwareBackBtnHandler backBtnHandler) {
33 27
 		if (ReactDevPermission.shouldAskPermission()) {
34 28
 			ReactDevPermission.askPermission(activity);
35 29
 		} else {
@@ -38,13 +32,13 @@ public class ActivityLifecycleDelegate {
38 32
 		}
39 33
 	}
40 34
 
41
-	public void onActivityPaused() {
35
+	public void onActivityPaused(Activity activity) {
42 36
 		if (reactInstanceManager.hasStartedCreatingInitialContext()) {
43 37
 			reactInstanceManager.onHostPause(activity);
44 38
 		}
45 39
 	}
46 40
 
47
-	public void onActivityDestroyed() {
41
+	public void onActivityDestroyed(Activity activity) {
48 42
 		if (reactInstanceManager.hasStartedCreatingInitialContext()) {
49 43
 			reactInstanceManager.onHostDestroy(activity);
50 44
 		}

+ 8
- 4
android/app/src/main/java/com/reactnativenavigation/react/NavigationReactNativeHost.java View File

@@ -1,26 +1,30 @@
1 1
 package com.reactnativenavigation.react;
2 2
 
3
+import android.app.Application;
4
+
3 5
 import com.facebook.react.ReactNativeHost;
4 6
 import com.facebook.react.ReactPackage;
5 7
 import com.facebook.react.shell.MainReactPackage;
6
-import com.reactnativenavigation.NavigationApplication;
7 8
 
8 9
 import java.util.Arrays;
9 10
 import java.util.List;
10 11
 
11 12
 public class NavigationReactNativeHost extends ReactNativeHost {
12
-	public NavigationReactNativeHost(NavigationApplication application) {
13
+	private boolean isDebug;
14
+
15
+	public NavigationReactNativeHost(Application application, boolean isDebug) {
13 16
 		super(application);
17
+		this.isDebug = isDebug;
14 18
 	}
15 19
 
16 20
 	@Override
17 21
 	public boolean getUseDeveloperSupport() {
18
-		return NavigationApplication.instance.isDebug();
22
+		return isDebug;
19 23
 	}
20 24
 
21 25
 	@Override
22 26
 	protected List<ReactPackage> getPackages() {
23
-		return Arrays.asList(
27
+		return Arrays.<ReactPackage>asList(
24 28
 				new MainReactPackage(),
25 29
 				new NavigationPackage()
26 30
 		);

+ 1
- 1
android/app/src/test/AndroidManifest.xml View File

@@ -2,7 +2,7 @@
2 2
           package="com.reactnativenavigation">
3 3
 
4 4
     <application
5
-        android:name=".mocks.TestApplication"
5
+        android:name=".TestApplication"
6 6
         android:theme="@style/Theme.AppCompat.Light">
7 7
     </application>
8 8
 </manifest>

+ 13
- 1
android/app/src/test/java/com/reactnativenavigation/NavigationApplicationTest.java View File

@@ -1,6 +1,7 @@
1 1
 package com.reactnativenavigation;
2 2
 
3 3
 import com.facebook.react.ReactApplication;
4
+import com.reactnativenavigation.controllers.ActivityLifecycleDelegate;
4 5
 
5 6
 import org.junit.Test;
6 7
 import org.robolectric.RuntimeEnvironment;
@@ -21,7 +22,18 @@ public class NavigationApplicationTest extends BaseTest {
21 22
 	}
22 23
 
23 24
 	@Test
24
-	public void singleInstance() throws Exception {
25
+	public void singleGlobalInstance() throws Exception {
25 26
 		assertThat(RuntimeEnvironment.application).isSameAs(NavigationApplication.instance);
26 27
 	}
28
+
29
+	@Test
30
+	public void providesConfiguration() throws Exception {
31
+		assertThat(NavigationApplication.instance.config()).isInstanceOf(NavigationApplication.Config.class);
32
+	}
33
+
34
+	@Test
35
+	public void configProvidesActivityLifecycleDelegate() throws Exception {
36
+		NavigationApplication.Config config = NavigationApplication.instance.config();
37
+		assertThat(config.activityLifecycleDelegate).isInstanceOf(ActivityLifecycleDelegate.class);
38
+	}
27 39
 }

+ 10
- 0
android/app/src/test/java/com/reactnativenavigation/TestApplication.java View File

@@ -0,0 +1,10 @@
1
+package com.reactnativenavigation;
2
+
3
+public class TestApplication extends NavigationApplication {
4
+
5
+	@Override
6
+	public boolean isDebug() {
7
+		return true;
8
+	}
9
+
10
+}

+ 0
- 11
android/app/src/test/java/com/reactnativenavigation/mocks/TestApplication.java View File

@@ -1,11 +0,0 @@
1
-package com.reactnativenavigation.mocks;
2
-
3
-import com.reactnativenavigation.BuildConfig;
4
-import com.reactnativenavigation.NavigationApplication;
5
-
6
-public class TestApplication extends NavigationApplication {
7
-	@Override
8
-	public boolean isDebug() {
9
-		return BuildConfig.DEBUG;
10
-	}
11
-}