Browse Source

Test TopTab navigationOptions is applied correctly (#2379)

* minor refactor - moved some logic from view o controller
Guy Carmeli 6 years ago
parent
commit
a6f19787f6
No account linked to committer's email address

+ 1
- 0
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/toptabs/TopTabController.java View File

68
     @Override
68
     @Override
69
     public void mergeNavigationOptions(NavigationOptions options) {
69
     public void mergeNavigationOptions(NavigationOptions options) {
70
         this.options.mergeWith(options);
70
         this.options.mergeWith(options);
71
+        applyOptions(this.options);
71
     }
72
     }
72
 
73
 
73
     String getTabTitle() {
74
     String getTabTitle() {

+ 4
- 0
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/toptabs/TopTabsAdapter.java View File

51
     public void onPageScrollStateChanged(int state) {
51
     public void onPageScrollStateChanged(int state) {
52
 
52
 
53
     }
53
     }
54
+
55
+    int getCurrentItem() {
56
+        return currentPage;
57
+    }
54
 }
58
 }

+ 10
- 3
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/toptabs/TopTabsController.java View File

6
 
6
 
7
 import com.reactnativenavigation.parse.NavigationOptions;
7
 import com.reactnativenavigation.parse.NavigationOptions;
8
 import com.reactnativenavigation.presentation.NavigationOptionsListener;
8
 import com.reactnativenavigation.presentation.NavigationOptionsListener;
9
+import com.reactnativenavigation.utils.Task;
9
 import com.reactnativenavigation.viewcontrollers.ParentController;
10
 import com.reactnativenavigation.viewcontrollers.ParentController;
10
 import com.reactnativenavigation.viewcontrollers.ViewController;
11
 import com.reactnativenavigation.viewcontrollers.ViewController;
11
 import com.reactnativenavigation.views.TopTabsLayout;
12
 import com.reactnativenavigation.views.TopTabsLayout;
17
 
18
 
18
     private List<TopTabController> tabs;
19
     private List<TopTabController> tabs;
19
     private TopTabsLayout topTabsLayout;
20
     private TopTabsLayout topTabsLayout;
21
+    private TopTabsAdapter adapter;
20
 
22
 
21
     public TopTabsController(Activity activity, String id, List<TopTabController> tabs) {
23
     public TopTabsController(Activity activity, String id, List<TopTabController> tabs) {
22
         super(activity, id);
24
         super(activity, id);
23
         this.tabs = tabs;
25
         this.tabs = tabs;
26
+        this.adapter = new TopTabsAdapter(tabs);
24
         for (ViewController tab : tabs) {
27
         for (ViewController tab : tabs) {
25
             tab.setParentController(this);
28
             tab.setParentController(this);
26
         }
29
         }
29
     @NonNull
32
     @NonNull
30
     @Override
33
     @Override
31
     protected ViewGroup createView() {
34
     protected ViewGroup createView() {
32
-        topTabsLayout = new TopTabsLayout(getActivity(), tabs);
35
+        topTabsLayout = new TopTabsLayout(getActivity(), tabs, adapter);
33
         return topTabsLayout;
36
         return topTabsLayout;
34
     }
37
     }
35
 
38
 
41
 
44
 
42
     @Override
45
     @Override
43
     public void onViewAppeared() {
46
     public void onViewAppeared() {
44
-        topTabsLayout.performOnCurrentTab(TopTabController::onViewAppeared);
47
+        performOnCurrentTab(TopTabController::onViewAppeared);
45
     }
48
     }
46
 
49
 
47
     @Override
50
     @Override
48
     public void onViewDisappear() {
51
     public void onViewDisappear() {
49
-        topTabsLayout.performOnCurrentTab(TopTabController::onViewDisappear);
52
+        performOnCurrentTab(TopTabController::onViewDisappear);
50
     }
53
     }
51
 
54
 
52
     @Override
55
     @Override
62
     public void switchToTab(int index) {
65
     public void switchToTab(int index) {
63
         topTabsLayout.switchToTab(index);
66
         topTabsLayout.switchToTab(index);
64
     }
67
     }
68
+
69
+    private void performOnCurrentTab(Task<TopTabController> task) {
70
+        task.run(tabs.get(adapter.getCurrentItem()));
71
+    }
65
 }
72
 }

+ 3
- 4
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/toptabs/TopTabsViewPager.java View File

16
     private static final int OFFSCREEN_PAGE_LIMIT = 99;
16
     private static final int OFFSCREEN_PAGE_LIMIT = 99;
17
     private List<TopTabController> tabs;
17
     private List<TopTabController> tabs;
18
 
18
 
19
-    public TopTabsViewPager(Context context, List<TopTabController> tabs) {
19
+    public TopTabsViewPager(Context context, List<TopTabController> tabs, TopTabsAdapter adapter) {
20
         super(context);
20
         super(context);
21
         this.tabs = tabs;
21
         this.tabs = tabs;
22
-        init();
22
+        init(adapter);
23
     }
23
     }
24
 
24
 
25
-    private void init() {
25
+    private void init(TopTabsAdapter adapter) {
26
         setOffscreenPageLimit(OFFSCREEN_PAGE_LIMIT);
26
         setOffscreenPageLimit(OFFSCREEN_PAGE_LIMIT);
27
         for (ViewController tab : tabs) {
27
         for (ViewController tab : tabs) {
28
             addView(tab.getView(), new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
28
             addView(tab.getView(), new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
29
         }
29
         }
30
-        TopTabsAdapter adapter = new TopTabsAdapter(tabs);
31
         setAdapter(adapter);
30
         setAdapter(adapter);
32
         addOnPageChangeListener(adapter);
31
         addOnPageChangeListener(adapter);
33
     }
32
     }

+ 3
- 10
lib/android/app/src/main/java/com/reactnativenavigation/views/TopTabsLayout.java View File

8
 
8
 
9
 import com.reactnativenavigation.parse.NavigationOptions;
9
 import com.reactnativenavigation.parse.NavigationOptions;
10
 import com.reactnativenavigation.presentation.OptionsPresenter;
10
 import com.reactnativenavigation.presentation.OptionsPresenter;
11
-import com.reactnativenavigation.utils.Task;
12
 import com.reactnativenavigation.viewcontrollers.toptabs.TopTabController;
11
 import com.reactnativenavigation.viewcontrollers.toptabs.TopTabController;
12
+import com.reactnativenavigation.viewcontrollers.toptabs.TopTabsAdapter;
13
 import com.reactnativenavigation.viewcontrollers.toptabs.TopTabsViewPager;
13
 import com.reactnativenavigation.viewcontrollers.toptabs.TopTabsViewPager;
14
 
14
 
15
 import java.util.List;
15
 import java.util.List;
18
 public class TopTabsLayout extends LinearLayout implements Container {
18
 public class TopTabsLayout extends LinearLayout implements Container {
19
 
19
 
20
     private TopBar topBar;
20
     private TopBar topBar;
21
-    private List<TopTabController> tabs;
22
     private TopTabsViewPager viewPager;
21
     private TopTabsViewPager viewPager;
23
     private final OptionsPresenter optionsPresenter;
22
     private final OptionsPresenter optionsPresenter;
24
 
23
 
25
-    public TopTabsLayout(Context context, List<TopTabController> tabs) {
24
+    public TopTabsLayout(Context context, List<TopTabController> tabs, TopTabsAdapter adapter) {
26
         super(context);
25
         super(context);
27
         topBar = new TopBar(context);
26
         topBar = new TopBar(context);
28
-        this.tabs = tabs;
29
-        viewPager = new TopTabsViewPager(context, tabs);
30
         optionsPresenter = new OptionsPresenter(topBar, viewPager);
27
         optionsPresenter = new OptionsPresenter(topBar, viewPager);
28
+        viewPager = new TopTabsViewPager(context, tabs, adapter);
31
         initViews();
29
         initViews();
32
     }
30
     }
33
 
31
 
54
         return viewPager;
52
         return viewPager;
55
     }
53
     }
56
 
54
 
57
-
58
-    public void performOnCurrentTab(Task<TopTabController> task) {
59
-        task.run(tabs.get(viewPager.getCurrentItem()));
60
-    }
61
-
62
     public void switchToTab(int index) {
55
     public void switchToTab(int index) {
63
         viewPager.setCurrentItem(index);
56
         viewPager.setCurrentItem(index);
64
     }
57
     }

+ 53
- 0
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/TopTabControllerTest.java View File

1
+package com.reactnativenavigation.viewcontrollers;
2
+
3
+import android.app.Activity;
4
+
5
+import com.reactnativenavigation.BaseTest;
6
+import com.reactnativenavigation.mocks.TopTabLayoutMock;
7
+import com.reactnativenavigation.parse.NavigationOptions;
8
+import com.reactnativenavigation.viewcontrollers.toptabs.TopTabController;
9
+
10
+import org.junit.Test;
11
+
12
+import static org.mockito.Mockito.spy;
13
+import static org.mockito.Mockito.times;
14
+import static org.mockito.Mockito.verify;
15
+
16
+public class TopTabControllerTest extends BaseTest {
17
+    private TopTabController uut;
18
+    private TopTabLayoutMock view;
19
+    private ParentController parentController;
20
+    private NavigationOptions initialOptions;
21
+
22
+    @Override
23
+    public void beforeEach() {
24
+        super.beforeEach();
25
+        Activity activity = newActivity();
26
+        view = spy(new TopTabLayoutMock(activity));
27
+        initialOptions = new NavigationOptions();
28
+        uut = new TopTabController(activity,
29
+                "containerId",
30
+                "containerName",
31
+                (activity1, containerId, containerName) -> view,
32
+                initialOptions
33
+        );
34
+        parentController = spy(new TopTabsControllerMock(activity, "parentContainerId"));
35
+        uut.setParentController(parentController);
36
+    }
37
+
38
+    @Test
39
+    public void styleIsAppliedOnParentControllerWhenTabIsVisible() throws Exception {
40
+        uut.ensureViewIsCreated();
41
+        uut.onViewAppeared();
42
+        verify(parentController, times(1)).applyOptions(initialOptions);
43
+    }
44
+
45
+    @Test
46
+    public void styleIsAppliedOnParentControllerWhenOptionsAreSetDynamically() throws Exception {
47
+        uut.ensureViewIsCreated();
48
+        uut.onViewAppeared();
49
+        uut.mergeNavigationOptions(new NavigationOptions());
50
+        verify(parentController, times(2)).applyOptions(initialOptions);
51
+    }
52
+
53
+}

+ 25
- 0
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/TopTabsControllerMock.java View File

1
+package com.reactnativenavigation.viewcontrollers;
2
+
3
+import android.app.Activity;
4
+import android.support.annotation.NonNull;
5
+import android.view.ViewGroup;
6
+
7
+import java.util.Collection;
8
+
9
+public class TopTabsControllerMock extends ParentController {
10
+    public TopTabsControllerMock(Activity activity, String id) {
11
+        super(activity, id);
12
+    }
13
+
14
+    @NonNull
15
+    @Override
16
+    protected ViewGroup createView() {
17
+        return null;
18
+    }
19
+
20
+    @NonNull
21
+    @Override
22
+    public Collection<? extends ViewController> getChildControllers() {
23
+        return null;
24
+    }
25
+}

+ 22
- 2
playground/src/containers/TopTabOptionsScreen.js View File

1
 const React = require('react');
1
 const React = require('react');
2
 const { PureComponent } = require('react');
2
 const { PureComponent } = require('react');
3
-
4
-const { View, Text } = require('react-native');
3
+const testIDs = require('../testIDs');
4
+const { View, Text, Button } = require('react-native');
5
+const Navigation = require('react-native-navigation');
5
 
6
 
6
 class TopTabOptionsScreen extends PureComponent {
7
 class TopTabOptionsScreen extends PureComponent {
7
   static get navigationOptions() {
8
   static get navigationOptions() {
15
     };
16
     };
16
   }
17
   }
17
 
18
 
19
+  constructor(props) {
20
+    super(props);
21
+    this.onClickDynamicOptions = this.onClickDynamicOptions.bind(this);
22
+  }
23
+
18
   render() {
24
   render() {
19
     return (
25
     return (
20
       <View style={styles.root}>
26
       <View style={styles.root}>
21
         <Text style={styles.h1}>{this.props.text || 'Top Tab Screen'}</Text>
27
         <Text style={styles.h1}>{this.props.text || 'Top Tab Screen'}</Text>
22
         <Text style={styles.footer}>{`this.props.containerId = ${this.props.containerId}`}</Text>
28
         <Text style={styles.footer}>{`this.props.containerId = ${this.props.containerId}`}</Text>
29
+        <Button title="Dynamic Options" testID={testIDs.DYNAMIC_OPTIONS_BUTTON} onPress={this.onClickDynamicOptions} />
23
       </View>
30
       </View>
24
     );
31
     );
25
   }
32
   }
33
+
34
+  onClickDynamicOptions() {
35
+    Navigation.setOptions(this.props.containerId, {
36
+      topBar: {
37
+        title: 'Dynamic Title',
38
+        textColor: '#00FFFF',
39
+        largeTitle: false,
40
+        buttonColor: 'red',
41
+        textFontSize: 20,
42
+        textFontFamily: 'HelveticaNeue-CondensedBold'
43
+      }
44
+    });
45
+  }
26
 }
46
 }
27
 
47
 
28
 const styles = {
48
 const styles = {