Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1148)

Unified Diff: chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java

Issue 2232783002: Support action button to fetch more content suggestions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@snippetsbridge
Patch Set: Indent comments Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java
index 399e687206a625fc0de42966cf56dd93851448a1..f05387bdde2db5f3884ffa2151982872dfcc7c16 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java
@@ -19,6 +19,7 @@ import org.chromium.chrome.browser.ntp.snippets.CategoryStatus.CategoryStatusEnu
import org.chromium.chrome.browser.ntp.snippets.ContentSuggestionsCardLayout;
import org.chromium.chrome.browser.ntp.snippets.KnownCategories;
import org.chromium.chrome.browser.ntp.snippets.SnippetArticleListItem;
+import org.chromium.chrome.browser.ntp.snippets.SnippetsBridge;
import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource;
import org.chromium.testing.local.LocalRobolectricTestRunner;
import org.junit.Before;
@@ -40,22 +41,6 @@ import java.util.Set;
@RunWith(LocalRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class NewTabPageAdapterTest {
- /**
- * Number of elements, not including content suggestions that are loaded
- * in a populated recycler view.
- * The 3 elements are: above-the-fold, header, bottom spacer
- * TODO(dgn): Make this depend on the category info of the loaded sections
- * instead of being a constant, as it needs to know if the MORE button is
- * present for example.
- */
- private static final int PERMANENT_ELEMENTS_COUNT = 3;
-
- /**
- * Number of elements that are loaded in an empty recycler view
- * The 5 elements are: above-the-fold, header, status card, progress
- * indicator, bottom spacer.
- */
- private static final int EMPTY_STATE_ELEMENTS_COUNT = 5;
private static class FakeSnippetsSource implements SuggestionsSource {
private SuggestionsSource.Observer mObserver;
@@ -71,7 +56,8 @@ public class NewTabPageAdapterTest {
public void setSuggestionsForCategory(
@CategoryInt int category, List<SnippetArticleListItem> suggestions) {
- mSuggestions.put(category, suggestions);
+ // Copy the suggestions list so that it can't be modified anymore.
+ mSuggestions.put(category, new ArrayList<>(suggestions));
if (mObserver != null) mObserver.onNewSuggestions(category);
}
@@ -123,6 +109,9 @@ public class NewTabPageAdapterTest {
@Override
public List<SnippetArticleListItem> getSuggestionsForCategory(int category) {
+ if (!SnippetsBridge.isCategoryStatusAvailable(mCategoryStatus.get(category))) {
+ return Collections.emptyList();
+ }
List<SnippetArticleListItem> result = mSuggestions.get(category);
return result == null ? Collections.<SnippetArticleListItem>emptyList() : result;
}
@@ -131,6 +120,60 @@ public class NewTabPageAdapterTest {
private FakeSnippetsSource mSnippetsSource = new FakeSnippetsSource();
private NewTabPageAdapter mNtpAdapter;
+ /**
+ * Asserts that {@link #mNtpAdapter}.{@link NewTabPageAdapter#getItemCount()} corresponds to an
+ * NTP with the given sections in it.
+ * @param sections A list of sections, each represented by the number of items that are required
+ * to represent it on the UI. For readability, these numbers should be generated
+ * with the methods below.
+ */
+ private void assertItemsFor(int... sections) {
+ int expectedCount = 1; // above-the-fold.
+ for (int section : sections) expectedCount += section;
+ if (sections.length > 0) expectedCount += 1; // bottom spacer.
+ int actualCount = mNtpAdapter.getItemCount();
+ if (expectedCount != actualCount) {
dgn 2016/08/12 11:10:43 assertEquals will do this check for you already :)
Philipp Keck 2016/08/12 12:04:00 This is addressed here: https://codereview.chromiu
+ assertEquals("Expected " + expectedCount + " items, but the following " + actualCount
+ + " were present: " + mNtpAdapter.getItems(),
+ expectedCount, mNtpAdapter.getItemCount());
+ }
+ }
+
+ /**
+ * To be used with {@link #assertItemsFor(int...)}, for a section with {@code numSuggestions}
+ * cards in it.
+ * @param numSuggestions The number of suggestions in the section. If there are zero, use either
+ * no section at all (if it is not displayed) or
+ * {@link #sectionWithStatusCard()}.
+ * @return The number of items that should be used by the adapter to represent this section.
+ */
+ private int section(int numSuggestions) {
+ assert numSuggestions > 0;
+ return 1 + numSuggestions; // Header and the content.
+ }
+
+ /**
+ * To be used with {@link #assertItemsFor(int...)}, for a section with {@code numSuggestions}
+ * cards and a more-button.
+ * @param numSuggestions The number of suggestions in the section. If this is zero, the
+ * more-button is still shown.
+ * TODO(pke): In the future, we additionally show an empty-card if
+ * numSuggestions is zero.
+ * @return The number of items that should be used by the adapter to represent this section.
+ */
+ private int sectionWithMoreButton(int numSuggestions) {
+ return 1 + numSuggestions + 1; // Header, the content and the more-button.
+ }
+
+ /**
+ * To be used with {@link #assertItemsFor(int...)}, for a section that has no suggestions, but
+ * a status card to be displayed.
+ * @return The number of items that should be used by the adapter to represent this section.
+ */
+ private int sectionWithStatusCard() {
+ return 3; // Header, status card and progress indicator.
+ }
+
@Before
public void setUp() {
RecordHistogram.disableForTests();
@@ -139,7 +182,7 @@ public class NewTabPageAdapterTest {
mSnippetsSource.setStatusForCategory(KnownCategories.ARTICLES, CategoryStatus.INITIALIZING);
mSnippetsSource.setInfoForCategory(
KnownCategories.ARTICLES, new SuggestionsCategoryInfo("Articles for you",
- ContentSuggestionsCardLayout.FULL_CARD));
+ ContentSuggestionsCardLayout.FULL_CARD, false));
mNtpAdapter = new NewTabPageAdapter(null, null, mSnippetsSource, null);
}
@@ -150,19 +193,22 @@ public class NewTabPageAdapterTest {
@Test
@Feature({"Ntp"})
public void testSnippetLoading() {
- assertEquals(EMPTY_STATE_ELEMENTS_COUNT, mNtpAdapter.getItemCount());
+ assertItemsFor(sectionWithStatusCard());
assertEquals(NewTabPageListItem.VIEW_TYPE_ABOVE_THE_FOLD, mNtpAdapter.getItemViewType(0));
assertEquals(NewTabPageListItem.VIEW_TYPE_HEADER, mNtpAdapter.getItemViewType(1));
assertEquals(NewTabPageListItem.VIEW_TYPE_STATUS, mNtpAdapter.getItemViewType(2));
assertEquals(NewTabPageListItem.VIEW_TYPE_PROGRESS, mNtpAdapter.getItemViewType(3));
assertEquals(NewTabPageListItem.VIEW_TYPE_SPACING, mNtpAdapter.getItemViewType(4));
- List<SnippetArticleListItem> snippets = createDummySnippets();
+ List<SnippetArticleListItem> snippets = createDummySnippets(3);
+ mSnippetsSource.setStatusForCategory(KnownCategories.ARTICLES, CategoryStatus.AVAILABLE);
mSnippetsSource.setSuggestionsForCategory(KnownCategories.ARTICLES, snippets);
List<NewTabPageListItem> loadedItems = new ArrayList<>(mNtpAdapter.getItems());
assertEquals(NewTabPageListItem.VIEW_TYPE_ABOVE_THE_FOLD, mNtpAdapter.getItemViewType(0));
assertEquals(NewTabPageListItem.VIEW_TYPE_HEADER, mNtpAdapter.getItemViewType(1));
+ // From the loadedItems, cut out aboveTheFold and header from the front,
+ // and bottom spacer from the back.
assertEquals(snippets, loadedItems.subList(2, loadedItems.size() - 1));
assertEquals(NewTabPageListItem.VIEW_TYPE_SPACING,
mNtpAdapter.getItemViewType(loadedItems.size() - 1));
@@ -184,7 +230,7 @@ public class NewTabPageAdapterTest {
// If we don't get anything, we should be in the same situation as the initial one.
mSnippetsSource.setSuggestionsForCategory(
KnownCategories.ARTICLES, new ArrayList<SnippetArticleListItem>());
- assertEquals(EMPTY_STATE_ELEMENTS_COUNT, mNtpAdapter.getItemCount());
+ assertItemsFor(sectionWithStatusCard());
assertEquals(NewTabPageListItem.VIEW_TYPE_ABOVE_THE_FOLD, mNtpAdapter.getItemViewType(0));
assertEquals(NewTabPageListItem.VIEW_TYPE_HEADER, mNtpAdapter.getItemViewType(1));
assertEquals(NewTabPageListItem.VIEW_TYPE_STATUS, mNtpAdapter.getItemViewType(2));
@@ -192,11 +238,14 @@ public class NewTabPageAdapterTest {
assertEquals(NewTabPageListItem.VIEW_TYPE_SPACING, mNtpAdapter.getItemViewType(4));
// We should load new snippets when we get notified about them.
- List<SnippetArticleListItem> snippets = createDummySnippets();
+ List<SnippetArticleListItem> snippets = createDummySnippets(5);
+ mSnippetsSource.setStatusForCategory(KnownCategories.ARTICLES, CategoryStatus.AVAILABLE);
mSnippetsSource.setSuggestionsForCategory(KnownCategories.ARTICLES, snippets);
List<NewTabPageListItem> loadedItems = new ArrayList<>(mNtpAdapter.getItems());
assertEquals(NewTabPageListItem.VIEW_TYPE_ABOVE_THE_FOLD, mNtpAdapter.getItemViewType(0));
assertEquals(NewTabPageListItem.VIEW_TYPE_HEADER, mNtpAdapter.getItemViewType(1));
+ // From the loadedItems, cut out aboveTheFold and header from the front,
+ // and bottom spacer from the back.
assertEquals(snippets, loadedItems.subList(2, loadedItems.size() - 1));
assertEquals(NewTabPageListItem.VIEW_TYPE_SPACING,
mNtpAdapter.getItemViewType(loadedItems.size() - 1));
@@ -214,27 +263,29 @@ public class NewTabPageAdapterTest {
@Test
@Feature({"Ntp"})
public void testSnippetClearing() {
- List<SnippetArticleListItem> snippets = createDummySnippets();
+ List<SnippetArticleListItem> snippets = createDummySnippets(4);
+ mSnippetsSource.setStatusForCategory(KnownCategories.ARTICLES, CategoryStatus.AVAILABLE);
mSnippetsSource.setSuggestionsForCategory(KnownCategories.ARTICLES, snippets);
- assertEquals(PERMANENT_ELEMENTS_COUNT + snippets.size(), mNtpAdapter.getItemCount());
+ assertItemsFor(section(4));
// If we get told that snippets are enabled, we just leave the current
// ones there and not clear.
mSnippetsSource.setStatusForCategory(KnownCategories.ARTICLES,
CategoryStatus.AVAILABLE);
- assertEquals(PERMANENT_ELEMENTS_COUNT + snippets.size(), mNtpAdapter.getItemCount());
+ assertItemsFor(section(4));
// When snippets are disabled, we clear them and we should go back to
// the situation with the status card.
mSnippetsSource.setStatusForCategory(KnownCategories.ARTICLES,
CategoryStatus.SIGNED_OUT);
- assertEquals(EMPTY_STATE_ELEMENTS_COUNT, mNtpAdapter.getItemCount());
+ assertItemsFor(sectionWithStatusCard());
// The adapter should now be waiting for new snippets.
+ snippets = createDummySnippets(6);
mSnippetsSource.setStatusForCategory(KnownCategories.ARTICLES,
CategoryStatus.AVAILABLE);
mSnippetsSource.setSuggestionsForCategory(KnownCategories.ARTICLES, snippets);
- assertEquals(PERMANENT_ELEMENTS_COUNT + snippets.size(), mNtpAdapter.getItemCount());
+ assertItemsFor(section(6));
}
/**
@@ -243,35 +294,37 @@ public class NewTabPageAdapterTest {
@Test
@Feature({"Ntp"})
public void testSnippetLoadingBlock() {
- List<SnippetArticleListItem> snippets = createDummySnippets();
+ List<SnippetArticleListItem> snippets = createDummySnippets(3);
// By default, status is INITIALIZING, so we can load snippets
+ mSnippetsSource.setStatusForCategory(KnownCategories.ARTICLES, CategoryStatus.AVAILABLE);
mSnippetsSource.setSuggestionsForCategory(KnownCategories.ARTICLES, snippets);
- assertEquals(PERMANENT_ELEMENTS_COUNT + snippets.size(), mNtpAdapter.getItemCount());
+ assertItemsFor(section(3));
- // If we have snippets, we should not load the new list.
+ // If we have snippets, we should not load the new list (i.e. the extra item does *not*
+ // appear).
snippets.add(new SnippetArticleListItem("https://site.com/url1", "title1", "pub1", "txt1",
"https://site.com/url1", "https://amp.site.com/url1", 0, 0, 0));
mSnippetsSource.setSuggestionsForCategory(KnownCategories.ARTICLES, snippets);
- assertEquals(PERMANENT_ELEMENTS_COUNT + snippets.size() - 1, mNtpAdapter.getItemCount());
+ assertItemsFor(section(3));
- // When snippets are disabled, we should not be able to load them
+ // When snippets are disabled, we should not be able to load them.
mSnippetsSource.setStatusForCategory(KnownCategories.ARTICLES,
CategoryStatus.SIGNED_OUT);
mSnippetsSource.setSuggestionsForCategory(KnownCategories.ARTICLES, snippets);
- assertEquals(EMPTY_STATE_ELEMENTS_COUNT, mNtpAdapter.getItemCount());
+ assertItemsFor(sectionWithStatusCard());
// INITIALIZING lets us load snippets still.
mSnippetsSource.setStatusForCategory(KnownCategories.ARTICLES,
CategoryStatus.INITIALIZING);
mSnippetsSource.setSuggestionsForCategory(KnownCategories.ARTICLES, snippets);
- assertEquals(PERMANENT_ELEMENTS_COUNT + snippets.size(), mNtpAdapter.getItemCount());
+ assertItemsFor(sectionWithStatusCard());
- // The adapter should now be waiting for new snippets.
+ // The adapter should now be waiting for new snippets and the fourth one should appear.
mSnippetsSource.setStatusForCategory(KnownCategories.ARTICLES,
CategoryStatus.AVAILABLE);
mSnippetsSource.setSuggestionsForCategory(KnownCategories.ARTICLES, snippets);
- assertEquals(PERMANENT_ELEMENTS_COUNT + snippets.size(), mNtpAdapter.getItemCount());
+ assertItemsFor(section(4));
}
/**
@@ -312,14 +365,30 @@ public class NewTabPageAdapterTest {
assertFalse(progress.isVisible());
}
- private List<SnippetArticleListItem> createDummySnippets() {
+ @Test
+ @Feature({"Ntp"})
+ public void testMoreButton() {
+ List<SnippetArticleListItem> articles = createDummySnippets(3);
+ mSnippetsSource.setStatusForCategory(KnownCategories.ARTICLES, CategoryStatus.AVAILABLE);
+ mSnippetsSource.setSuggestionsForCategory(KnownCategories.ARTICLES, articles);
+ assertItemsFor(section(3));
+
+ List<SnippetArticleListItem> bookmarks = createDummySnippets(10);
+ mSnippetsSource.setInfoForCategory(KnownCategories.BOOKMARKS,
+ new SuggestionsCategoryInfo("Bookmarks", ContentSuggestionsCardLayout.MINIMAL_CARD,
+ true));
+ mSnippetsSource.setStatusForCategory(KnownCategories.BOOKMARKS, CategoryStatus.AVAILABLE);
+ mSnippetsSource.setSuggestionsForCategory(KnownCategories.BOOKMARKS, bookmarks);
+ assertItemsFor(sectionWithMoreButton(10), section(3));
+ }
+
+ private List<SnippetArticleListItem> createDummySnippets(int count) {
List<SnippetArticleListItem> snippets = new ArrayList<>();
- snippets.add(new SnippetArticleListItem("https://site.com/url1", "title1", "pub1", "txt1",
- "https://site.com/url1", "https://amp.site.com/url1", 0, 0, 0));
- snippets.add(new SnippetArticleListItem("https://site.com/url2", "title2", "pub2", "txt2",
- "https://site.com/url2", "https://amp.site.com/url2", 0, 0, 0));
- snippets.add(new SnippetArticleListItem("https://site.com/url3", "title3", "pub3", "txt3",
- "https://site.com/url3", "https://amp.site.com/url3", 0, 0, 0));
+ for (int index = 0; index < count; index++) {
+ snippets.add(new SnippetArticleListItem("https://site.com/url" + index, "title" + index,
+ "pub" + index, "txt" + index, "https://site.com/url" + index,
+ "https://amp.site.com/url" + index, 0, 0, 0));
+ }
return snippets;
}
}

Powered by Google App Engine
This is Rietveld 408576698