blob: f0066483420c89e901dd0ebe5f7c66e392648560 [file] [log] [blame]
// Copyright 2018 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.autofill_assistant;
import static org.mockito.Mockito.inOrder;
import android.content.Intent;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.MediumTest;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.chromium.base.PathUtils;
import org.chromium.base.ThreadUtils;
import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.base.library_loader.LibraryProcessType;
import org.chromium.base.test.util.UrlUtils;
import org.chromium.chrome.autofill_assistant.R;
import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChip;
import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChipType;
import org.chromium.chrome.browser.autofill_assistant.details.AssistantDetails;
import org.chromium.chrome.browser.autofill_assistant.details.AssistantDetailsModel;
import org.chromium.chrome.browser.autofill_assistant.header.AssistantHeaderModel;
import org.chromium.chrome.browser.customtabs.CustomTabActivity;
import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
import org.chromium.chrome.browser.firstrun.FirstRunStatus;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.net.test.EmbeddedTestServer;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;
/**
* Instrumentation tests for autofill assistant UI.
*/
@RunWith(ChromeJUnit4ClassRunner.class)
public class AutofillAssistantUiTest {
private String mTestPage;
private EmbeddedTestServer mTestServer;
@Rule
public MockitoRule mMockitoRule = MockitoJUnit.rule();
@Mock
public AssistantCoordinator.Delegate mCoordinatorDelegateMock;
@Mock
public Runnable mRunnableMock;
@Rule
public CustomTabActivityTestRule mCustomTabActivityTestRule = new CustomTabActivityTestRule();
@Before
public void setUp() throws Exception {
ThreadUtils.runOnUiThreadBlocking(() -> FirstRunStatus.setFirstRunFlowComplete(true));
mTestServer = EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext());
mTestPage = mTestServer.getURL(UrlUtils.getIsolatedTestFilePath(
"components/test/data/autofill_assistant/autofill_assistant_target_website.html"));
PathUtils.setPrivateDataDirectorySuffix("chrome");
LibraryLoader.getInstance().ensureInitialized(LibraryProcessType.PROCESS_BROWSER);
}
@After
public void tearDown() throws Exception {
ThreadUtils.runOnUiThreadBlocking(() -> FirstRunStatus.setFirstRunFlowComplete(false));
mTestServer.stopAndDestroyServer();
}
/**
* @see CustomTabsTestUtils#createMinimalCustomTabIntent(Context, String).
*/
private Intent createMinimalCustomTabIntent() {
return CustomTabsTestUtils.createMinimalCustomTabIntent(
InstrumentationRegistry.getTargetContext(), mTestPage);
}
private View findViewByIdInMainCoordinator(int id) {
return getActivity().findViewById(R.id.coordinator).findViewById(id);
}
private CustomTabActivity getActivity() {
return mCustomTabActivityTestRule.getActivity();
}
// TODO(crbug.com/806868): Add more UI details test and check, like payment request UI,
// highlight chips and so on.
@Test
@MediumTest
public void testStartAndAccept() throws Exception {
InOrder inOrder = inOrder(mRunnableMock);
mCustomTabActivityTestRule.startCustomTabActivityWithIntent(createMinimalCustomTabIntent());
AssistantCoordinator assistantCoordinator = ThreadUtils.runOnUiThreadBlocking(
() -> new AssistantCoordinator(getActivity(), mCoordinatorDelegateMock));
// Bottom sheet is shown when creating the AssistantCoordinator.
View bottomSheet = findViewByIdInMainCoordinator(R.id.autofill_assistant);
Assert.assertTrue(bottomSheet.isShown());
// Show onboarding.
ThreadUtils.runOnUiThreadBlocking(() -> assistantCoordinator.showOnboarding(mRunnableMock));
View onboardingView = bottomSheet.findViewById(R.id.assistant_onboarding);
Assert.assertNotNull(onboardingView);
View initOkButton = onboardingView.findViewById(R.id.button_init_ok);
Assert.assertNotNull(initOkButton);
ThreadUtils.runOnUiThreadBlocking(() -> { initOkButton.performClick(); });
ThreadUtils.runOnUiThreadBlocking(() -> inOrder.verify(mRunnableMock).run());
// Show and check status message.
String testStatusMessage = "test message";
ThreadUtils.runOnUiThreadBlocking(
()
-> assistantCoordinator.getModel().getHeaderModel().set(
AssistantHeaderModel.STATUS_MESSAGE, testStatusMessage));
TextView statusMessageView = bottomSheet.findViewById(R.id.status_message);
Assert.assertEquals(statusMessageView.getText(), testStatusMessage);
// Show overlay.
ThreadUtils.runOnUiThreadBlocking(
() -> assistantCoordinator.getOverlayCoordinator().showFullOverlay());
View overlay = bottomSheet.findViewById(R.id.touch_event_filter);
Assert.assertTrue(overlay.isShown());
// Show chips.
List<AssistantChip> chips = Arrays.asList(
new AssistantChip(
AssistantChipType.CHIP_ASSISTIVE, "chip 0", () -> {/* do nothing */}),
new AssistantChip(AssistantChipType.CHIP_ASSISTIVE, "chip 1", mRunnableMock));
ThreadUtils.runOnUiThreadBlocking(
()
-> assistantCoordinator.getModel().getCarouselModel().getChipsModel().set(
chips));
RecyclerView chipsViewContainer =
assistantCoordinator.getBottomBarCoordinator().getCarouselCoordinator().getView();
Assert.assertEquals(2, chipsViewContainer.getAdapter().getItemCount());
// Choose the second chip.
ThreadUtils.runOnUiThreadBlocking(
() -> { chipsViewContainer.getChildAt(1).performClick(); });
inOrder.verify(mRunnableMock).run();
// Show movie details.
String movieTitle = "testTitle";
String movieDescription = "This is a fancy test movie";
ThreadUtils.runOnUiThreadBlocking(
()
-> assistantCoordinator.getModel().getDetailsModel().set(
AssistantDetailsModel.DETAILS,
new AssistantDetails(movieTitle, /* url = */ "",
Calendar.getInstance().getTime(), movieDescription,
/* mId = */ "",
/* price = */ null,
/* userApprovalRequired= */ false,
/* highlightTitle= */ false, /* highlightDate= */
false, /* showPlaceholdersForEmptyFields= */ false)));
TextView detailsTitle = (TextView) bottomSheet.findViewById(R.id.details_title);
TextView detailsText = (TextView) bottomSheet.findViewById(R.id.details_text);
Assert.assertEquals(detailsTitle.getText(), movieTitle);
Assert.assertTrue(detailsText.getText().toString().contains(movieDescription));
// Progress bar must be shown.
Assert.assertTrue(bottomSheet.findViewById(R.id.progress_bar).isShown());
// Click 'X' button runs the AssistantHeaderModel.CLOSE_BUTTON_CALLBACK.
AssistantHeaderModel headerModel = assistantCoordinator.getModel().getHeaderModel();
headerModel.set(AssistantHeaderModel.CLOSE_BUTTON_CALLBACK, mRunnableMock);
ThreadUtils.runOnUiThreadBlocking(
() -> { bottomSheet.findViewById(R.id.close_button).performClick(); });
inOrder.verify(mRunnableMock).run();
}
}