blob: 70d518d736ddecf5deba0c4c08cf44677f1fb68f [file] [log] [blame]
// Copyright 2019 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;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.FAKE_SEARCH_BOX_CLICK_LISTENER;
import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.FAKE_SEARCH_BOX_TEXT_WATCHER;
import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.INCOGNITO_COOKIE_CONTROLS_MANAGER;
import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.INCOGNITO_LEARN_MORE_CLICK_LISTENER;
import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.IS_FAKE_SEARCH_BOX_VISIBLE;
import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.IS_INCOGNITO_DESCRIPTION_INITIALIZED;
import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.IS_INCOGNITO_DESCRIPTION_VISIBLE;
import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.IS_TAB_CAROUSEL_VISIBLE;
import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.IS_VOICE_RECOGNITION_BUTTON_VISIBLE;
import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.VOICE_SEARCH_BUTTON_CLICK_LISTENER;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.chrome.browser.ntp.FakeboxDelegate;
import org.chromium.chrome.browser.ntp.IncognitoCookieControlsManager;
import org.chromium.chrome.browser.omnibox.LocationBar;
import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler;
import org.chromium.ui.modelutil.PropertyModel;
/** Tests for {@link TasksSurfaceMediator}. */
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class TasksSurfaceMediatorUnitTest {
private TasksSurfaceMediator mMediator;
@Mock
private PropertyModel mPropertyModel;
@Mock
private FakeboxDelegate mFakeboxDelegate;
@Mock
private VoiceRecognitionHandler mVoiceRecognitionHandler;
@Mock
private View.OnClickListener mLearnMoreOnClickListener;
@Mock
private IncognitoCookieControlsManager mCookieControlsManager;
@Captor
private ArgumentCaptor<View.OnClickListener> mFakeboxClickListenerCaptor;
@Captor
private ArgumentCaptor<TextWatcher> mFakeboxTextWatcherCaptor;
@Captor
private ArgumentCaptor<View.OnClickListener> mVoiceSearchButtonClickListenerCaptor;
@Captor
private ArgumentCaptor<View.OnClickListener> mLearnMoreOnClickListenerCaptor;
@Captor
private ArgumentCaptor<IncognitoCookieControlsManager> mCookieControlsManagerCaptor;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mMediator = new TasksSurfaceMediator(
mPropertyModel, mLearnMoreOnClickListener, mCookieControlsManager, true);
mMediator.initWithNative(mFakeboxDelegate);
}
@After
public void tearDown() {
mMediator = null;
}
@Test
public void initialization() {
verify(mPropertyModel).set(eq(IS_TAB_CAROUSEL_VISIBLE), eq(true));
verify(mPropertyModel)
.set(eq(FAKE_SEARCH_BOX_CLICK_LISTENER), mFakeboxClickListenerCaptor.capture());
verify(mPropertyModel)
.set(eq(FAKE_SEARCH_BOX_TEXT_WATCHER), mFakeboxTextWatcherCaptor.capture());
verify(mPropertyModel)
.set(eq(VOICE_SEARCH_BUTTON_CLICK_LISTENER),
mVoiceSearchButtonClickListenerCaptor.capture());
verify(mPropertyModel).set(eq(IS_FAKE_SEARCH_BOX_VISIBLE), eq(true));
verify(mPropertyModel).set(eq(IS_VOICE_RECOGNITION_BUTTON_VISIBLE), eq(false));
verify(mPropertyModel)
.set(eq(INCOGNITO_COOKIE_CONTROLS_MANAGER), mCookieControlsManagerCaptor.capture());
verify(mPropertyModel)
.set(eq(INCOGNITO_LEARN_MORE_CLICK_LISTENER),
mLearnMoreOnClickListenerCaptor.capture());
assertEquals(mLearnMoreOnClickListener, mLearnMoreOnClickListenerCaptor.getValue());
assertFalse(mPropertyModel.get(IS_INCOGNITO_DESCRIPTION_VISIBLE));
assertFalse(mPropertyModel.get(IS_INCOGNITO_DESCRIPTION_INITIALIZED));
}
@Test
public void clickFakebox() {
verify(mPropertyModel)
.set(eq(FAKE_SEARCH_BOX_CLICK_LISTENER), mFakeboxClickListenerCaptor.capture());
mFakeboxClickListenerCaptor.getValue().onClick(null);
verify(mFakeboxDelegate, times(1))
.setUrlBarFocus(eq(true), eq(null),
eq(LocationBar.OmniboxFocusReason.TASKS_SURFACE_FAKE_BOX_TAP));
}
@Test
public void longPressFakebox() {
verify(mPropertyModel)
.set(eq(FAKE_SEARCH_BOX_TEXT_WATCHER), mFakeboxTextWatcherCaptor.capture());
String inputText = "test";
Editable editable = Editable.Factory.getInstance().newEditable(inputText);
mFakeboxTextWatcherCaptor.getValue().afterTextChanged(editable);
verify(mFakeboxDelegate, times(1))
.setUrlBarFocus(eq(true), eq(inputText),
eq(LocationBar.OmniboxFocusReason.TASKS_SURFACE_FAKE_BOX_LONG_PRESS));
assertThat(editable.length(), equalTo(0));
}
@Test
public void longPressFakeboxWithEmptyText() {
verify(mPropertyModel)
.set(eq(FAKE_SEARCH_BOX_TEXT_WATCHER), mFakeboxTextWatcherCaptor.capture());
// Shouldn't call setUrlBarFocus if the input text is empty.
Editable editable = Editable.Factory.getInstance().newEditable("");
mFakeboxTextWatcherCaptor.getValue().afterTextChanged(editable);
verify(mFakeboxDelegate, never())
.setUrlBarFocus(eq(true), eq(""),
eq(LocationBar.OmniboxFocusReason.TASKS_SURFACE_FAKE_BOX_LONG_PRESS));
}
@Test
public void clickVoiceRecognitionButton() {
verify(mPropertyModel)
.set(eq(VOICE_SEARCH_BUTTON_CLICK_LISTENER),
mVoiceSearchButtonClickListenerCaptor.capture());
doReturn(mVoiceRecognitionHandler).when(mFakeboxDelegate).getVoiceRecognitionHandler();
mVoiceSearchButtonClickListenerCaptor.getValue().onClick(null);
verify(mVoiceRecognitionHandler, times(1))
.startVoiceRecognition(
eq(VoiceRecognitionHandler.VoiceInteractionSource.TASKS_SURFACE));
}
}