Commit 1d0229fa authored by Hesen Zhang's avatar Hesen Zhang Committed by Commit Bot

Added rename UI test

Bug: 1021767
Change-Id: Icabdc3ca2bf7400af03c255324f9f9935b9078bc
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1900355
Commit-Queue: Hesen Zhang <hesen@chromium.org>
Auto-Submit: Hesen Zhang <hesen@chromium.org>
Reviewed-by: default avatarShakti Sahu <shaktisahu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#714038}
parent 52192177
......@@ -8,9 +8,11 @@ import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.Espresso.pressBack;
import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.RootMatchers.isDialog;
import static android.support.test.espresso.matcher.ViewMatchers.hasSibling;
import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.isEnabled;
import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
......@@ -20,6 +22,8 @@ import static org.hamcrest.Matchers.equalToIgnoringCase;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.core.AllOf.allOf;
import android.os.Handler;
import android.os.Looper;
import android.support.test.espresso.action.ViewActions;
import android.support.test.filters.MediumTest;
......@@ -30,23 +34,28 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.chromium.base.Callback;
import org.chromium.base.task.PostTask;
import org.chromium.base.test.util.Restriction;
import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.download.home.filter.FilterCoordinator;
import org.chromium.chrome.browser.download.home.list.UiUtils;
import org.chromium.chrome.browser.download.home.rename.RenameUtils;
import org.chromium.chrome.browser.download.home.toolbar.DownloadHomeToolbar;
import org.chromium.chrome.browser.download.items.OfflineContentAggregatorFactory;
import org.chromium.chrome.browser.download.ui.StubbedProvider;
import org.chromium.chrome.browser.modaldialog.AppModalPresenter;
import org.chromium.chrome.browser.snackbar.SnackbarManager;
import org.chromium.chrome.browser.util.UrlConstants;
import org.chromium.chrome.download.R;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.ui.DummyUiActivityTestCase;
import org.chromium.components.feature_engagement.Tracker;
import org.chromium.components.offline_items_collection.ContentId;
import org.chromium.components.offline_items_collection.OfflineItem;
import org.chromium.components.offline_items_collection.OfflineItemFilter;
import org.chromium.components.offline_items_collection.OfflineItemState;
import org.chromium.components.offline_items_collection.RenameResult;
import org.chromium.content_public.browser.UiThreadTaskTraits;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.ui.modaldialog.ModalDialogManager;
......@@ -63,7 +72,7 @@ public class DownloadActivityV2Test extends DummyUiActivityTestCase {
private Tracker mTracker;
@Mock
private SnackbarManager mSnackbarManager;
@Mock
private ModalDialogManager.Presenter mAppModalPresenter;
private ModalDialogManager mModalDialogManager;
......@@ -91,7 +100,14 @@ public class DownloadActivityV2Test extends DummyUiActivityTestCase {
features.put(ChromeFeatureList.OFFLINE_HOME, false);
ChromeFeatureList.setTestFeatures(features);
mStubbedOfflineContentProvider = new StubbedOfflineContentProvider();
mStubbedOfflineContentProvider = new StubbedOfflineContentProvider() {
@Override
public void renameItem(ContentId id, String name, Callback<Integer> callback) {
new Handler(Looper.getMainLooper())
.post(() -> callback.onResult(handleRename(name)));
}
};
OfflineContentAggregatorFactory.setOfflineContentProviderForTests(
mStubbedOfflineContentProvider);
......@@ -119,6 +135,8 @@ public class DownloadActivityV2Test extends DummyUiActivityTestCase {
.setUseNewDownloadPathThumbnails(true)
.build();
mAppModalPresenter = new AppModalPresenter(getActivity());
mModalDialogManager =
new ModalDialogManager(mAppModalPresenter, ModalDialogManager.ModalDialogType.APP);
......@@ -337,6 +355,36 @@ public class DownloadActivityV2Test extends DummyUiActivityTestCase {
onView(withId(R.id.empty)).check(matches(isDisplayed()));
}
@Test
@MediumTest
public void testRenameItem() throws Exception {
TestThreadUtils.runOnUiThreadBlocking(() -> { setUpUi(); });
RenameUtils.disableNativeForTesting();
// Rename a non-offline-page item using three dot menu.
// Open menu for a list item, it should have the rename option.
onView(allOf(withId(R.id.more), hasSibling(withText("page 4"))))
.perform(ViewActions.click());
// Rename an item. The rename dialog should popup.
onView(withText("Rename")).check(matches(isDisplayed())).perform(ViewActions.click());
// Test rename dialog with error message.
renameFileAndVerifyErrorMessage("name_conflict", R.string.rename_failure_name_conflict);
renameFileAndVerifyErrorMessage("name_too_long", R.string.rename_failure_name_too_long);
renameFileAndVerifyErrorMessage("name_invalid", R.string.rename_failure_name_invalid);
renameFileAndVerifyErrorMessage("rename_unavailable", R.string.rename_failure_unavailable);
// Test empty input.
onView(withId(R.id.file_name)).inRoot(isDialog()).perform(ViewActions.clearText());
onView(withText("OK")).inRoot(isDialog()).check(matches(not(isEnabled())));
// Test successful commit.
renameFileAndVerifyErrorMessage("rename_file_successful", -1);
// TODO(hesen): Test rename extension dialog.
}
@Test
@MediumTest
public void testShareItem() throws Exception {
......@@ -385,4 +433,43 @@ public class DownloadActivityV2Test extends DummyUiActivityTestCase {
onView(withText("page 3")).check(item2 ? matches(isDisplayed()) : doesNotExist());
onView(withText("page 4")).check(item3 ? matches(isDisplayed()) : doesNotExist());
}
private void renameFileAndVerifyErrorMessage(String name, int expectErrorMsgId) {
onView(withId(R.id.file_name))
.inRoot(isDialog())
.perform(ViewActions.clearText())
.perform(ViewActions.typeText(name));
onView(withText("OK"))
.inRoot(isDialog())
.check(matches(isDisplayed()))
.perform(ViewActions.click());
if (expectErrorMsgId != -1) {
onView(withText(getActivity().getResources().getString(expectErrorMsgId)))
.inRoot(isDialog())
.check(matches(isDisplayed()));
}
}
private int /*@RenameResult*/ handleRename(String name) {
int result = RenameResult.SUCCESS;
switch (name) {
case "name_conflict":
result = RenameResult.FAILURE_NAME_CONFLICT;
break;
case "name_too_long":
result = RenameResult.FAILURE_NAME_TOO_LONG;
break;
case "name_invalid":
result = RenameResult.FAILURE_NAME_INVALID;
break;
case "rename_unavailable":
result = RenameResult.FAILURE_UNAVAILABLE;
break;
default:
break;
}
return result;
}
}
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