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

Side by Side Diff: components/ntp_snippets/content_suggestions_service_unittest.cc

Issue 2581163004: [NTP::SectionOrder] Propagate new order through ContentSuggestionsService. (Closed)
Patch Set: treib@ nits. Created 4 years 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 unified diff | Download patch
« no previous file with comments | « components/ntp_snippets/content_suggestions_service.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/ntp_snippets/content_suggestions_service.h" 5 #include "components/ntp_snippets/content_suggestions_service.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
14 #include "base/message_loop/message_loop.h" 14 #include "base/message_loop/message_loop.h"
15 #include "base/run_loop.h" 15 #include "base/run_loop.h"
16 #include "base/strings/string_number_conversions.h" 16 #include "base/strings/string_number_conversions.h"
17 #include "base/strings/utf_string_conversions.h" 17 #include "base/strings/utf_string_conversions.h"
18 #include "components/ntp_snippets/category_info.h" 18 #include "components/ntp_snippets/category_info.h"
19 #include "components/ntp_snippets/category_rankers/constant_category_ranker.h" 19 #include "components/ntp_snippets/category_rankers/constant_category_ranker.h"
20 #include "components/ntp_snippets/category_rankers/fake_category_ranker.h"
20 #include "components/ntp_snippets/category_status.h" 21 #include "components/ntp_snippets/category_status.h"
21 #include "components/ntp_snippets/content_suggestion.h" 22 #include "components/ntp_snippets/content_suggestion.h"
22 #include "components/ntp_snippets/content_suggestions_provider.h" 23 #include "components/ntp_snippets/content_suggestions_provider.h"
23 #include "components/ntp_snippets/user_classifier.h" 24 #include "components/ntp_snippets/user_classifier.h"
24 #include "components/prefs/testing_pref_service.h" 25 #include "components/prefs/testing_pref_service.h"
25 #include "testing/gmock/include/gmock/gmock.h" 26 #include "testing/gmock/include/gmock/gmock.h"
26 #include "testing/gtest/include/gtest/gtest.h" 27 #include "testing/gtest/include/gtest/gtest.h"
27 #include "ui/gfx/image/image.h" 28 #include "ui/gfx/image/image.h"
28 29
30 using testing::_;
29 using testing::ElementsAre; 31 using testing::ElementsAre;
30 using testing::Eq; 32 using testing::Eq;
31 using testing::InvokeWithoutArgs; 33 using testing::InvokeWithoutArgs;
32 using testing::IsEmpty; 34 using testing::IsEmpty;
33 using testing::Mock; 35 using testing::Mock;
34 using testing::Property; 36 using testing::Property;
35 using testing::_; 37 using testing::Return;
38 using testing::UnorderedElementsAre;
36 39
37 namespace ntp_snippets { 40 namespace ntp_snippets {
38 41
39 namespace { 42 namespace {
40 43
44 // TODO(treib): This is a weird combination of a mock and a fake. Fix this.
41 class MockProvider : public ContentSuggestionsProvider { 45 class MockProvider : public ContentSuggestionsProvider {
42 public: 46 public:
43 MockProvider(Observer* observer, 47 MockProvider(Observer* observer,
44 const std::vector<Category>& provided_categories) 48 const std::vector<Category>& provided_categories)
45 : ContentSuggestionsProvider(observer) { 49 : ContentSuggestionsProvider(observer) {
46 SetProvidedCategories(provided_categories); 50 SetProvidedCategories(provided_categories);
47 } 51 }
48 52
49 void SetProvidedCategories(const std::vector<Category>& provided_categories) { 53 void SetProvidedCategories(const std::vector<Category>& provided_categories) {
50 statuses_.clear(); 54 statuses_.clear();
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 128
125 private: 129 private:
126 DISALLOW_COPY_AND_ASSIGN(MockServiceObserver); 130 DISALLOW_COPY_AND_ASSIGN(MockServiceObserver);
127 }; 131 };
128 132
129 } // namespace 133 } // namespace
130 134
131 class ContentSuggestionsServiceTest : public testing::Test { 135 class ContentSuggestionsServiceTest : public testing::Test {
132 public: 136 public:
133 ContentSuggestionsServiceTest() 137 ContentSuggestionsServiceTest()
134 : pref_service_(new TestingPrefServiceSimple()) {} 138 : pref_service_(base::MakeUnique<TestingPrefServiceSimple>()),
139 category_ranker_(base::MakeUnique<ConstantCategoryRanker>()) {}
135 140
136 void SetUp() override { 141 void SetUp() override {
137 RegisterPrefs(); 142 RegisterPrefs();
138 CreateContentSuggestionsService(ContentSuggestionsService::State::ENABLED); 143 CreateContentSuggestionsService(ContentSuggestionsService::State::ENABLED);
139 } 144 }
140 145
141 void TearDown() override { 146 void TearDown() override {
142 service_->Shutdown(); 147 service_->Shutdown();
143 service_.reset(); 148 service_.reset();
144 } 149 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 191
187 MockProvider* RegisterProvider( 192 MockProvider* RegisterProvider(
188 const std::vector<Category>& provided_categories) { 193 const std::vector<Category>& provided_categories) {
189 std::unique_ptr<MockProvider> provider = 194 std::unique_ptr<MockProvider> provider =
190 base::MakeUnique<MockProvider>(service(), provided_categories); 195 base::MakeUnique<MockProvider>(service(), provided_categories);
191 MockProvider* result = provider.get(); 196 MockProvider* result = provider.get();
192 service()->RegisterProvider(std::move(provider)); 197 service()->RegisterProvider(std::move(provider));
193 return result; 198 return result;
194 } 199 }
195 200
201 void SetCategoryRanker(std::unique_ptr<CategoryRanker> category_ranker) {
202 category_ranker_ = std::move(category_ranker);
203 }
204
196 MOCK_METHOD1(OnImageFetched, void(const gfx::Image&)); 205 MOCK_METHOD1(OnImageFetched, void(const gfx::Image&));
197 206
198 protected: 207 protected:
199 void RegisterPrefs() { 208 void RegisterPrefs() {
200 ContentSuggestionsService::RegisterProfilePrefs(pref_service_->registry()); 209 ContentSuggestionsService::RegisterProfilePrefs(pref_service_->registry());
201 UserClassifier::RegisterProfilePrefs(pref_service_->registry()); 210 UserClassifier::RegisterProfilePrefs(pref_service_->registry());
202 } 211 }
203 212
204 void CreateContentSuggestionsService( 213 void CreateContentSuggestionsService(
205 ContentSuggestionsService::State enabled) { 214 ContentSuggestionsService::State enabled) {
206 ASSERT_FALSE(service_); 215 ASSERT_FALSE(service_);
207 service_.reset(new ContentSuggestionsService( 216 service_ = base::MakeUnique<ContentSuggestionsService>(
208 enabled, /*signin_manager=*/nullptr, /*history_service=*/nullptr, 217 enabled, /*signin_manager=*/nullptr, /*history_service=*/nullptr,
209 pref_service_.get(), 218 pref_service_.get(), std::move(category_ranker_));
210 base::MakeUnique<ntp_snippets::ConstantCategoryRanker>()));
211 } 219 }
212 220
213 void ResetService() { 221 void ResetService() {
214 service_->Shutdown(); 222 service_->Shutdown();
215 service_.reset(); 223 service_.reset();
216 CreateContentSuggestionsService(ContentSuggestionsService::State::ENABLED); 224 CreateContentSuggestionsService(ContentSuggestionsService::State::ENABLED);
217 } 225 }
218 226
219 ContentSuggestionsService* service() { return service_.get(); } 227 ContentSuggestionsService* service() { return service_.get(); }
220 228
(...skipping 10 matching lines...) Expand all
231 std::vector<ContentSuggestion> result; 239 std::vector<ContentSuggestion> result;
232 for (int number : numbers) { 240 for (int number : numbers) {
233 result.push_back(CreateSuggestion(category, number)); 241 result.push_back(CreateSuggestion(category, number));
234 } 242 }
235 return result; 243 return result;
236 } 244 }
237 245
238 private: 246 private:
239 std::unique_ptr<ContentSuggestionsService> service_; 247 std::unique_ptr<ContentSuggestionsService> service_;
240 std::unique_ptr<TestingPrefServiceSimple> pref_service_; 248 std::unique_ptr<TestingPrefServiceSimple> pref_service_;
249 std::unique_ptr<CategoryRanker> category_ranker_;
241 250
242 DISALLOW_COPY_AND_ASSIGN(ContentSuggestionsServiceTest); 251 DISALLOW_COPY_AND_ASSIGN(ContentSuggestionsServiceTest);
243 }; 252 };
244 253
245 class ContentSuggestionsServiceDisabledTest 254 class ContentSuggestionsServiceDisabledTest
246 : public ContentSuggestionsServiceTest { 255 : public ContentSuggestionsServiceTest {
247 public: 256 public:
248 void SetUp() override { 257 void SetUp() override {
249 RegisterPrefs(); 258 RegisterPrefs();
250 CreateContentSuggestionsService(ContentSuggestionsService::State::DISABLED); 259 CreateContentSuggestionsService(ContentSuggestionsService::State::DISABLED);
(...skipping 13 matching lines...) Expand all
264 Eq(CategoryStatus::NOT_PROVIDED)); 273 Eq(CategoryStatus::NOT_PROVIDED));
265 EXPECT_THAT(service()->GetCategoryStatus(offline_pages_category), 274 EXPECT_THAT(service()->GetCategoryStatus(offline_pages_category),
266 Eq(CategoryStatus::NOT_PROVIDED)); 275 Eq(CategoryStatus::NOT_PROVIDED));
267 276
268 MockProvider* provider1 = RegisterProvider(articles_category); 277 MockProvider* provider1 = RegisterProvider(articles_category);
269 provider1->FireCategoryStatusChangedWithCurrentStatus(articles_category); 278 provider1->FireCategoryStatusChangedWithCurrentStatus(articles_category);
270 EXPECT_THAT(providers().count(offline_pages_category), Eq(0ul)); 279 EXPECT_THAT(providers().count(offline_pages_category), Eq(0ul));
271 ASSERT_THAT(providers().count(articles_category), Eq(1ul)); 280 ASSERT_THAT(providers().count(articles_category), Eq(1ul));
272 EXPECT_THAT(providers().at(articles_category), Eq(provider1)); 281 EXPECT_THAT(providers().at(articles_category), Eq(provider1));
273 EXPECT_THAT(providers().size(), Eq(1ul)); 282 EXPECT_THAT(providers().size(), Eq(1ul));
274 EXPECT_THAT(service()->GetCategories(), ElementsAre(articles_category)); 283 EXPECT_THAT(service()->GetCategories(),
284 UnorderedElementsAre(articles_category));
275 EXPECT_THAT(service()->GetCategoryStatus(articles_category), 285 EXPECT_THAT(service()->GetCategoryStatus(articles_category),
276 Eq(CategoryStatus::AVAILABLE)); 286 Eq(CategoryStatus::AVAILABLE));
277 EXPECT_THAT(service()->GetCategoryStatus(offline_pages_category), 287 EXPECT_THAT(service()->GetCategoryStatus(offline_pages_category),
278 Eq(CategoryStatus::NOT_PROVIDED)); 288 Eq(CategoryStatus::NOT_PROVIDED));
279 289
280 MockProvider* provider2 = RegisterProvider(offline_pages_category); 290 MockProvider* provider2 = RegisterProvider(offline_pages_category);
281 provider2->FireCategoryStatusChangedWithCurrentStatus(offline_pages_category); 291 provider2->FireCategoryStatusChangedWithCurrentStatus(offline_pages_category);
282 ASSERT_THAT(providers().count(offline_pages_category), Eq(1ul)); 292 ASSERT_THAT(providers().count(offline_pages_category), Eq(1ul));
283 EXPECT_THAT(providers().at(articles_category), Eq(provider1)); 293 EXPECT_THAT(providers().at(articles_category), Eq(provider1));
284 ASSERT_THAT(providers().count(articles_category), Eq(1ul)); 294 ASSERT_THAT(providers().count(articles_category), Eq(1ul));
285 EXPECT_THAT(providers().at(offline_pages_category), Eq(provider2)); 295 EXPECT_THAT(providers().at(offline_pages_category), Eq(provider2));
286 EXPECT_THAT(providers().size(), Eq(2ul)); 296 EXPECT_THAT(providers().size(), Eq(2ul));
287 EXPECT_THAT(service()->GetCategories(), 297 EXPECT_THAT(service()->GetCategories(),
288 ElementsAre(offline_pages_category, articles_category)); 298 UnorderedElementsAre(offline_pages_category, articles_category));
289 EXPECT_THAT(service()->GetCategoryStatus(articles_category), 299 EXPECT_THAT(service()->GetCategoryStatus(articles_category),
290 Eq(CategoryStatus::AVAILABLE)); 300 Eq(CategoryStatus::AVAILABLE));
291 EXPECT_THAT(service()->GetCategoryStatus(offline_pages_category), 301 EXPECT_THAT(service()->GetCategoryStatus(offline_pages_category),
292 Eq(CategoryStatus::AVAILABLE)); 302 Eq(CategoryStatus::AVAILABLE));
293 } 303 }
294 304
295 TEST_F(ContentSuggestionsServiceDisabledTest, ShouldDoNothingWhenDisabled) { 305 TEST_F(ContentSuggestionsServiceDisabledTest, ShouldDoNothingWhenDisabled) {
296 Category articles_category = 306 Category articles_category =
297 Category::FromKnownCategory(KnownCategories::ARTICLES); 307 Category::FromKnownCategory(KnownCategories::ARTICLES);
298 Category offline_pages_category = 308 Category offline_pages_category =
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 CategoryStatus::INITIALIZING)); 548 CategoryStatus::INITIALIZING));
539 provider->FireCategoryStatusChanged(new_category, 549 provider->FireCategoryStatusChanged(new_category,
540 CategoryStatus::INITIALIZING); 550 CategoryStatus::INITIALIZING);
541 551
542 ASSERT_THAT(providers().count(new_category), Eq(1ul)); 552 ASSERT_THAT(providers().count(new_category), Eq(1ul));
543 EXPECT_THAT(providers().at(new_category), Eq(provider)); 553 EXPECT_THAT(providers().at(new_category), Eq(provider));
544 ExpectThatSuggestionsAre(new_category, std::vector<int>()); 554 ExpectThatSuggestionsAre(new_category, std::vector<int>());
545 EXPECT_THAT(service()->GetCategoryStatus(new_category), 555 EXPECT_THAT(service()->GetCategoryStatus(new_category),
546 Eq(CategoryStatus::INITIALIZING)); 556 Eq(CategoryStatus::INITIALIZING));
547 EXPECT_THAT(service()->GetCategories(), 557 EXPECT_THAT(service()->GetCategories(),
548 Eq(std::vector<Category>({category, new_category}))); 558 UnorderedElementsAre(category, new_category));
549 559
550 service()->RemoveObserver(&observer); 560 service()->RemoveObserver(&observer);
551 } 561 }
552 562
553 TEST_F(ContentSuggestionsServiceTest, ShouldRemoveCategoryWhenNotProvided) { 563 TEST_F(ContentSuggestionsServiceTest, ShouldRemoveCategoryWhenNotProvided) {
554 Category category = Category::FromKnownCategory(KnownCategories::DOWNLOADS); 564 Category category = Category::FromKnownCategory(KnownCategories::DOWNLOADS);
555 MockProvider* provider = RegisterProvider(category); 565 MockProvider* provider = RegisterProvider(category);
556 MockServiceObserver observer; 566 MockServiceObserver observer;
557 service()->AddObserver(&observer); 567 service()->AddObserver(&observer);
558 568
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
591 service()->Fetch(category, known_suggestions, FetchDoneCallback()); 601 service()->Fetch(category, known_suggestions, FetchDoneCallback());
592 } 602 }
593 603
594 TEST_F(ContentSuggestionsServiceTest, DismissAndRestoreCategory) { 604 TEST_F(ContentSuggestionsServiceTest, DismissAndRestoreCategory) {
595 // Register a category with one suggestion. 605 // Register a category with one suggestion.
596 Category category = Category::FromKnownCategory(KnownCategories::ARTICLES); 606 Category category = Category::FromKnownCategory(KnownCategories::ARTICLES);
597 MockProvider* provider = RegisterProvider(category); 607 MockProvider* provider = RegisterProvider(category);
598 provider->FireCategoryStatusChangedWithCurrentStatus(category); 608 provider->FireCategoryStatusChangedWithCurrentStatus(category);
599 provider->FireSuggestionsChanged(category, CreateSuggestions(category, {42})); 609 provider->FireSuggestionsChanged(category, CreateSuggestions(category, {42}));
600 610
601 EXPECT_THAT(service()->GetCategories(), ElementsAre(category)); 611 EXPECT_THAT(service()->GetCategories(), UnorderedElementsAre(category));
602 EXPECT_THAT(service()->GetCategoryStatus(category), 612 EXPECT_THAT(service()->GetCategoryStatus(category),
603 Eq(CategoryStatus::AVAILABLE)); 613 Eq(CategoryStatus::AVAILABLE));
604 ExpectThatSuggestionsAre(category, {42}); 614 ExpectThatSuggestionsAre(category, {42});
605 EXPECT_THAT(providers().count(category), Eq(1ul)); 615 EXPECT_THAT(providers().count(category), Eq(1ul));
606 EXPECT_THAT(dismissed_providers(), IsEmpty()); 616 EXPECT_THAT(dismissed_providers(), IsEmpty());
607 617
608 // Dismissing the category clears the suggestions for it. 618 // Dismissing the category clears the suggestions for it.
609 service()->DismissCategory(category); 619 service()->DismissCategory(category);
610 620
611 EXPECT_THAT(service()->GetCategories(), IsEmpty()); 621 EXPECT_THAT(service()->GetCategories(), IsEmpty());
612 EXPECT_THAT(service()->GetCategoryStatus(category), 622 EXPECT_THAT(service()->GetCategoryStatus(category),
613 Eq(CategoryStatus::NOT_PROVIDED)); 623 Eq(CategoryStatus::NOT_PROVIDED));
614 EXPECT_THAT(service()->GetSuggestionsForCategory(category), IsEmpty()); 624 EXPECT_THAT(service()->GetSuggestionsForCategory(category), IsEmpty());
615 EXPECT_THAT(providers(), IsEmpty()); 625 EXPECT_THAT(providers(), IsEmpty());
616 EXPECT_THAT(dismissed_providers().count(category), Eq(1ul)); 626 EXPECT_THAT(dismissed_providers().count(category), Eq(1ul));
617 627
618 // Restoring the dismissed category makes it available again but it is still 628 // Restoring the dismissed category makes it available again but it is still
619 // empty. 629 // empty.
620 service()->RestoreDismissedCategories(); 630 service()->RestoreDismissedCategories();
621 631
622 EXPECT_THAT(service()->GetCategories(), ElementsAre(category)); 632 EXPECT_THAT(service()->GetCategories(), UnorderedElementsAre(category));
623 EXPECT_THAT(service()->GetCategoryStatus(category), 633 EXPECT_THAT(service()->GetCategoryStatus(category),
624 Eq(CategoryStatus::AVAILABLE)); 634 Eq(CategoryStatus::AVAILABLE));
625 EXPECT_THAT(service()->GetSuggestionsForCategory(category), IsEmpty()); 635 EXPECT_THAT(service()->GetSuggestionsForCategory(category), IsEmpty());
626 EXPECT_THAT(providers().count(category), Eq(1ul)); 636 EXPECT_THAT(providers().count(category), Eq(1ul));
627 EXPECT_THAT(dismissed_providers(), IsEmpty()); 637 EXPECT_THAT(dismissed_providers(), IsEmpty());
628 } 638 }
629 639
630 TEST_F(ContentSuggestionsServiceTest, ShouldRestoreDismissedCategories) { 640 TEST_F(ContentSuggestionsServiceTest, ShouldRestoreDismissedCategories) {
631 // Create and register provider. 641 // Create and register provider.
632 Category category1 = Category::FromIDValue(1); 642 Category category1 = Category::FromIDValue(1);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 // restoration. 708 // restoration.
699 provider = RegisterProvider(category); 709 provider = RegisterProvider(category);
700 provider->FireCategoryStatusChangedWithCurrentStatus(category); 710 provider->FireCategoryStatusChangedWithCurrentStatus(category);
701 EXPECT_TRUE(service()->IsCategoryDismissed(category)); 711 EXPECT_TRUE(service()->IsCategoryDismissed(category));
702 712
703 service()->RestoreDismissedCategories(); 713 service()->RestoreDismissedCategories();
704 EXPECT_FALSE(service()->IsCategoryDismissed(category)); 714 EXPECT_FALSE(service()->IsCategoryDismissed(category));
705 EXPECT_THAT(providers().find(category)->second, Eq(provider)); 715 EXPECT_THAT(providers().find(category)->second, Eq(provider));
706 } 716 }
707 717
718 TEST_F(ContentSuggestionsServiceTest, ShouldReturnCategoriesInOrderToDisplay) {
719 const Category first_category = Category::FromRemoteCategory(1);
720 const Category second_category = Category::FromRemoteCategory(2);
721
722 auto fake_ranker = base::MakeUnique<FakeCategoryRanker>();
723 FakeCategoryRanker* raw_fake_ranker = fake_ranker.get();
724 SetCategoryRanker(std::move(fake_ranker));
725
726 raw_fake_ranker->SetOrder({first_category, second_category});
727
728 // The service is recreated to pick up the new ranker.
729 ResetService();
730
731 MockProvider* provider = RegisterProvider({first_category, second_category});
732 provider->FireCategoryStatusChangedWithCurrentStatus(first_category);
733 provider->FireCategoryStatusChangedWithCurrentStatus(second_category);
734
735 EXPECT_THAT(service()->GetCategories(),
736 ElementsAre(first_category, second_category));
737
738 // The order to display (in the ranker) changes.
739 raw_fake_ranker->SetOrder({second_category, first_category});
740
741 // Categories order should reflect the new order.
742 EXPECT_THAT(service()->GetCategories(),
743 ElementsAre(second_category, first_category));
744 }
745
708 } // namespace ntp_snippets 746 } // namespace ntp_snippets
OLDNEW
« no previous file with comments | « components/ntp_snippets/content_suggestions_service.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698