Daniel Zlotin пре 7 година
родитељ
комит
dbeda434de

+ 92
- 30
playground/android/app/src/androidTest/java/com/reactnativenavigation/playground/ApplicationLifecycleTest.java Прегледај датотеку

@@ -7,6 +7,8 @@ import android.support.test.filters.SdkSuppress;
7 7
 import android.support.test.rule.ActivityTestRule;
8 8
 import android.support.test.runner.AndroidJUnit4;
9 9
 import android.support.test.uiautomator.UiDevice;
10
+import android.support.test.uiautomator.UiObjectNotFoundException;
11
+import android.support.test.uiautomator.UiScrollable;
10 12
 import android.support.test.uiautomator.UiSelector;
11 13
 
12 14
 import com.reactnativenavigation.views.NavigationSplashView;
@@ -14,6 +16,7 @@ import com.reactnativenavigation.views.NavigationSplashView;
14 16
 import org.junit.After;
15 17
 import org.junit.Before;
16 18
 import org.junit.FixMethodOrder;
19
+import org.junit.Ignore;
17 20
 import org.junit.Rule;
18 21
 import org.junit.Test;
19 22
 import org.junit.runner.RunWith;
@@ -27,9 +30,9 @@ import static android.support.test.espresso.matcher.ViewMatchers.withText;
27 30
 import static org.assertj.core.api.Java6Assertions.assertThat;
28 31
 
29 32
 @RunWith(AndroidJUnit4.class)
33
+@FixMethodOrder(value = MethodSorters.NAME_ASCENDING)
30 34
 @SdkSuppress(minSdkVersion = 23)
31 35
 @TargetApi(23)
32
-@FixMethodOrder(value = MethodSorters.NAME_ASCENDING)
33 36
 public class ApplicationLifecycleTest {
34 37
 
35 38
     private ReactIdlingResource reactIdlingResource = new ReactIdlingResource();
@@ -38,73 +41,132 @@ public class ApplicationLifecycleTest {
38 41
     public ActivityTestRule<MainActivity> rule = new ActivityTestRule<>(MainActivity.class, false, false);
39 42
 
40 43
     @Before
41
-    public void beforeEach() {
44
+    public void beforeEach() throws Exception {
45
+        uiDevice().wakeUp();
46
+
42 47
         reactIdlingResource.start();
43 48
         Espresso.registerIdlingResources(reactIdlingResource);
49
+
50
+        rule.launchActivity(null);
44 51
     }
45 52
 
46 53
     @After
47 54
     public void afterEach() {
48
-        uiDevice().waitForIdle();
49 55
         reactIdlingResource.stop();
50 56
         Espresso.unregisterIdlingResources(reactIdlingResource);
57
+        uiDevice().waitForIdle();
51 58
     }
52 59
 
53
-    private UiDevice uiDevice() {
54
-        return UiDevice.getInstance(getInstrumentation());
60
+    @Test
61
+    public void _1_showSplash_AcceptsOverlayPermissions_ShowsWelcomeScreen() throws Exception {
62
+        assertThat(rule.getActivity().getContentView()).isNotNull().isInstanceOf(NavigationSplashView.class);
63
+        acceptOverlayPermissionIfNeeded();
64
+        assertWelcomeShown();
55 65
     }
56 66
 
57
-    private void acceptOverlayPermissionIfNeeded() throws Exception {
58
-        if (Settings.canDrawOverlays(getInstrumentation().getContext())) {
59
-            return;
60
-        }
67
+    @Test
68
+    public void _2_relaunchFromBackground() throws Exception {
69
+        assertWelcomeShown();
70
+
71
+        uiDevice().pressHome();
72
+        uiDevice().pressRecentApps();
61 73
         uiDevice().findObject(new UiSelector().text("Playground")).click();
62
-        uiDevice().findObject(new UiSelector().text("Permit drawing over other apps")).click();
63
-        uiDevice().pressBack();
64
-        uiDevice().pressBack();
74
+        uiDevice().waitForIdle();
75
+
76
+        assertWelcomeShown();
65 77
     }
66 78
 
79
+
67 80
     @Test
68
-    public void _1_ShowSplash_AcceptsOverlayPermissions_ShowsWelcomeScreen() throws Exception {
81
+    public void _3_relaunchAfterClose() throws Exception {
82
+        assertWelcomeShown();
83
+
84
+        uiDevice().pressBack();
85
+        uiDevice().waitForIdle();
86
+
69 87
         rule.launchActivity(null);
70
-        assertThat(rule.getActivity().getContentView()).isNotNull().isInstanceOf(NavigationSplashView.class);
71
-        acceptOverlayPermissionIfNeeded();
88
+        uiDevice().waitForIdle();
89
+
72 90
         onView(withText("React Native Navigation!")).check(matches(isDisplayed()));
73 91
     }
74 92
 
75 93
     @Test
76
-    public void _2_RelaunchFromBackground() throws Exception {
77
-        rule.launchActivity(null);
78
-        uiDevice().waitForIdle();
94
+    @Ignore
95
+    public void relaunchAfterActivityKilledBySystem() throws Exception {
96
+        //TODO this test should be compiled in its own APK and run separately.
97
+        assertWelcomeShown();
79 98
 
80
-        onView(withText("React Native Navigation!")).check(matches(isDisplayed()));
81
-        uiDevice().waitForIdle();
99
+        setSettingsNoBackgroundProcesses();
100
+        openCalculator();
82 101
 
83
-        uiDevice().pressHome();
84 102
         uiDevice().pressRecentApps();
85 103
         uiDevice().findObject(new UiSelector().text("Playground")).click();
86 104
         uiDevice().waitForIdle();
87 105
 
88
-        onView(withText("React Native Navigation!")).check(matches(isDisplayed()));
106
+        assertWelcomeShown();
107
+
108
+        setSettingsNormalProcesses();
89 109
     }
90 110
 
91
-    @Test
92
-    public void _3_RelaunchAfterClose() throws Exception {
93
-        rule.launchActivity(null);
111
+    private void setSettingsNoBackgroundProcesses() throws Exception {
112
+        uiDevice().pressHome();
94 113
         uiDevice().waitForIdle();
114
+        uiDevice().findObject(new UiSelector().description("Apps")).clickAndWaitForNewWindow();
115
+        new UiScrollable(new UiSelector().scrollable(true)).scrollTextIntoView("Settings");
116
+        uiDevice().findObject(new UiSelector().text("Settings")).click();
117
+        new UiScrollable(new UiSelector().scrollable(true)).flingToEnd(100);
118
+        uiDevice().findObject(new UiSelector().text("Developer options")).click();
119
+        new UiScrollable(new UiSelector().scrollable(true)).flingToEnd(100);
120
+        uiDevice().findObject(new UiSelector().text("Background process limit")).click();
121
+        uiDevice().findObject(new UiSelector().text("No background processes")).click();
122
+        uiDevice().pressHome();
123
+        uiDevice().waitForIdle();
124
+    }
95 125
 
96
-        uiDevice().pressBack();
126
+    private void openCalculator() throws Exception {
127
+        uiDevice().pressHome();
97 128
         uiDevice().waitForIdle();
129
+        uiDevice().findObject(new UiSelector().description("Apps")).clickAndWaitForNewWindow();
130
+        new UiScrollable(new UiSelector().scrollable(true)).scrollTextIntoView("Calculator");
131
+        uiDevice().findObject(new UiSelector().text("Calculator")).click();
132
+    }
98 133
 
99
-        rule.launchActivity(null);
134
+    private void setSettingsNormalProcesses() throws UiObjectNotFoundException {
135
+        uiDevice().pressHome();
100 136
         uiDevice().waitForIdle();
137
+        uiDevice().findObject(new UiSelector().description("Apps")).clickAndWaitForNewWindow();
138
+        new UiScrollable(new UiSelector().scrollable(true)).scrollTextIntoView("Settings");
139
+        uiDevice().findObject(new UiSelector().text("Settings")).click();
140
+        new UiScrollable(new UiSelector().scrollable(true)).flingToEnd(100);
141
+        uiDevice().findObject(new UiSelector().text("Developer options")).click();
142
+        new UiScrollable(new UiSelector().scrollable(true)).flingToEnd(100);
143
+        uiDevice().findObject(new UiSelector().text("Background process limit")).click();
144
+        uiDevice().findObject(new UiSelector().text("Standard limit")).click();
145
+        uiDevice().pressHome();
146
+        uiDevice().waitForIdle();
147
+    }
101 148
 
149
+    private void assertWelcomeShown() {
102 150
         onView(withText("React Native Navigation!")).check(matches(isDisplayed()));
151
+        uiDevice().waitForIdle();
103 152
     }
153
+
154
+    private UiDevice uiDevice() {
155
+        return UiDevice.getInstance(getInstrumentation());
156
+    }
157
+
158
+    private void acceptOverlayPermissionIfNeeded() throws Exception {
159
+        if (Settings.canDrawOverlays(getInstrumentation().getContext())) {
160
+            return;
161
+        }
162
+        uiDevice().waitForIdle();
163
+        uiDevice().findObject(new UiSelector().text("Playground")).click();
164
+        uiDevice().findObject(new UiSelector().text("Permit drawing over other apps")).click();
165
+        uiDevice().pressBack();
166
+        uiDevice().pressBack();
167
+    }
168
+
104 169
 }
105
-//        it('launch after activity killed by system', () => {
106
-//        //
107
-//        });
108 170
 //
109 171
 //        it('launch after reactContext killed by system', () => {
110 172
 //        //