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

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

Issue 2618893003: 📰 Tweak the suggestion ranks for UMA to handle fetchMore (Closed)
Patch Set: rebase, address comments Created 3 years, 11 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/SectionListTest.java
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SectionListTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SectionListTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..452238ffd3a4d5c17d800c7f682cafb976718005
--- /dev/null
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SectionListTest.java
@@ -0,0 +1,190 @@
+// Copyright 2017 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.ntp.cards;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import static org.chromium.chrome.browser.ntp.cards.ContentSuggestionsTestUtils.createDummySuggestions;
+import static org.chromium.chrome.browser.ntp.cards.ContentSuggestionsTestUtils.registerCategory;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.Callback;
+import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
+import org.chromium.chrome.browser.ntp.cards.ContentSuggestionsTestUtils.CategoryInfoBuilder;
+import org.chromium.chrome.browser.ntp.snippets.CategoryInt;
+import org.chromium.chrome.browser.ntp.snippets.FakeSuggestionsSource;
+import org.chromium.chrome.browser.ntp.snippets.KnownCategories;
+import org.chromium.chrome.browser.ntp.snippets.SectionHeaderViewHolder;
+import org.chromium.chrome.browser.ntp.snippets.SnippetArticle;
+import org.chromium.chrome.browser.ntp.snippets.SnippetArticleViewHolder;
+import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
+import org.chromium.chrome.browser.suggestions.SuggestionsMetricsReporter;
+import org.chromium.testing.local.LocalRobolectricTestRunner;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Unit tests for {@link SuggestionsSection}.
+ */
+@RunWith(LocalRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class SectionListTest {
+ @Mock
+ private NewTabPageManager mNtpManager;
+ @Mock
+ private OfflinePageBridge mOfflinePageBridge;
+ @Mock
+ private SuggestionsMetricsReporter mMetricsReporter;
+ private FakeSuggestionsSource mSuggestionSource;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mSuggestionSource = new FakeSuggestionsSource();
+
+ when(mNtpManager.getSuggestionsSource()).thenReturn(mSuggestionSource);
+ when(mNtpManager.getSuggestionsMetricsReporter()).thenReturn(mMetricsReporter);
+ }
+
+ @Test
+ @Feature({"Ntp"})
+ public void testGetSuggestionRank() {
+ // Setup the section list the following way:
+ //
+ // Item type | local rank | global rank
+ // -----------+------------+-------------
+ // HEADER | |
+ // ARTICLE | 0 | 0
+ // ARTICLE | 1 | 1
+ // ARTICLE | 2 | 2
+ // HEADER | |
+ // STATUS | |
+ // ACTION | 0 |
+ // BOOKMARK | 0 | 3
+ // BOOKMARK | 1 | 4
+ // BOOKMARK | 2 | 5
+ // BOOKMARK | 3 | 6
+ List<SnippetArticle> articles =
+ registerCategory(mSuggestionSource, KnownCategories.ARTICLES, 3);
+ registerCategory(mSuggestionSource, KnownCategories.DOWNLOADS, 0);
+ List<SnippetArticle> bookmarks =
+ registerCategory(mSuggestionSource, KnownCategories.BOOKMARKS, 4);
+
+ SectionList sectionList = new SectionList(mNtpManager, mOfflinePageBridge);
+
+ assertThat(articles.get(0).getGlobalRank(), equalTo(0));
+ assertThat(articles.get(0).getPerSectionRank(), equalTo(0));
+ assertThat(articles.get(2).getGlobalRank(), equalTo(2));
+ assertThat(articles.get(2).getPerSectionRank(), equalTo(2));
+ assertThat(bookmarks.get(1).getGlobalRank(), equalTo(4));
+ assertThat(bookmarks.get(1).getPerSectionRank(), equalTo(1));
+
+ // Test ranks after changes: remove then add some items.
+ @SuppressWarnings("unchecked")
+ Callback<String> cb = mock(Callback.class);
+ sectionList.dismissItem(2, cb);
+
+ // Using sublists to skip the first items and avoid using existing ones
+ List<SnippetArticle> newArticles =
+ createDummySuggestions(5, KnownCategories.ARTICLES).subList(3, 5);
+ List<SnippetArticle> newBookmarks =
+ createDummySuggestions(6, KnownCategories.BOOKMARKS).subList(4, 6);
+
+ sectionList.onMoreSuggestions(KnownCategories.ARTICLES, newArticles);
+ sectionList.onMoreSuggestions(KnownCategories.BOOKMARKS, newBookmarks);
+
+ // After the changes we should have:
+ // Item type | local rank | global rank
+ // -----------+------------+-------------
+ // HEADER | |
+ // ARTICLE | 0 | 0
+ // ARTICLE | 1 | 1
+ // | - | - (deleted)
+ // ARTICLE | 3 | 7 (new)
+ // ARTICLE | 4 | 8 (new)
+ // HEADER | |
+ // STATUS | |
+ // ACTION | 0 |
+ // BOOKMARK | 0 | 3
+ // BOOKMARK | 1 | 4
+ // BOOKMARK | 2 | 5
+ // BOOKMARK | 3 | 6
+ // BOOKMARK | 4 | 9 (new)
+ // BOOKMARK | 5 | 10 (new)
+
+ // The old ranks should not change.
+ assertThat(articles.get(0).getGlobalRank(), equalTo(0));
+ assertThat(articles.get(0).getPerSectionRank(), equalTo(0));
+ assertThat(articles.get(2).getGlobalRank(), equalTo(2));
+ assertThat(articles.get(2).getPerSectionRank(), equalTo(2));
+ assertThat(bookmarks.get(1).getGlobalRank(), equalTo(4));
+ assertThat(bookmarks.get(1).getPerSectionRank(), equalTo(1));
+
+ // New ranks take into account the previously existing items.
+ assertThat(newArticles.get(1).getGlobalRank(), equalTo(8));
+ assertThat(newArticles.get(1).getPerSectionRank(), equalTo(4));
+ assertThat(newBookmarks.get(1).getGlobalRank(), equalTo(10));
+ assertThat(newBookmarks.get(1).getPerSectionRank(), equalTo(5));
+ }
+
+ @Test
+ @Feature({"Ntp"})
+ public void testGetActionItemRank() {
+ registerCategory(mSuggestionSource, KnownCategories.ARTICLES, 0);
+ registerCategory(mSuggestionSource,
+ new CategoryInfoBuilder(KnownCategories.DOWNLOADS).withViewAllAction().build(), 3);
+
+ SectionList sectionList = new SectionList(mNtpManager, mOfflinePageBridge);
+ bindViewHolders(sectionList);
+
+ assertThat(sectionList.getSectionForTesting(KnownCategories.ARTICLES)
+ .getActionItem()
+ .getPerSectionRank(),
+ equalTo(0));
+ assertThat(sectionList.getSectionForTesting(KnownCategories.DOWNLOADS)
+ .getActionItem()
+ .getPerSectionRank(),
+ equalTo(3));
+ }
+
+ private static void bindViewHolders(InnerNode node) {
+ bindViewHolders(node, 0, node.getItemCount());
+ }
+
+ private static void bindViewHolders(InnerNode node, int startIndex, int endIndex) {
+ for (int i = startIndex; i < endIndex; ++i) {
+ node.onBindViewHolder(
+ makeViewHolder(node.getItemViewType(i)), i, Collections.emptyList());
+ }
+ }
+
+ private static NewTabPageViewHolder makeViewHolder(@CategoryInt int viewType) {
+ switch (viewType) {
+ case ItemViewType.SNIPPET:
+ return mock(SnippetArticleViewHolder.class);
+ case ItemViewType.HEADER:
+ return mock(SectionHeaderViewHolder.class);
+ case ItemViewType.STATUS:
+ return mock(StatusCardViewHolder.class);
+ case ItemViewType.ACTION:
+ return mock(ActionItem.ViewHolder.class);
+ case ItemViewType.PROGRESS:
+ return mock(ProgressViewHolder.class);
+ default:
+ return mock(NewTabPageViewHolder.class);
+ }
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698