blob: 3db975e6ac2ea28884679f592f5404a1929ca8ba [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// 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.bookmarks;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import static org.chromium.chrome.browser.bookmarks.SharedBookmarkModelMocks.DESKTOP_BOOKMARK_ID;
import static org.chromium.chrome.browser.bookmarks.SharedBookmarkModelMocks.FOLDER_BOOKMARK_ID_A;
import static org.chromium.chrome.browser.bookmarks.SharedBookmarkModelMocks.MOBILE_BOOKMARK_ID;
import static org.chromium.chrome.browser.bookmarks.SharedBookmarkModelMocks.OTHER_BOOKMARK_ID;
import static org.chromium.chrome.browser.bookmarks.SharedBookmarkModelMocks.READING_LIST_BOOKMARK_ID;
import static org.chromium.chrome.browser.bookmarks.SharedBookmarkModelMocks.ROOT_BOOKMARK_ID;
import static org.chromium.chrome.browser.bookmarks.SharedBookmarkModelMocks.URL_BOOKMARK_ID_A;
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.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.annotation.Config;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.Batch;
import org.chromium.chrome.browser.bookmarks.BookmarkListEntry.ViewType;
import org.chromium.chrome.browser.commerce.ShoppingFeatures;
import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.sync.SyncService;
import org.chromium.chrome.browser.sync.SyncService.SyncStateChangedListener;
import org.chromium.chrome.test.util.browser.Features;
import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
import org.chromium.components.feature_engagement.Tracker;
import java.util.Arrays;
import java.util.List;
/** Unit tests for {@link LegacyBookmarkQueryHandler}. */
@Batch(Batch.UNIT_TESTS)
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
@EnableFeatures(ChromeFeatureList.ANDROID_IMPROVED_BOOKMARKS)
public class LegacyBookmarkQueryHandlerTest {
@Rule
public MockitoRule mMockitoRule = MockitoJUnit.rule();
@Rule
public TestRule mProcessor = new Features.JUnitProcessor();
@Mock
private BookmarkModel mBookmarkModel;
@Mock
private SyncService mSyncService;
@Mock
private Tracker mTracker;
@Mock
private Profile mProfile;
@Mock
private BookmarkUiPrefs mBookmarkUiPrefs;
@Captor
private ArgumentCaptor<Runnable> mFinishLoadingBookmarkModelCaptor;
@Captor
private ArgumentCaptor<SyncStateChangedListener> mSyncStateChangedListenerCaptor;
private LegacyBookmarkQueryHandler mHandler;
@Before
public void setup() {
SyncService.overrideForTests(mSyncService);
TrackerFactory.setTrackerForTests(mTracker);
Profile.setLastUsedProfileForTesting(mProfile);
SharedBookmarkModelMocks.initMocks(mBookmarkModel);
ShoppingFeatures.setShoppingListEligibleForTesting(false);
mHandler = new LegacyBookmarkQueryHandler(mBookmarkModel, mBookmarkUiPrefs);
}
@Test
public void testDestroy() {
verify(mSyncService).addSyncStateChangedListener(any());
mHandler.destroy();
verify(mSyncService).removeSyncStateChangedListener(any());
}
@Test
public void testBuildBookmarkListForParent_rootFolder_isFolderVisible() {
verify(mBookmarkModel)
.finishLoadingBookmarkModel(mFinishLoadingBookmarkModelCaptor.capture());
doReturn(true).when(mBookmarkModel).isBookmarkModelLoaded();
mFinishLoadingBookmarkModelCaptor.getValue().run();
List<BookmarkListEntry> result = mHandler.buildBookmarkListForParent(ROOT_BOOKMARK_ID);
assertEquals(3, result.size());
doReturn(true).when(mBookmarkModel).isFolderVisible(OTHER_BOOKMARK_ID);
verify(mSyncService).addSyncStateChangedListener(mSyncStateChangedListenerCaptor.capture());
mSyncStateChangedListenerCaptor.getValue().syncStateChanged();
List<BookmarkListEntry> updatedResult =
mHandler.buildBookmarkListForParent(ROOT_BOOKMARK_ID);
assertEquals(4, updatedResult.size());
}
@Test
public void testBuildBookmarkListForParent_rootFolder_isBookmarkModelLoaded() {
verify(mSyncService).addSyncStateChangedListener(mSyncStateChangedListenerCaptor.capture());
mSyncStateChangedListenerCaptor.getValue().syncStateChanged();
assertTrue(mHandler.buildBookmarkListForParent(ROOT_BOOKMARK_ID).isEmpty());
doReturn(true).when(mBookmarkModel).isBookmarkModelLoaded();
mSyncStateChangedListenerCaptor.getValue().syncStateChanged();
assertFalse(mHandler.buildBookmarkListForParent(ROOT_BOOKMARK_ID).isEmpty());
}
@Test
public void testBuildBookmarkListForParent_rootFolder_withShopping() {
ShoppingFeatures.setShoppingListEligibleForTesting(true);
verify(mBookmarkModel)
.finishLoadingBookmarkModel(mFinishLoadingBookmarkModelCaptor.capture());
doReturn(true).when(mBookmarkModel).isBookmarkModelLoaded();
mFinishLoadingBookmarkModelCaptor.getValue().run();
List<BookmarkListEntry> result = mHandler.buildBookmarkListForParent(ROOT_BOOKMARK_ID);
assertEquals(5, result.size());
assertEquals(READING_LIST_BOOKMARK_ID, result.get(0).getBookmarkItem().getId());
assertEquals(MOBILE_BOOKMARK_ID, result.get(1).getBookmarkItem().getId());
assertEquals(DESKTOP_BOOKMARK_ID, result.get(2).getBookmarkItem().getId());
assertEquals(ViewType.DIVIDER, result.get(3).getViewType());
assertEquals(ViewType.SHOPPING_FILTER, result.get(4).getViewType());
assertFalse(mHandler.buildBookmarkListForParent(ROOT_BOOKMARK_ID).isEmpty());
}
@Test
public void testBuildBookmarkListForParent_nonRootFolder() {
List<BookmarkListEntry> result = mHandler.buildBookmarkListForParent(MOBILE_BOOKMARK_ID);
assertEquals(2, result.size());
assertEquals(FOLDER_BOOKMARK_ID_A, result.get(0).getBookmarkItem().getId());
assertEquals(URL_BOOKMARK_ID_A, result.get(1).getBookmarkItem().getId());
}
@Test
public void testBuildBookmarkListForSearch() {
doReturn(Arrays.asList(FOLDER_BOOKMARK_ID_A, URL_BOOKMARK_ID_A))
.when(mBookmarkModel)
.searchBookmarks("A", 500);
List<BookmarkListEntry> result = mHandler.buildBookmarkListForSearch("A");
assertEquals(2, result.size());
}
}