Commit 374693d6 authored by Zhiyuan Cai's avatar Zhiyuan Cai Committed by Chromium LUCI CQ

Add test for PriceWelcomeMessageCard component

This change adds test for PriceWelcomeMessageCard component, including
https://chromium-review.googlesource.com/c/chromium/src/+/2556657 and
https://chromium-review.googlesource.com/c/chromium/src/+/2575579.

Bug: 1148020
Change-Id: Ica16dac79569e241d850dc0ee79c613fc212ece8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2581694
Commit-Queue: Zhiyuan Cai <zhiyuancai@google.com>
Reviewed-by: default avatarYue Zhang <yuezhanggg@chromium.org>
Reviewed-by: default avatarMei Liang <meiliang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#837865}
parent 68336259
......@@ -23,9 +23,11 @@ public class PriceTrackingUtilities {
@VisibleForTesting
public static final String TRACK_PRICES_ON_TABS =
ChromePreferenceKeys.PRICE_TRACKING_TRACK_PRICES_ON_TABS;
private static final String PRICE_WELCOME_MESSAGE_CARD =
@VisibleForTesting
public static final String PRICE_WELCOME_MESSAGE_CARD =
ChromePreferenceKeys.PRICE_TRACKING_PRICE_WELCOME_MESSAGE_CARD;
private static final String PRICE_WELCOME_MESSAGE_CARD_SHOW_COUNT =
@VisibleForTesting
public static final String PRICE_WELCOME_MESSAGE_CARD_SHOW_COUNT =
ChromePreferenceKeys.PRICE_TRACKING_PRICE_WELCOME_MESSAGE_CARD_SHOW_COUNT;
@VisibleForTesting
......
......@@ -4,6 +4,8 @@
package org.chromium.chrome.browser.tasks.tab_management;
import androidx.annotation.VisibleForTesting;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.state.ShoppingPersistedTabData;
......@@ -165,14 +167,21 @@ public class PriceWelcomeMessageService extends MessageService {
sendInvalidNotification();
}
private void review() {
@VisibleForTesting
public void review() {
assert mPriceTabData != null;
mPriceWelcomeMessageReviewActionProvider.scrollToBindingTab(
mPriceWelcomeMessageProvider.getTabIndexFromTabId(mPriceTabData.bindingTabId));
PriceTrackingUtilities.disablePriceWelcomeMessageCard();
}
private void dismiss() {
@VisibleForTesting
public void dismiss() {
PriceTrackingUtilities.disablePriceWelcomeMessageCard();
}
@VisibleForTesting
PriceTabData getPriceTabDataForTesting() {
return mPriceTabData;
}
}
......@@ -60,8 +60,13 @@ public class MessageCardProviderTest extends DummyUiActivityTestCase {
mCoordinator.getMessageItems();
for (int i = 0; i < messageList.size(); i++) {
MessageCardProviderMediator.Message message = messageList.get(i);
mModelList.add(new MVCListAdapter.ListItem(
TabProperties.UiType.MESSAGE, message.model));
if (message.type == MessageService.MessageType.PRICE_WELCOME) {
mModelList.add(new MVCListAdapter.ListItem(
TabProperties.UiType.PRICE_WELCOME, message.model));
} else {
mModelList.add(new MVCListAdapter.ListItem(
TabProperties.UiType.MESSAGE, message.model));
}
}
}
......@@ -90,12 +95,17 @@ public class MessageCardProviderTest extends DummyUiActivityTestCase {
private MessageService mSuggestionService =
new MessageService(MessageService.MessageType.TAB_SUGGESTION);
private MessageCardProviderCoordinator mCoordinator;
private MessageService mPriceService =
new MessageService(MessageService.MessageType.PRICE_WELCOME);
private MessageCardView.DismissActionProvider mUiDismissActionProvider = (messageType) -> {};
@Mock
private TabSuggestionMessageService.TabSuggestionMessageData mTabSuggestionMessageData;
@Mock
private PriceWelcomeMessageService.PriceWelcomeMessageData mPriceWelcomeMessageData;
@Override
public void setUpTest() throws Exception {
super.setUpTest();
......@@ -117,13 +127,20 @@ public class MessageCardProviderTest extends DummyUiActivityTestCase {
new LayoutViewBuilder(R.layout.tab_grid_message_card_item),
MessageCardViewBinder::bind);
mAdapter.registerType(TabProperties.UiType.PRICE_WELCOME,
new LayoutViewBuilder(R.layout.price_welcome_message_card_item),
PriceWelcomeMessageCardViewBinder::bind);
GridLayoutManager layoutManager = new GridLayoutManager(mRecyclerView.getContext(), 2);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int i) {
int itemType = mAdapter.getItemViewType(i);
if (itemType == TabProperties.UiType.MESSAGE) return 2;
if (itemType == TabProperties.UiType.MESSAGE
|| itemType == TabProperties.UiType.PRICE_WELCOME) {
return 2;
}
return 1;
}
});
......@@ -137,6 +154,7 @@ public class MessageCardProviderTest extends DummyUiActivityTestCase {
getActivity(), () -> false, mUiDismissActionProvider);
mCoordinator.subscribeMessageService(mTestingService);
mCoordinator.subscribeMessageService(mSuggestionService);
mCoordinator.subscribeMessageService(mPriceService);
when(mTabSuggestionMessageData.getActionType())
.thenReturn(TabSuggestion.TabSuggestionAction.CLOSE);
......@@ -197,4 +215,57 @@ public class MessageCardProviderTest extends DummyUiActivityTestCase {
onView(withId(R.id.close_button)).perform(click());
assertTrue(dismissed.get());
}
@Test
@SmallTest
public void testPriceWelcomeMessage() {
mPriceService.sendAvailabilityNotification(mPriceWelcomeMessageData);
TestThreadUtils.runOnUiThreadBlocking(() -> mRecyclerView.startShowing(false));
CriteriaHelper.pollUiThread(
() -> mRecyclerView.getVisibility() == View.VISIBLE && mFinishedShowing.get());
onView(withId(R.id.tab_grid_price_welcome_message_item)).check(matches(isDisplayed()));
}
@Test
@SmallTest
public void testReviewPriceWelcomeMessage() {
AtomicBoolean reviewed = new AtomicBoolean();
when(mPriceWelcomeMessageData.getReviewActionProvider())
.thenReturn(() -> reviewed.set(true));
mPriceService.sendAvailabilityNotification(mPriceWelcomeMessageData);
TestThreadUtils.runOnUiThreadBlocking(() -> mRecyclerView.startShowing(false));
CriteriaHelper.pollUiThread(
() -> mRecyclerView.getVisibility() == View.VISIBLE && mFinishedShowing.get());
onView(withId(R.id.tab_grid_price_welcome_message_item)).check(matches(isDisplayed()));
assertFalse(reviewed.get());
onView(withId(R.id.action_button)).perform(click());
assertTrue(reviewed.get());
}
@Test
@SmallTest
public void testDismissPriceWelcomeMessage() {
AtomicBoolean dismissed = new AtomicBoolean();
when(mPriceWelcomeMessageData.getDismissActionProvider())
.thenReturn((type) -> dismissed.set(true));
mPriceService.sendAvailabilityNotification(mPriceWelcomeMessageData);
TestThreadUtils.runOnUiThreadBlocking(() -> mRecyclerView.startShowing(false));
CriteriaHelper.pollUiThread(
() -> mRecyclerView.getVisibility() == View.VISIBLE && mFinishedShowing.get());
onView(withId(R.id.tab_grid_price_welcome_message_item)).check(matches(isDisplayed()));
assertFalse(dismissed.get());
onView(withId(R.id.close_button)).perform(click());
assertTrue(dismissed.get());
}
}
// Copyright 2020 The Chromium Authors. All rights reserved.
// 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.tasks.tab_management;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import androidx.test.filters.SmallTest;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.base.test.UiThreadTest;
import org.chromium.chrome.browser.tab.state.ShoppingPersistedTabData;
import org.chromium.chrome.tab_ui.R;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
import org.chromium.ui.test.util.DummyUiActivityTestCase;
import org.chromium.ui.widget.ButtonCompat;
import org.chromium.ui.widget.ChromeImageView;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* Tests for {@link PriceWelcomeMessageCardViewBinder}.
*/
@RunWith(ChromeJUnit4ClassRunner.class)
public class PriceWelcomeMessageCardViewBinderTest extends DummyUiActivityTestCase {
private static final String TITLE_TEXT = "titleText";
private static final String ACTION_TEXT = "actionText";
private static final String DESCRIPTION_TEXT = "descriptionText";
private static final String DISMISS_BUTTON_CONTENT_DESCRIPTION = "dismiss";
private static final String PRICE = "$300";
private static final String PREVIOUS_PRICE = "$400";
private final AtomicBoolean mReviewButtonClicked = new AtomicBoolean();
private final AtomicBoolean mDismissButtonClicked = new AtomicBoolean();
private final AtomicBoolean mMessageServiceReviewCallbackRan = new AtomicBoolean();
private final AtomicBoolean mMessageServiceDismissCallbackRan = new AtomicBoolean();
private final MessageCardView.ReviewActionProvider mUiReviewHandler =
() -> mReviewButtonClicked.set(true);
private final MessageCardView.DismissActionProvider mUiDismissHandler =
(int messageType) -> mDismissButtonClicked.set(true);
private final MessageCardView.ReviewActionProvider mMessageServiceActionHandler =
() -> mMessageServiceReviewCallbackRan.set(true);
private final MessageCardView.DismissActionProvider mMessageServiceDismissHandler =
(int messageType) -> mMessageServiceDismissCallbackRan.set(true);
private TextView mTitle;
private TextView mDescription;
private ButtonCompat mActionButton;
private ChromeImageView mCloseButton;
private ViewGroup mItemView;
private PropertyModel mItemViewModel;
private PropertyModelChangeProcessor mItemMCP;
@Override
public void setUpTest() throws Exception {
super.setUpTest();
ViewGroup view = new FrameLayout(getActivity());
TestThreadUtils.runOnUiThreadBlocking(() -> {
getActivity().setContentView(view);
mItemView = (ViewGroup) getActivity().getLayoutInflater().inflate(
R.layout.price_welcome_message_card_item, null);
view.addView(mItemView);
mTitle = mItemView.findViewById(R.id.title);
mDescription = mItemView.findViewById(R.id.content);
mActionButton = mItemView.findViewById(R.id.action_button);
mCloseButton = mItemView.findViewById(R.id.close_button);
mItemViewModel =
new PropertyModel.Builder(MessageCardViewProperties.ALL_KEYS)
.with(MessageCardViewProperties.TITLE_TEXT, TITLE_TEXT)
.with(MessageCardViewProperties.ACTION_TEXT, ACTION_TEXT)
.with(MessageCardViewProperties.DESCRIPTION_TEXT, DESCRIPTION_TEXT)
.with(MessageCardViewProperties.DISMISS_BUTTON_CONTENT_DESCRIPTION,
DISMISS_BUTTON_CONTENT_DESCRIPTION)
.with(MessageCardViewProperties.SHOULD_KEEP_AFTER_REVIEW, false)
.build();
mItemMCP = PropertyModelChangeProcessor.create(
mItemViewModel, mItemView, PriceWelcomeMessageCardViewBinder::bind);
});
}
@Test
@UiThreadTest
@SmallTest
public void testInitialBinding() {
assertEquals(TITLE_TEXT, mTitle.getText().toString());
assertEquals(ACTION_TEXT, mActionButton.getText().toString());
assertEquals(DESCRIPTION_TEXT, mDescription.getText().toString());
assertEquals(DISMISS_BUTTON_CONTENT_DESCRIPTION, mCloseButton.getContentDescription());
}
@Test
@UiThreadTest
@SmallTest
public void testSetPriceInfoBoxStrings() {
mItemViewModel.set(MessageCardViewProperties.PRICE_DROP,
new ShoppingPersistedTabData.PriceDrop(PRICE, PREVIOUS_PRICE));
assertEquals(PRICE,
((TextView) mItemView.findViewById(R.id.current_price)).getText().toString());
assertEquals(PREVIOUS_PRICE,
((TextView) mItemView.findViewById(R.id.previous_price)).getText().toString());
}
@Test
@UiThreadTest
@SmallTest
public void testBindingAndClickingReviewHandler() {
mReviewButtonClicked.set(false);
mMessageServiceReviewCallbackRan.set(false);
mDismissButtonClicked.set(false);
mItemViewModel.set(MessageCardViewProperties.UI_ACTION_PROVIDER, mUiReviewHandler);
mItemViewModel.set(MessageCardViewProperties.MESSAGE_SERVICE_ACTION_PROVIDER,
mMessageServiceActionHandler);
mItemViewModel.set(MessageCardViewProperties.UI_DISMISS_ACTION_PROVIDER, mUiDismissHandler);
mItemViewModel.set(MessageCardViewProperties.ACTION_TEXT, ACTION_TEXT);
mActionButton.performClick();
assertTrue(mReviewButtonClicked.get());
assertTrue(mMessageServiceReviewCallbackRan.get());
assertTrue(mDismissButtonClicked.get());
}
@Test
@UiThreadTest
@SmallTest
public void testBindingAndClickingDismissHandler() {
mDismissButtonClicked.set(false);
mMessageServiceDismissCallbackRan.set(false);
mItemViewModel.set(MessageCardViewProperties.UI_DISMISS_ACTION_PROVIDER, mUiDismissHandler);
mItemViewModel.set(MessageCardViewProperties.MESSAGE_SERVICE_DISMISS_ACTION_PROVIDER,
mMessageServiceDismissHandler);
mItemViewModel.set(MessageCardViewProperties.DISMISS_BUTTON_CONTENT_DESCRIPTION,
DISMISS_BUTTON_CONTENT_DESCRIPTION);
mCloseButton.performClick();
assertTrue(mDismissButtonClicked.get());
assertTrue(mMessageServiceDismissCallbackRan.get());
}
@Override
public void tearDownTest() throws Exception {
mItemMCP.destroy();
super.tearDownTest();
}
}
......@@ -43,6 +43,7 @@ import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.state.LevelDBPersistedTabDataStorage;
import org.chromium.chrome.browser.tab.state.LevelDBPersistedTabDataStorageJni;
import org.chromium.chrome.browser.tab.state.ShoppingPersistedTabData;
import org.chromium.chrome.browser.tab.state.ShoppingPersistedTabData.PriceDrop;
import org.chromium.chrome.tab_ui.R;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate;
......@@ -685,6 +686,8 @@ public class TabListViewHolderTest extends DummyUiActivityTestCase {
mGridModel.set(TabProperties.SHOPPING_PERSISTED_TAB_DATA_FETCHER, null);
PriceCardView priceCardView = mTabGridView.findViewById(R.id.price_info_box_outer);
Assert.assertEquals(View.GONE, priceCardView.getVisibility());
// TODO(crbug.com/1157578): Update the model in mediator.
Assert.assertNull(mGridModel.get(TabProperties.PRICE_DROP));
}
private void testPriceString(Tab tab, MockShoppingPersistedTabDataFetcher fetcher,
......@@ -701,6 +704,7 @@ public class TabListViewHolderTest extends DummyUiActivityTestCase {
Assert.assertEquals(expectedCurrentPrice, currentPrice.getText());
Assert.assertEquals(expectedPreviousPrice, previousPrice.getText());
}
Assert.assertEquals(fetcher.getPriceDrop(), mGridModel.get(TabProperties.PRICE_DROP));
}
static class MockShoppingPersistedTabData extends ShoppingPersistedTabData {
......@@ -740,6 +744,11 @@ public class TabListViewHolderTest extends DummyUiActivityTestCase {
mShoppingPersistedTabData = new MockShoppingPersistedTabData(mTab);
}
public PriceDrop getPriceDrop() {
if (mShoppingPersistedTabData == null) return null;
return ((MockShoppingPersistedTabData) mShoppingPersistedTabData).getPriceDrop();
}
@Override
public void fetch(Callback<ShoppingPersistedTabData> callback) {
callback.onResult(mShoppingPersistedTabData);
......
......@@ -46,6 +46,9 @@ public class MessageCardProviderMediatorUnitTest {
@Mock
private TabSuggestionMessageService.TabSuggestionMessageData mTabSuggestionMessageData;
@Mock
private PriceWelcomeMessageService.PriceWelcomeMessageData mPriceWelcomeMessageData;
@Mock
private Supplier<Boolean> mIsIncognitoSupplier;
......@@ -69,6 +72,13 @@ public class MessageCardProviderMediatorUnitTest {
when(mTabSuggestionMessageData.getReviewActionProvider()).thenReturn(() -> {});
mMediator.messageReady(type, mTabSuggestionMessageData);
break;
case MessageService.MessageType.PRICE_WELCOME:
when(mPriceWelcomeMessageData.getPriceDrop()).thenReturn(null);
when(mPriceWelcomeMessageData.getDismissActionProvider())
.thenReturn((messageType) -> {});
when(mPriceWelcomeMessageData.getReviewActionProvider()).thenReturn(() -> {});
mMediator.messageReady(type, mPriceWelcomeMessageData);
break;
default:
mMediator.messageReady(type, new MessageService.MessageData() {});
}
......@@ -294,6 +304,22 @@ public class MessageCardProviderMediatorUnitTest {
model.get(MessageCardViewProperties.DESCRIPTION_TEXT_TEMPLATE));
}
@Test
public void buildModel_ForPriceWelcome() {
String titleText = "Price drop spotted";
doReturn(titleText).when(mContext).getString(R.string.price_drop_spotted_title);
enqueueMessageItem(MessageService.MessageType.PRICE_WELCOME, -1);
PropertyModel model = mMediator.getReadyMessageItemsForTesting()
.get(MessageService.MessageType.PRICE_WELCOME)
.get(0)
.model;
Assert.assertEquals(MessageService.MessageType.PRICE_WELCOME,
model.get(MessageCardViewProperties.MESSAGE_TYPE));
Assert.assertEquals(titleText, model.get(MessageCardViewProperties.TITLE_TEXT));
}
@Test
public void getMessageItemsTest_UpdateIncognito() {
enqueueMessageItem(
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// 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.tasks.tab_management;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.junit.runner.RunWith;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.state.ShoppingPersistedTabData;
import org.chromium.chrome.browser.tasks.tab_management.MessageService.MessageType;
import org.chromium.chrome.browser.tasks.tab_management.PriceWelcomeMessageService.PriceTabData;
import org.chromium.chrome.test.util.browser.Features;
/**
* Unit tests for {@link PriceWelcomeMessageService}.
*/
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class PriceWelcomeMessageServiceUnitTest {
@Rule
public TestRule mProcessor = new Features.JUnitProcessor();
private static final int BINDING_TAB_ID = 456;
private static final int INITIAL_SHOW_COUNT = 0;
private static final int MAX_SHOW_COUNT = 20;
private static final String PRICE = "$300";
private static final String PREVIOUS_PRICE = "$400";
@Mock
PriceWelcomeMessageService.PriceWelcomeMessageProvider mMessageProvider;
@Mock
PriceWelcomeMessageService.PriceWelcomeMessageReviewActionProvider mReviewActionProvider;
@Mock
MessageService.MessageObserver mMessageObserver;
private PriceWelcomeMessageService mMessageService;
private PriceTabData mPriceTabData;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mPriceTabData = new PriceTabData(
BINDING_TAB_ID, new ShoppingPersistedTabData.PriceDrop(PRICE, PREVIOUS_PRICE));
doReturn(mPriceTabData).when(mMessageProvider).getFirstTabShowingPriceCard();
doNothing().when(mMessageObserver).messageReady(anyInt(), any());
doNothing().when(mMessageObserver).messageInvalidate(anyInt());
PriceTrackingUtilities.SHARED_PREFERENCES_MANAGER.writeBoolean(
PriceTrackingUtilities.PRICE_WELCOME_MESSAGE_CARD, true);
PriceTrackingUtilities.SHARED_PREFERENCES_MANAGER.writeInt(
PriceTrackingUtilities.PRICE_WELCOME_MESSAGE_CARD_SHOW_COUNT, INITIAL_SHOW_COUNT);
assertFalse(PriceTrackingUtilities.isPriceWelcomeMessageCardDisabled());
mMessageService = new PriceWelcomeMessageService(mMessageProvider, mReviewActionProvider);
mMessageService.addObserver(mMessageObserver);
}
@Test
public void testPrepareMessage_messageCardDisabled() {
PriceTrackingUtilities.SHARED_PREFERENCES_MANAGER.writeBoolean(
PriceTrackingUtilities.PRICE_WELCOME_MESSAGE_CARD, false);
mMessageService.preparePriceMessage();
verify(mMessageProvider, times(0)).getFirstTabShowingPriceCard();
PriceTrackingUtilities.SHARED_PREFERENCES_MANAGER.writeBoolean(
PriceTrackingUtilities.PRICE_WELCOME_MESSAGE_CARD, true);
mMessageService.preparePriceMessage();
verify(mMessageProvider, times(1)).getFirstTabShowingPriceCard();
}
@Test
public void testPrepareMessage_noTabShowingPriceCard() {
doReturn(null).when(mMessageProvider).getFirstTabShowingPriceCard();
mMessageService.preparePriceMessage();
assertNull(mMessageService.getPriceTabDataForTesting());
verify(mMessageObserver, times(1)).messageInvalidate(eq(MessageType.PRICE_WELCOME));
assertEquals(
INITIAL_SHOW_COUNT, PriceTrackingUtilities.getPriceWelcomeMessageCardShowCount());
}
@Test
public void testPrepareMessage_exceedMaxShowCount() {
PriceTrackingUtilities.SHARED_PREFERENCES_MANAGER.writeInt(
PriceTrackingUtilities.PRICE_WELCOME_MESSAGE_CARD_SHOW_COUNT, MAX_SHOW_COUNT);
mMessageService.preparePriceMessage();
assertEquals(
MAX_SHOW_COUNT + 1, PriceTrackingUtilities.getPriceWelcomeMessageCardShowCount());
assertNull(mMessageService.getPriceTabDataForTesting());
verify(mMessageObserver, times(1)).messageInvalidate(eq(MessageType.PRICE_WELCOME));
assertTrue(PriceTrackingUtilities.isPriceWelcomeMessageCardDisabled());
}
@Test
public void testPrepareMessage_hasTabShowingPriceCard() {
doReturn(mPriceTabData).when(mMessageProvider).getFirstTabShowingPriceCard();
InOrder inOrder = Mockito.inOrder(mMessageObserver);
mMessageService.preparePriceMessage();
assertEquals(mPriceTabData, mMessageService.getPriceTabDataForTesting());
inOrder.verify(mMessageObserver, times(1)).messageInvalidate(eq(MessageType.PRICE_WELCOME));
inOrder.verify(mMessageObserver, times(1))
.messageReady(eq(MessageService.MessageType.PRICE_WELCOME),
any(PriceWelcomeMessageService.PriceWelcomeMessageData.class));
// We sendAvailabilityNotification only if the newly obtained priceTabData is different from
// currently existing priceTabData.
mMessageService.preparePriceMessage();
assertEquals(mPriceTabData, mMessageService.getPriceTabDataForTesting());
verify(mMessageObserver, times(1)).messageInvalidate(eq(MessageType.PRICE_WELCOME));
verify(mMessageObserver, times(1))
.messageReady(eq(MessageType.PRICE_WELCOME),
any(PriceWelcomeMessageService.PriceWelcomeMessageData.class));
PriceTabData priceTabData = new PriceTabData(
BINDING_TAB_ID + 1, new ShoppingPersistedTabData.PriceDrop(PRICE, PREVIOUS_PRICE));
doReturn(priceTabData).when(mMessageProvider).getFirstTabShowingPriceCard();
mMessageService.preparePriceMessage();
assertEquals(priceTabData, mMessageService.getPriceTabDataForTesting());
verify(mMessageObserver, times(2)).messageInvalidate(eq(MessageType.PRICE_WELCOME));
verify(mMessageObserver, times(2))
.messageReady(eq(MessageType.PRICE_WELCOME),
any(PriceWelcomeMessageService.PriceWelcomeMessageData.class));
}
@Test
public void testReview() {
int index = 1;
doReturn(index).when(mMessageProvider).getTabIndexFromTabId(BINDING_TAB_ID);
doNothing().when(mReviewActionProvider).scrollToBindingTab(anyInt());
mMessageService.preparePriceMessage();
mMessageService.review();
verify(mReviewActionProvider).scrollToBindingTab(index);
assertTrue(PriceTrackingUtilities.isPriceWelcomeMessageCardDisabled());
}
@Test
public void testDismiss() {
mMessageService.dismiss();
assertTrue(PriceTrackingUtilities.isPriceWelcomeMessageCardDisabled());
}
@Test
public void testGetBindingTabId() {
assertEquals(Tab.INVALID_TAB_ID, mMessageService.getBindingTabId());
mMessageService.preparePriceMessage();
assertEquals(BINDING_TAB_ID, mMessageService.getBindingTabId());
}
@Test
public void testInvalidateMessage() {
mMessageService.preparePriceMessage();
assertEquals(mPriceTabData, mMessageService.getPriceTabDataForTesting());
verify(mMessageObserver, times(1)).messageInvalidate(eq(MessageType.PRICE_WELCOME));
mMessageService.invalidateMessage();
assertNull(mMessageService.getPriceTabDataForTesting());
verify(mMessageObserver, times(2)).messageInvalidate(eq(MessageType.PRICE_WELCOME));
}
}
......@@ -783,6 +783,36 @@ public class TabGridItemTouchHelperCallbackUnitTest {
mItemTouchHelperCallback.onMove(mRecyclerView, mMockViewHolder1, mMockViewHolder2);
}
@Test
public void priceWelcomeMessageItemNotDraggable() {
when(mMockViewHolder1.getItemViewType()).thenReturn(TabProperties.UiType.PRICE_WELCOME);
setupItemTouchHelperCallback(false);
assertFalse(
mItemTouchHelperCallback.hasDragFlagForTesting(mRecyclerView, mMockViewHolder1));
}
@Test
public void priceWelcomeMessageItemSwipeable() {
when(mMockViewHolder1.getItemViewType()).thenReturn(TabProperties.UiType.PRICE_WELCOME);
setupItemTouchHelperCallback(false);
assertTrue(mItemTouchHelperCallback.hasSwipeFlag(mRecyclerView, mMockViewHolder1));
}
@Test
public void priceWelcomeMessageItemNotDropable() {
when(mMockViewHolder1.getItemViewType()).thenReturn(TabProperties.UiType.PRICE_WELCOME);
setupItemTouchHelperCallback(false);
assertFalse(mItemTouchHelperCallback.canDropOver(
mRecyclerView, mMockViewHolder2, mMockViewHolder1));
}
@Test(expected = AssertionError.class)
public void priceWelcomeMessageItemOnMoveFail() {
when(mMockViewHolder1.getItemViewType()).thenReturn(TabProperties.UiType.PRICE_WELCOME);
setupItemTouchHelperCallback(false);
mItemTouchHelperCallback.onMove(mRecyclerView, mMockViewHolder1, mMockViewHolder2);
}
private void verifyDrag(
RecyclerView.ViewHolder viewHolder, float dX, float dY, int targetIndex, int status) {
// Simulate the process of dragging one card to a position.
......
......@@ -39,6 +39,7 @@ import static org.chromium.chrome.browser.flags.ChromeFeatureList.TAB_GROUPS_AND
import static org.chromium.chrome.browser.flags.ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID;
import static org.chromium.chrome.browser.tasks.tab_management.MessageCardViewProperties.MESSAGE_TYPE;
import static org.chromium.chrome.browser.tasks.tab_management.MessageService.MessageType.FOR_TESTING;
import static org.chromium.chrome.browser.tasks.tab_management.MessageService.MessageType.PRICE_WELCOME;
import static org.chromium.chrome.browser.tasks.tab_management.MessageService.MessageType.TAB_SUGGESTION;
import static org.chromium.chrome.browser.tasks.tab_management.TabListModel.CardProperties.CARD_TYPE;
import static org.chromium.chrome.browser.tasks.tab_management.TabListModel.CardProperties.ModelType.MESSAGE;
......@@ -106,6 +107,7 @@ import org.chromium.chrome.browser.tab.TabSelectionType;
import org.chromium.chrome.browser.tab.state.CriticalPersistedTabData;
import org.chromium.chrome.browser.tab.state.PersistedTabDataConfiguration;
import org.chromium.chrome.browser.tab.state.ShoppingPersistedTabData;
import org.chromium.chrome.browser.tab.state.ShoppingPersistedTabData.PriceDrop;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelFilter;
import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabModelFilter;
......@@ -1526,6 +1528,41 @@ public class TabListMediatorUnitTest {
assertEquals(0, mModel.size());
}
@Test
public void removeSpecialItem_Message_PriceWelcome() {
PropertyModel model = mock(PropertyModel.class);
int expectedMessageType = PRICE_WELCOME;
int wrongMessageType = TAB_SUGGESTION;
when(model.get(CARD_TYPE)).thenReturn(MESSAGE);
when(model.get(MESSAGE_TYPE)).thenReturn(expectedMessageType);
mMediator.addSpecialItemToModel(0, TabProperties.UiType.PRICE_WELCOME, model);
assertEquals(1, mModel.size());
mMediator.removeSpecialItemFromModel(TabProperties.UiType.MESSAGE, wrongMessageType);
assertEquals(1, mModel.size());
mMediator.removeSpecialItemFromModel(
TabProperties.UiType.PRICE_WELCOME, expectedMessageType);
assertEquals(0, mModel.size());
}
@Test
public void testGetFirstTabShowingPriceCard() {
initAndAssertAllProperties();
mModel.get(0).model.set(TabProperties.PRICE_DROP, null);
mModel.get(1).model.set(TabProperties.PRICE_DROP, null);
assertNull(mModel.getFirstTabShowingPriceCard());
PriceDrop priceDrop1 = new PriceDrop("$1", "$2");
PriceDrop priceDrop2 = new PriceDrop("$3", "$4");
mModel.get(1).model.set(TabProperties.PRICE_DROP, priceDrop2);
assertEquals(TAB2_ID, mModel.getFirstTabShowingPriceCard().bindingTabId);
assertEquals(priceDrop2, mModel.getFirstTabShowingPriceCard().priceDrop);
mModel.get(0).model.set(TabProperties.PRICE_DROP, priceDrop1);
assertEquals(TAB1_ID, mModel.getFirstTabShowingPriceCard().bindingTabId);
assertEquals(priceDrop1, mModel.getFirstTabShowingPriceCard().priceDrop);
}
@Test
@Features.DisableFeatures({TAB_GROUPS_ANDROID})
public void testUrlUpdated_forSingleTab_GTS_GroupNotEnabled() {
......
......@@ -129,6 +129,8 @@ public class TabSwitcherMediatorUnitTest {
TabSwitcherMediator.PriceWelcomeMessageController mPriceWelcomeMessageController;
@Mock
MultiWindowModeStateDispatcher mMultiWindowModeStateDispatcher;
@Mock
PriceWelcomeMessageService mPriceWelcomeMessageService;
@Captor
ArgumentCaptor<TabModelObserver> mTabModelObserverCaptor;
......@@ -558,6 +560,59 @@ public class TabSwitcherMediatorUnitTest {
verify(mMessageItemsController).restoreAllAppendedMessage();
}
@Test
public void removePriceWelcomeMessageWhenCloseBindingTab() {
mMediator.setPriceWelcomeMessageService(mPriceWelcomeMessageService);
doReturn(1).when(mTabModel).getCount();
doReturn(TAB1_ID).when(mPriceWelcomeMessageService).getBindingTabId();
mTabModelObserverCaptor.getValue().willCloseTab(mTab1, false);
verify(mPriceWelcomeMessageController, times(0)).removePriceWelcomeMessage();
doReturn(2).when(mTabModel).getCount();
doReturn(TAB2_ID).when(mPriceWelcomeMessageService).getBindingTabId();
mTabModelObserverCaptor.getValue().willCloseTab(mTab1, false);
verify(mPriceWelcomeMessageController, times(0)).removePriceWelcomeMessage();
doReturn(2).when(mTabModel).getCount();
doReturn(TAB1_ID).when(mPriceWelcomeMessageService).getBindingTabId();
mTabModelObserverCaptor.getValue().willCloseTab(mTab1, false);
verify(mPriceWelcomeMessageController, times(1)).removePriceWelcomeMessage();
}
@Test
public void restorePriceWelcomeMessageWhenUndoBindingTabClosure() {
mMediator.setPriceWelcomeMessageService(mPriceWelcomeMessageService);
doReturn(1).when(mTabModel).getCount();
doReturn(TAB1_ID).when(mPriceWelcomeMessageService).getBindingTabId();
mTabModelObserverCaptor.getValue().tabClosureUndone(mTab1);
verify(mPriceWelcomeMessageController, times(0)).restorePriceWelcomeMessage();
doReturn(2).when(mTabModel).getCount();
doReturn(TAB2_ID).when(mPriceWelcomeMessageService).getBindingTabId();
mTabModelObserverCaptor.getValue().tabClosureUndone(mTab1);
verify(mPriceWelcomeMessageController, times(0)).restorePriceWelcomeMessage();
doReturn(2).when(mTabModel).getCount();
doReturn(TAB1_ID).when(mPriceWelcomeMessageService).getBindingTabId();
mTabModelObserverCaptor.getValue().tabClosureUndone(mTab1);
verify(mPriceWelcomeMessageController, times(1)).restorePriceWelcomeMessage();
}
@Test
public void invalidatePriceWelcomeMessageWhenBindingTabClosureCommitted() {
mMediator.setPriceWelcomeMessageService(mPriceWelcomeMessageService);
doReturn(TAB2_ID).when(mPriceWelcomeMessageService).getBindingTabId();
mTabModelObserverCaptor.getValue().tabClosureCommitted(mTab1);
verify(mPriceWelcomeMessageService, times(0)).invalidateMessage();
doReturn(TAB1_ID).when(mPriceWelcomeMessageService).getBindingTabId();
mTabModelObserverCaptor.getValue().tabClosureCommitted(mTab1);
verify(mPriceWelcomeMessageService, times(1)).invalidateMessage();
}
@Test
public void showOverviewDoesNotUpdateResetHandlerBeforeRestoreCompleted() {
initAndAssertAllProperties();
......
......@@ -37,6 +37,7 @@ tab_management_test_java_sources = [
"//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/ConditionalTabStripTest.java",
"//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderTest.java",
"//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardViewBinderTest.java",
"//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/PriceWelcomeMessageCardViewBinderTest.java",
"//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/RecyclerViewMatcherUtils.java",
"//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java",
"//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java",
......@@ -68,6 +69,7 @@ tab_management_junit_java_sources = [
"//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupUtilsUnitTest.java",
"//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ConditionalTabStripUtilsUnitTest.java",
"//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderMediatorUnitTest.java",
"//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/PriceWelcomeMessageServiceUnitTest.java",
"//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediatorUnitTest.java",
"//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java",
"//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupTitleEditorUnitTest.java",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment