blob: 678ce1d54a25122ec74fe7eefe90c133d2f94b7e [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.recent_tabs.ui;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.chromium.chrome.browser.recent_tabs.RestoreTabsProperties.ALL_KEYS;
import static org.chromium.chrome.browser.recent_tabs.RestoreTabsProperties.CURRENT_SCREEN;
import static org.chromium.chrome.browser.recent_tabs.RestoreTabsProperties.DEVICE_MODEL_LIST;
import static org.chromium.chrome.browser.recent_tabs.RestoreTabsProperties.HOME_SCREEN_DELEGATE;
import static org.chromium.chrome.browser.recent_tabs.RestoreTabsProperties.NUM_TABS_DESELECTED;
import static org.chromium.chrome.browser.recent_tabs.RestoreTabsProperties.REVIEW_TABS_MODEL_LIST;
import static org.chromium.chrome.browser.recent_tabs.RestoreTabsProperties.SELECTED_DEVICE;
import static org.chromium.chrome.browser.recent_tabs.RestoreTabsProperties.ScreenType.HOME_SCREEN;
import static org.chromium.chrome.browser.recent_tabs.RestoreTabsProperties.VISIBLE;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.annotation.Config;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.chrome.browser.recent_tabs.ForeignSessionHelper.ForeignSession;
import org.chromium.chrome.browser.recent_tabs.ForeignSessionHelper.ForeignSessionTab;
import org.chromium.chrome.browser.recent_tabs.R;
import org.chromium.chrome.browser.recent_tabs.RestoreTabsProperties.DetailItemType;
import org.chromium.ui.modelutil.MVCListAdapter.ListItem;
import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
import org.chromium.url.JUnitTestGURLs;
import java.util.ArrayList;
/** Tests for RestoreTabsPromoScreenViewBinder. */
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class RestoreTabsPromoScreenViewBinderUnitTest {
@Mock
private RestoreTabsPromoScreenCoordinator.Delegate mMockDelegate;
private Activity mActivity;
private ViewGroup mParentView;
private View mRestoreTabsPromoView;
private PropertyModel mModel;
private PropertyModelChangeProcessor mPropertyModelChangeProcessor;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mActivity = Robolectric.buildActivity(Activity.class).setup().get();
mRestoreTabsPromoView = LayoutInflater.from(mActivity).inflate(
R.layout.restore_tabs_bottom_sheet, /*root=*/null);
mModel = new PropertyModel.Builder(ALL_KEYS)
.with(VISIBLE, false)
.with(DEVICE_MODEL_LIST, new ModelList())
.with(REVIEW_TABS_MODEL_LIST, new ModelList())
.with(NUM_TABS_DESELECTED, 0)
.build();
mPropertyModelChangeProcessor = PropertyModelChangeProcessor.create(mModel,
new RestoreTabsPromoScreenViewBinder.ViewHolder(mRestoreTabsPromoView),
RestoreTabsPromoScreenViewBinder::bind);
}
@Test
public void testOnHomeScreen_setSelectedDevice() {
mModel.set(CURRENT_SCREEN, HOME_SCREEN);
mModel.set(SELECTED_DEVICE,
new ForeignSession("tag", "John's iPhone 6", 32L, new ArrayList<>()));
TextView deviceNameView =
mRestoreTabsPromoView.findViewById(R.id.restore_tabs_promo_sheet_device_name);
TextView deviceInfoView =
mRestoreTabsPromoView.findViewById(R.id.restore_tabs_promo_sheet_session_info);
Assert.assertEquals("John's iPhone 6", deviceNameView.getText());
Assert.assertEquals("0 tabs, last updated: Jan 1, 1970", deviceInfoView.getText());
}
@Test
public void testSetHomeScreen() {
mModel.set(HOME_SCREEN_DELEGATE, mMockDelegate);
mModel.set(SELECTED_DEVICE,
new ForeignSession("tag", "John's iPhone 6", 32L, new ArrayList<>()));
mModel.set(CURRENT_SCREEN, HOME_SCREEN);
TextView deviceNameView =
mRestoreTabsPromoView.findViewById(R.id.restore_tabs_promo_sheet_device_name);
TextView deviceInfoView =
mRestoreTabsPromoView.findViewById(R.id.restore_tabs_promo_sheet_session_info);
Assert.assertEquals("John's iPhone 6", deviceNameView.getText());
Assert.assertEquals("0 tabs, last updated: Jan 1, 1970", deviceInfoView.getText());
View sessionInfoLayout = mRestoreTabsPromoView.findViewById(R.id.selected_device_view);
Assert.assertNotNull(sessionInfoLayout);
sessionInfoLayout.performClick();
verify(mMockDelegate, times(1)).onShowDeviceList();
View openTabsButton =
mRestoreTabsPromoView.findViewById(R.id.restore_tabs_button_open_tabs);
Assert.assertNotNull(openTabsButton);
openTabsButton.performClick();
verify(mMockDelegate, times(1)).onAllTabsChosen();
TextView openTabsButtonText =
mRestoreTabsPromoView.findViewById(R.id.restore_tabs_button_open_tabs);
Assert.assertEquals("Open 0 tabs", openTabsButtonText.getText());
View reviewTabsButton =
mRestoreTabsPromoView.findViewById(R.id.restore_tabs_button_review_tabs);
Assert.assertNotNull(reviewTabsButton);
reviewTabsButton.performClick();
verify(mMockDelegate, times(1)).onReviewTabsChosen();
}
@Test
public void testOnHomeScreen_oneTab() {
ForeignSessionTab tab1 = new ForeignSessionTab(
JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_1), "title", 32L, 0);
ModelList tabItems = mModel.get(REVIEW_TABS_MODEL_LIST);
PropertyModel model1 = TabItemProperties.create(/*tab=*/tab1, /*isSelected=*/true);
tabItems.add(new ListItem(DetailItemType.TAB, model1));
mModel.set(CURRENT_SCREEN, HOME_SCREEN);
TextView openTabsButtonText =
mRestoreTabsPromoView.findViewById(R.id.restore_tabs_button_open_tabs);
Assert.assertEquals("Open 1 tab", openTabsButtonText.getText());
}
@Test
public void testOnHomeScreen_multipleTab() {
ForeignSessionTab tab1 = new ForeignSessionTab(
JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_1), "title", 32L, 0);
ModelList tabItems = mModel.get(REVIEW_TABS_MODEL_LIST);
PropertyModel model1 = TabItemProperties.create(/*tab=*/tab1, /*isSelected=*/true);
tabItems.add(new ListItem(DetailItemType.TAB, model1));
ForeignSessionTab tab2 = new ForeignSessionTab(
JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_1), "title", 32L, 0);
PropertyModel model2 = TabItemProperties.create(/*tab=*/tab2, /*isSelected=*/true);
tabItems.add(new ListItem(DetailItemType.TAB, model2));
mModel.set(CURRENT_SCREEN, HOME_SCREEN);
TextView openTabsButtonText =
mRestoreTabsPromoView.findViewById(R.id.restore_tabs_button_open_tabs);
Assert.assertEquals("Open 2 tabs", openTabsButtonText.getText());
}
@Test
public void testOnHomeScreen_selectAndDeselectTabs() {
ForeignSessionTab tab1 = new ForeignSessionTab(
JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_1), "title", 32L, 0);
ModelList tabItems = mModel.get(REVIEW_TABS_MODEL_LIST);
PropertyModel model1 = TabItemProperties.create(/*tab=*/tab1, /*isSelected=*/true);
tabItems.add(new ListItem(DetailItemType.TAB, model1));
ForeignSessionTab tab2 = new ForeignSessionTab(
JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_1), "title", 32L, 0);
PropertyModel model2 = TabItemProperties.create(/*tab=*/tab2, /*isSelected=*/true);
tabItems.add(new ListItem(DetailItemType.TAB, model2));
mModel.set(NUM_TABS_DESELECTED, 1);
mModel.set(CURRENT_SCREEN, HOME_SCREEN);
TextView openTabsButtonText =
mRestoreTabsPromoView.findViewById(R.id.restore_tabs_button_open_tabs);
Assert.assertEquals("Open 1 tab", openTabsButtonText.getText());
}
}