| // 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.autofill_assistant; |
| |
| import static androidx.test.espresso.Espresso.onView; |
| import static androidx.test.espresso.assertion.ViewAssertions.matches; |
| import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; |
| import static androidx.test.espresso.matcher.ViewMatchers.withText; |
| |
| import static org.hamcrest.CoreMatchers.is; |
| import static org.hamcrest.CoreMatchers.not; |
| import static org.hamcrest.CoreMatchers.nullValue; |
| import static org.junit.Assert.assertThat; |
| |
| import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.hasTypefaceSpan; |
| |
| import android.graphics.Bitmap; |
| import android.graphics.BitmapFactory; |
| import android.graphics.Typeface; |
| import android.support.test.InstrumentationRegistry; |
| import android.widget.TextView; |
| |
| import androidx.test.filters.MediumTest; |
| |
| import org.junit.Before; |
| import org.junit.Rule; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| |
| import org.chromium.base.test.util.CommandLineFlags; |
| import org.chromium.chrome.autofill_assistant.R; |
| import org.chromium.chrome.browser.autofill_assistant.infobox.AssistantInfoBox; |
| import org.chromium.chrome.browser.autofill_assistant.infobox.AssistantInfoBoxCoordinator; |
| import org.chromium.chrome.browser.autofill_assistant.infobox.AssistantInfoBoxModel; |
| import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; |
| import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils; |
| import org.chromium.chrome.browser.flags.ChromeSwitches; |
| import org.chromium.chrome.test.ChromeJUnit4ClassRunner; |
| import org.chromium.content_public.browser.test.util.TestThreadUtils; |
| |
| /** |
| * Tests for the Autofill Assistant infobox. |
| */ |
| @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) |
| @RunWith(ChromeJUnit4ClassRunner.class) |
| public class AutofillAssistantInfoBoxUiTest { |
| @Rule |
| public CustomTabActivityTestRule mTestRule = new CustomTabActivityTestRule(); |
| |
| private TextView getExplanationView(AssistantInfoBoxCoordinator coordinator) { |
| return coordinator.getView().findViewById(R.id.info_box_explanation); |
| } |
| |
| /** Creates a coordinator for use in UI tests, and adds it to the global view hierarchy. */ |
| private AssistantInfoBoxCoordinator createCoordinator(AssistantInfoBoxModel model) |
| throws Exception { |
| AssistantInfoBoxCoordinator coordinator = TestThreadUtils.runOnUiThreadBlocking(() -> { |
| Bitmap testImage = BitmapFactory.decodeResource( |
| mTestRule.getActivity().getResources(), R.drawable.btn_close); |
| |
| return new AssistantInfoBoxCoordinator(InstrumentationRegistry.getTargetContext(), |
| model, new AutofillAssistantUiTestUtil.MockImageFetcher(testImage, null)); |
| }); |
| |
| TestThreadUtils.runOnUiThreadBlocking( |
| () |
| -> AutofillAssistantUiTestUtil.attachToCoordinator( |
| mTestRule.getActivity(), coordinator.getView())); |
| return coordinator; |
| } |
| |
| @Before |
| public void setUp() { |
| mTestRule.startCustomTabActivityWithIntent(CustomTabsTestUtils.createMinimalCustomTabIntent( |
| InstrumentationRegistry.getTargetContext(), "about:blank")); |
| } |
| |
| /** Tests assumptions about the initial state of the infobox. */ |
| @Test |
| @MediumTest |
| public void testInitialState() throws Exception { |
| AssistantInfoBoxModel model = new AssistantInfoBoxModel(); |
| AssistantInfoBoxCoordinator coordinator = createCoordinator(model); |
| |
| assertThat(model.get(AssistantInfoBoxModel.INFO_BOX), nullValue()); |
| onView(is(coordinator.getView())).check(matches(not(isDisplayed()))); |
| } |
| |
| /** Tests for an infobox with a message, but without an image. */ |
| @Test |
| @MediumTest |
| public void testMessageNoImage() throws Exception { |
| AssistantInfoBoxModel model = new AssistantInfoBoxModel(); |
| AssistantInfoBoxCoordinator coordinator = createCoordinator(model); |
| AssistantInfoBox infoBox = new AssistantInfoBox("", "Message"); |
| |
| TestThreadUtils.runOnUiThreadBlocking( |
| () -> model.set(AssistantInfoBoxModel.INFO_BOX, infoBox)); |
| onView(is(coordinator.getView())).check(matches(isDisplayed())); |
| // Image should not be set. |
| assertThat(getExplanationView(coordinator).getCompoundDrawables()[1], nullValue()); |
| onView(is(getExplanationView(coordinator))).check(matches(withText("Message"))); |
| |
| // Test that info message supports typeface span. |
| AssistantInfoBox boldInfoBox = new AssistantInfoBox("", "<b>Message</b>"); |
| TestThreadUtils.runOnUiThreadBlocking( |
| () -> model.set(AssistantInfoBoxModel.INFO_BOX, boldInfoBox)); |
| onView(is(getExplanationView(coordinator))).check(matches(withText("Message"))); |
| onView(withText("Message")) |
| .check(matches(hasTypefaceSpan(0, "Message".length() - 1, Typeface.BOLD))); |
| } |
| |
| /** Tests for an infobox with message and image. */ |
| @Test |
| @MediumTest |
| public void testImage() throws Exception { |
| AssistantInfoBoxModel model = new AssistantInfoBoxModel(); |
| AssistantInfoBoxCoordinator coordinator = createCoordinator(model); |
| AssistantInfoBox infoBox = new AssistantInfoBox("x", "Message"); |
| |
| TestThreadUtils.runOnUiThreadBlocking( |
| () -> model.set(AssistantInfoBoxModel.INFO_BOX, infoBox)); |
| onView(is(getExplanationView(coordinator))).check(matches(isDisplayed())); |
| // Image should be set. |
| assertThat(getExplanationView(coordinator).getCompoundDrawables()[1], not(nullValue())); |
| onView(is(getExplanationView(coordinator))).check(matches(withText("Message"))); |
| } |
| |
| @Test |
| @MediumTest |
| public void testVisibility() throws Exception { |
| AssistantInfoBoxModel model = new AssistantInfoBoxModel(); |
| AssistantInfoBoxCoordinator coordinator = createCoordinator(model); |
| AssistantInfoBox infoBox = new AssistantInfoBox("", ""); |
| |
| TestThreadUtils.runOnUiThreadBlocking( |
| () -> model.set(AssistantInfoBoxModel.INFO_BOX, infoBox)); |
| onView(is(coordinator.getView())).check(matches(isDisplayed())); |
| |
| TestThreadUtils.runOnUiThreadBlocking( |
| () -> model.set(AssistantInfoBoxModel.INFO_BOX, null)); |
| onView(is(coordinator.getView())).check(matches(not(isDisplayed()))); |
| } |
| } |