| OLD | NEW |
| 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 <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 | 38 |
| 39 namespace { | 39 namespace { |
| 40 | 40 |
| 41 // Returns a suggestion instance for testing. | 41 // Returns a suggestion instance for testing. |
| 42 ContentSuggestion CreateSuggestion(int number) { | 42 ContentSuggestion CreateSuggestion(int number) { |
| 43 return ContentSuggestion( | 43 return ContentSuggestion( |
| 44 base::IntToString(number), | 44 base::IntToString(number), |
| 45 GURL("http://testsuggestion/" + base::IntToString(number))); | 45 GURL("http://testsuggestion/" + base::IntToString(number))); |
| 46 } | 46 } |
| 47 | 47 |
| 48 std::vector<ContentSuggestion> CreateSuggestions(std::vector<int> numbers) { | 48 std::vector<ContentSuggestion> CreateSuggestions( |
| 49 const std::vector<int>& numbers) { |
| 49 std::vector<ContentSuggestion> result; | 50 std::vector<ContentSuggestion> result; |
| 50 for (int number : numbers) { | 51 for (int number : numbers) { |
| 51 result.emplace_back(CreateSuggestion(number)); | 52 result.emplace_back(CreateSuggestion(number)); |
| 52 } | 53 } |
| 53 return result; | 54 return result; |
| 54 } | 55 } |
| 55 | 56 |
| 56 class MockProvider : public ContentSuggestionsProvider { | 57 class MockProvider : public ContentSuggestionsProvider { |
| 57 public: | 58 public: |
| 58 MockProvider(Observer* observer, | 59 MockProvider(Observer* observer, |
| 59 CategoryFactory* category_factory, | 60 CategoryFactory* category_factory, |
| 60 std::vector<Category> provided_categories) | 61 const std::vector<Category>& provided_categories) |
| 61 : ContentSuggestionsProvider(observer, category_factory), | 62 : ContentSuggestionsProvider(observer, category_factory) { |
| 62 provided_categories_(provided_categories) { | 63 SetProvidedCategories(provided_categories); |
| 64 } |
| 65 |
| 66 void SetProvidedCategories(const std::vector<Category>& provided_categories) { |
| 67 statuses_.clear(); |
| 68 provided_categories_ = provided_categories; |
| 63 for (Category category : provided_categories) { | 69 for (Category category : provided_categories) { |
| 64 statuses_[category.id()] = CategoryStatus::AVAILABLE; | 70 statuses_[category.id()] = CategoryStatus::AVAILABLE; |
| 65 } | 71 } |
| 66 } | 72 } |
| 67 | 73 |
| 68 std::vector<Category> GetProvidedCategories() override { | 74 std::vector<Category> GetProvidedCategories() override { |
| 69 return provided_categories_; | 75 return provided_categories_; |
| 70 } | 76 } |
| 71 | 77 |
| 72 CategoryStatus GetCategoryStatus(Category category) { | 78 CategoryStatus GetCategoryStatus(Category category) { |
| 73 return statuses_[category.id()]; | 79 return statuses_[category.id()]; |
| 74 } | 80 } |
| 75 | 81 |
| 76 CategoryInfo GetCategoryInfo(Category category) { | 82 CategoryInfo GetCategoryInfo(Category category) { |
| 77 return CategoryInfo(base::ASCIIToUTF16("Section title"), | 83 return CategoryInfo(base::ASCIIToUTF16("Section title"), |
| 78 ContentSuggestionsCardLayout::FULL_CARD, true); | 84 ContentSuggestionsCardLayout::FULL_CARD, true); |
| 79 } | 85 } |
| 80 | 86 |
| 81 void FireSuggestionsChanged(Category category, std::vector<int> numbers) { | 87 void FireSuggestionsChanged(Category category, |
| 88 const std::vector<int>& numbers) { |
| 82 observer()->OnNewSuggestions(this, category, CreateSuggestions(numbers)); | 89 observer()->OnNewSuggestions(this, category, CreateSuggestions(numbers)); |
| 83 } | 90 } |
| 84 | 91 |
| 85 void FireCategoryStatusChanged(Category category, CategoryStatus new_status) { | 92 void FireCategoryStatusChanged(Category category, CategoryStatus new_status) { |
| 86 statuses_[category.id()] = new_status; | 93 statuses_[category.id()] = new_status; |
| 87 observer()->OnCategoryStatusChanged(this, category, new_status); | 94 observer()->OnCategoryStatusChanged(this, category, new_status); |
| 88 } | 95 } |
| 89 | 96 |
| 90 void FireSuggestionInvalidated(Category category, | 97 void FireSuggestionInvalidated(Category category, |
| 91 const std::string& suggestion_id) { | 98 const std::string& suggestion_id) { |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 providers() { | 169 providers() { |
| 163 return service()->providers_by_category_; | 170 return service()->providers_by_category_; |
| 164 } | 171 } |
| 165 | 172 |
| 166 CategoryFactory* category_factory() { return service()->category_factory(); } | 173 CategoryFactory* category_factory() { return service()->category_factory(); } |
| 167 | 174 |
| 168 Category FromKnownCategory(KnownCategories known_category) { | 175 Category FromKnownCategory(KnownCategories known_category) { |
| 169 return service()->category_factory()->FromKnownCategory(known_category); | 176 return service()->category_factory()->FromKnownCategory(known_category); |
| 170 } | 177 } |
| 171 | 178 |
| 172 MockProvider* MakeProvider(Category provided_category) { | 179 MockProvider* RegisterProvider(Category provided_category) { |
| 173 return MakeProvider(std::vector<Category>({provided_category})); | 180 return RegisterProvider(std::vector<Category>({provided_category})); |
| 174 } | 181 } |
| 175 | 182 |
| 176 MockProvider* MakeProvider(std::vector<Category> provided_categories) { | 183 MockProvider* RegisterProvider( |
| 184 const std::vector<Category>& provided_categories) { |
| 177 std::unique_ptr<MockProvider> provider = base::MakeUnique<MockProvider>( | 185 std::unique_ptr<MockProvider> provider = base::MakeUnique<MockProvider>( |
| 178 service(), category_factory(), provided_categories); | 186 service(), category_factory(), provided_categories); |
| 179 MockProvider* result = provider.get(); | 187 MockProvider* result = provider.get(); |
| 180 service()->RegisterProvider(std::move(provider)); | 188 service()->RegisterProvider(std::move(provider)); |
| 181 return result; | 189 return result; |
| 182 } | 190 } |
| 183 | 191 |
| 184 MOCK_METHOD2(OnImageFetched, | 192 MOCK_METHOD2(OnImageFetched, |
| 185 void(const std::string& suggestion_id, const gfx::Image&)); | 193 void(const std::string& suggestion_id, const gfx::Image&)); |
| 186 | 194 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 213 Category articles_category = FromKnownCategory(KnownCategories::ARTICLES); | 221 Category articles_category = FromKnownCategory(KnownCategories::ARTICLES); |
| 214 Category offline_pages_category = | 222 Category offline_pages_category = |
| 215 FromKnownCategory(KnownCategories::BOOKMARKS); | 223 FromKnownCategory(KnownCategories::BOOKMARKS); |
| 216 ASSERT_THAT(providers(), IsEmpty()); | 224 ASSERT_THAT(providers(), IsEmpty()); |
| 217 EXPECT_THAT(service()->GetCategories(), IsEmpty()); | 225 EXPECT_THAT(service()->GetCategories(), IsEmpty()); |
| 218 EXPECT_THAT(service()->GetCategoryStatus(articles_category), | 226 EXPECT_THAT(service()->GetCategoryStatus(articles_category), |
| 219 Eq(CategoryStatus::NOT_PROVIDED)); | 227 Eq(CategoryStatus::NOT_PROVIDED)); |
| 220 EXPECT_THAT(service()->GetCategoryStatus(offline_pages_category), | 228 EXPECT_THAT(service()->GetCategoryStatus(offline_pages_category), |
| 221 Eq(CategoryStatus::NOT_PROVIDED)); | 229 Eq(CategoryStatus::NOT_PROVIDED)); |
| 222 | 230 |
| 223 MockProvider* provider1 = MakeProvider(articles_category); | 231 MockProvider* provider1 = RegisterProvider(articles_category); |
| 224 EXPECT_THAT(providers().count(offline_pages_category), Eq(0ul)); | 232 EXPECT_THAT(providers().count(offline_pages_category), Eq(0ul)); |
| 225 EXPECT_THAT(providers().at(articles_category), Eq(provider1)); | 233 EXPECT_THAT(providers().at(articles_category), Eq(provider1)); |
| 226 EXPECT_THAT(providers().size(), Eq(1ul)); | 234 EXPECT_THAT(providers().size(), Eq(1ul)); |
| 227 EXPECT_THAT(service()->GetCategories(), ElementsAre(articles_category)); | 235 EXPECT_THAT(service()->GetCategories(), ElementsAre(articles_category)); |
| 228 EXPECT_THAT(service()->GetCategoryStatus(articles_category), | 236 EXPECT_THAT(service()->GetCategoryStatus(articles_category), |
| 229 Eq(CategoryStatus::AVAILABLE)); | 237 Eq(CategoryStatus::AVAILABLE)); |
| 230 EXPECT_THAT(service()->GetCategoryStatus(offline_pages_category), | 238 EXPECT_THAT(service()->GetCategoryStatus(offline_pages_category), |
| 231 Eq(CategoryStatus::NOT_PROVIDED)); | 239 Eq(CategoryStatus::NOT_PROVIDED)); |
| 232 | 240 |
| 233 MockProvider* provider2 = MakeProvider(offline_pages_category); | 241 MockProvider* provider2 = RegisterProvider(offline_pages_category); |
| 234 EXPECT_THAT(providers().at(articles_category), Eq(provider1)); | 242 EXPECT_THAT(providers().at(articles_category), Eq(provider1)); |
| 235 EXPECT_THAT(providers().at(offline_pages_category), Eq(provider2)); | 243 EXPECT_THAT(providers().at(offline_pages_category), Eq(provider2)); |
| 236 EXPECT_THAT(providers().size(), Eq(2ul)); | 244 EXPECT_THAT(providers().size(), Eq(2ul)); |
| 237 EXPECT_THAT(service()->GetCategories(), | 245 EXPECT_THAT(service()->GetCategories(), |
| 238 ElementsAre(offline_pages_category, articles_category)); | 246 ElementsAre(offline_pages_category, articles_category)); |
| 239 EXPECT_THAT(service()->GetCategoryStatus(articles_category), | 247 EXPECT_THAT(service()->GetCategoryStatus(articles_category), |
| 240 Eq(CategoryStatus::AVAILABLE)); | 248 Eq(CategoryStatus::AVAILABLE)); |
| 241 EXPECT_THAT(service()->GetCategoryStatus(offline_pages_category), | 249 EXPECT_THAT(service()->GetCategoryStatus(offline_pages_category), |
| 242 Eq(CategoryStatus::AVAILABLE)); | 250 Eq(CategoryStatus::AVAILABLE)); |
| 243 } | 251 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 255 Eq(CategoryStatus::ALL_SUGGESTIONS_EXPLICITLY_DISABLED)); | 263 Eq(CategoryStatus::ALL_SUGGESTIONS_EXPLICITLY_DISABLED)); |
| 256 EXPECT_THAT(service()->GetCategories(), IsEmpty()); | 264 EXPECT_THAT(service()->GetCategories(), IsEmpty()); |
| 257 EXPECT_THAT(service()->GetSuggestionsForCategory(articles_category), | 265 EXPECT_THAT(service()->GetSuggestionsForCategory(articles_category), |
| 258 IsEmpty()); | 266 IsEmpty()); |
| 259 } | 267 } |
| 260 | 268 |
| 261 TEST_F(ContentSuggestionsServiceTest, ShouldRedirectFetchSuggestionImage) { | 269 TEST_F(ContentSuggestionsServiceTest, ShouldRedirectFetchSuggestionImage) { |
| 262 Category articles_category = FromKnownCategory(KnownCategories::ARTICLES); | 270 Category articles_category = FromKnownCategory(KnownCategories::ARTICLES); |
| 263 Category offline_pages_category = | 271 Category offline_pages_category = |
| 264 FromKnownCategory(KnownCategories::BOOKMARKS); | 272 FromKnownCategory(KnownCategories::BOOKMARKS); |
| 265 MockProvider* provider1 = MakeProvider(articles_category); | 273 MockProvider* provider1 = RegisterProvider(articles_category); |
| 266 MockProvider* provider2 = MakeProvider(offline_pages_category); | 274 MockProvider* provider2 = RegisterProvider(offline_pages_category); |
| 267 | 275 |
| 268 provider1->FireSuggestionsChanged(articles_category, {1}); | 276 provider1->FireSuggestionsChanged(articles_category, {1}); |
| 269 std::string suggestion_id = CreateSuggestion(1).id(); | 277 std::string suggestion_id = CreateSuggestion(1).id(); |
| 270 | 278 |
| 271 EXPECT_CALL(*provider1, FetchSuggestionImage(suggestion_id, _)); | 279 EXPECT_CALL(*provider1, FetchSuggestionImage(suggestion_id, _)); |
| 272 EXPECT_CALL(*provider2, FetchSuggestionImage(_, _)).Times(0); | 280 EXPECT_CALL(*provider2, FetchSuggestionImage(_, _)).Times(0); |
| 273 service()->FetchSuggestionImage( | 281 service()->FetchSuggestionImage( |
| 274 suggestion_id, base::Bind(&ContentSuggestionsServiceTest::OnImageFetched, | 282 suggestion_id, base::Bind(&ContentSuggestionsServiceTest::OnImageFetched, |
| 275 base::Unretained(this))); | 283 base::Unretained(this))); |
| 276 } | 284 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 288 service()->FetchSuggestionImage( | 296 service()->FetchSuggestionImage( |
| 289 suggestion_id, base::Bind(&ContentSuggestionsServiceTest::OnImageFetched, | 297 suggestion_id, base::Bind(&ContentSuggestionsServiceTest::OnImageFetched, |
| 290 base::Unretained(this))); | 298 base::Unretained(this))); |
| 291 run_loop.Run(); | 299 run_loop.Run(); |
| 292 } | 300 } |
| 293 | 301 |
| 294 TEST_F(ContentSuggestionsServiceTest, ShouldRedirectDismissSuggestion) { | 302 TEST_F(ContentSuggestionsServiceTest, ShouldRedirectDismissSuggestion) { |
| 295 Category articles_category = FromKnownCategory(KnownCategories::ARTICLES); | 303 Category articles_category = FromKnownCategory(KnownCategories::ARTICLES); |
| 296 Category offline_pages_category = | 304 Category offline_pages_category = |
| 297 FromKnownCategory(KnownCategories::BOOKMARKS); | 305 FromKnownCategory(KnownCategories::BOOKMARKS); |
| 298 MockProvider* provider1 = MakeProvider(articles_category); | 306 MockProvider* provider1 = RegisterProvider(articles_category); |
| 299 MockProvider* provider2 = MakeProvider(offline_pages_category); | 307 MockProvider* provider2 = RegisterProvider(offline_pages_category); |
| 300 | 308 |
| 301 provider2->FireSuggestionsChanged(offline_pages_category, {11}); | 309 provider2->FireSuggestionsChanged(offline_pages_category, {11}); |
| 302 std::string suggestion_id = CreateSuggestion(11).id(); | 310 std::string suggestion_id = CreateSuggestion(11).id(); |
| 303 | 311 |
| 304 EXPECT_CALL(*provider1, DismissSuggestion(_)).Times(0); | 312 EXPECT_CALL(*provider1, DismissSuggestion(_)).Times(0); |
| 305 EXPECT_CALL(*provider2, DismissSuggestion(suggestion_id)); | 313 EXPECT_CALL(*provider2, DismissSuggestion(suggestion_id)); |
| 306 service()->DismissSuggestion(suggestion_id); | 314 service()->DismissSuggestion(suggestion_id); |
| 307 } | 315 } |
| 308 | 316 |
| 309 TEST_F(ContentSuggestionsServiceTest, ShouldRedirectSuggestionInvalidated) { | 317 TEST_F(ContentSuggestionsServiceTest, ShouldRedirectSuggestionInvalidated) { |
| 310 Category articles_category = FromKnownCategory(KnownCategories::ARTICLES); | 318 Category articles_category = FromKnownCategory(KnownCategories::ARTICLES); |
| 311 | 319 |
| 312 MockProvider* provider = MakeProvider(articles_category); | 320 MockProvider* provider = RegisterProvider(articles_category); |
| 313 MockServiceObserver observer; | 321 MockServiceObserver observer; |
| 314 service()->AddObserver(&observer); | 322 service()->AddObserver(&observer); |
| 315 | 323 |
| 316 provider->FireSuggestionsChanged(articles_category, {11, 12, 13}); | 324 provider->FireSuggestionsChanged(articles_category, {11, 12, 13}); |
| 317 ExpectThatSuggestionsAre(articles_category, {11, 12, 13}); | 325 ExpectThatSuggestionsAre(articles_category, {11, 12, 13}); |
| 318 | 326 |
| 319 std::string suggestion_id = CreateSuggestion(12).id(); | 327 std::string suggestion_id = CreateSuggestion(12).id(); |
| 320 EXPECT_CALL(observer, | 328 EXPECT_CALL(observer, |
| 321 OnSuggestionInvalidated(articles_category, suggestion_id)); | 329 OnSuggestionInvalidated(articles_category, suggestion_id)); |
| 322 provider->FireSuggestionInvalidated(articles_category, suggestion_id); | 330 provider->FireSuggestionInvalidated(articles_category, suggestion_id); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 334 | 342 |
| 335 service()->RemoveObserver(&observer); | 343 service()->RemoveObserver(&observer); |
| 336 } | 344 } |
| 337 | 345 |
| 338 TEST_F(ContentSuggestionsServiceTest, ShouldForwardSuggestions) { | 346 TEST_F(ContentSuggestionsServiceTest, ShouldForwardSuggestions) { |
| 339 Category articles_category = FromKnownCategory(KnownCategories::ARTICLES); | 347 Category articles_category = FromKnownCategory(KnownCategories::ARTICLES); |
| 340 Category offline_pages_category = | 348 Category offline_pages_category = |
| 341 FromKnownCategory(KnownCategories::BOOKMARKS); | 349 FromKnownCategory(KnownCategories::BOOKMARKS); |
| 342 | 350 |
| 343 // Create and register providers | 351 // Create and register providers |
| 344 MockProvider* provider1 = MakeProvider(articles_category); | 352 MockProvider* provider1 = RegisterProvider(articles_category); |
| 345 MockProvider* provider2 = MakeProvider(offline_pages_category); | 353 MockProvider* provider2 = RegisterProvider(offline_pages_category); |
| 346 EXPECT_THAT(providers().at(articles_category), Eq(provider1)); | 354 EXPECT_THAT(providers().at(articles_category), Eq(provider1)); |
| 347 EXPECT_THAT(providers().at(offline_pages_category), Eq(provider2)); | 355 EXPECT_THAT(providers().at(offline_pages_category), Eq(provider2)); |
| 348 | 356 |
| 349 // Create and register observer | 357 // Create and register observer |
| 350 MockServiceObserver observer; | 358 MockServiceObserver observer; |
| 351 service()->AddObserver(&observer); | 359 service()->AddObserver(&observer); |
| 352 | 360 |
| 353 // Send suggestions 1 and 2 | 361 // Send suggestions 1 and 2 |
| 354 EXPECT_CALL(observer, OnNewSuggestions(articles_category)); | 362 EXPECT_CALL(observer, OnNewSuggestions(articles_category)); |
| 355 provider1->FireSuggestionsChanged(articles_category, {1, 2}); | 363 provider1->FireSuggestionsChanged(articles_category, {1, 2}); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 ExpectThatSuggestionsAre(offline_pages_category, std::vector<int>()); | 399 ExpectThatSuggestionsAre(offline_pages_category, std::vector<int>()); |
| 392 Mock::VerifyAndClearExpectations(&observer); | 400 Mock::VerifyAndClearExpectations(&observer); |
| 393 | 401 |
| 394 // Shutdown the service | 402 // Shutdown the service |
| 395 EXPECT_CALL(observer, ContentSuggestionsServiceShutdown()); | 403 EXPECT_CALL(observer, ContentSuggestionsServiceShutdown()); |
| 396 service()->Shutdown(); | 404 service()->Shutdown(); |
| 397 service()->RemoveObserver(&observer); | 405 service()->RemoveObserver(&observer); |
| 398 // The service will receive two Shutdown() calls. | 406 // The service will receive two Shutdown() calls. |
| 399 } | 407 } |
| 400 | 408 |
| 409 TEST_F(ContentSuggestionsServiceTest, |
| 410 ShouldNotReturnCategoryInfoForNonexistentCategory) { |
| 411 Category category = FromKnownCategory(KnownCategories::BOOKMARKS); |
| 412 base::Optional<CategoryInfo> result = service()->GetCategoryInfo(category); |
| 413 EXPECT_FALSE(result.has_value()); |
| 414 } |
| 415 |
| 416 TEST_F(ContentSuggestionsServiceTest, ShouldReturnCategoryInfo) { |
| 417 Category category = FromKnownCategory(KnownCategories::BOOKMARKS); |
| 418 MockProvider* provider = RegisterProvider(category); |
| 419 base::Optional<CategoryInfo> result = service()->GetCategoryInfo(category); |
| 420 ASSERT_TRUE(result.has_value()); |
| 421 CategoryInfo expected = provider->GetCategoryInfo(category); |
| 422 const CategoryInfo& actual = result.value(); |
| 423 EXPECT_THAT(expected.title(), Eq(actual.title())); |
| 424 EXPECT_THAT(expected.card_layout(), Eq(actual.card_layout())); |
| 425 EXPECT_THAT(expected.has_more_button(), Eq(actual.has_more_button())); |
| 426 } |
| 427 |
| 428 TEST_F(ContentSuggestionsServiceTest, |
| 429 ShouldRegisterNewCategoryOnNewSuggestions) { |
| 430 Category category = FromKnownCategory(KnownCategories::BOOKMARKS); |
| 431 MockProvider* provider = RegisterProvider(category); |
| 432 MockServiceObserver observer; |
| 433 service()->AddObserver(&observer); |
| 434 |
| 435 // Provider starts providing |new_category| without calling |
| 436 // |OnCategoryStatusChanged|. This is supported for now until further |
| 437 // reconsideration. |
| 438 Category new_category = FromKnownCategory(KnownCategories::ARTICLES); |
| 439 provider->SetProvidedCategories( |
| 440 std::vector<Category>({category, new_category})); |
| 441 |
| 442 EXPECT_CALL(observer, OnNewSuggestions(new_category)); |
| 443 EXPECT_CALL(observer, |
| 444 OnCategoryStatusChanged(new_category, CategoryStatus::AVAILABLE)); |
| 445 provider->FireSuggestionsChanged(new_category, {1, 2}); |
| 446 |
| 447 ExpectThatSuggestionsAre(new_category, {1, 2}); |
| 448 EXPECT_THAT(providers().at(category), Eq(provider)); |
| 449 EXPECT_THAT(service()->GetCategoryStatus(category), |
| 450 Eq(CategoryStatus::AVAILABLE)); |
| 451 EXPECT_THAT(providers().at(new_category), Eq(provider)); |
| 452 EXPECT_THAT(service()->GetCategoryStatus(new_category), |
| 453 Eq(CategoryStatus::AVAILABLE)); |
| 454 |
| 455 service()->RemoveObserver(&observer); |
| 456 } |
| 457 |
| 458 TEST_F(ContentSuggestionsServiceTest, |
| 459 ShouldRegisterNewCategoryOnCategoryStatusChanged) { |
| 460 Category category = FromKnownCategory(KnownCategories::BOOKMARKS); |
| 461 MockProvider* provider = RegisterProvider(category); |
| 462 MockServiceObserver observer; |
| 463 service()->AddObserver(&observer); |
| 464 |
| 465 // Provider starts providing |new_category| and calls |
| 466 // |OnCategoryStatusChanged|, but the category is not yet available. |
| 467 Category new_category = FromKnownCategory(KnownCategories::ARTICLES); |
| 468 provider->SetProvidedCategories( |
| 469 std::vector<Category>({category, new_category})); |
| 470 EXPECT_CALL(observer, OnCategoryStatusChanged(new_category, |
| 471 CategoryStatus::INITIALIZING)); |
| 472 provider->FireCategoryStatusChanged(new_category, |
| 473 CategoryStatus::INITIALIZING); |
| 474 |
| 475 EXPECT_THAT(providers().at(new_category), Eq(provider)); |
| 476 ExpectThatSuggestionsAre(new_category, std::vector<int>()); |
| 477 EXPECT_THAT(service()->GetCategoryStatus(new_category), |
| 478 Eq(CategoryStatus::INITIALIZING)); |
| 479 EXPECT_THAT(service()->GetCategories(), |
| 480 Eq(std::vector<Category>({category, new_category}))); |
| 481 |
| 482 service()->RemoveObserver(&observer); |
| 483 } |
| 484 |
| 485 TEST_F(ContentSuggestionsServiceTest, ShouldRemoveCategoryWhenNotProvided) { |
| 486 Category category = FromKnownCategory(KnownCategories::BOOKMARKS); |
| 487 MockProvider* provider = RegisterProvider(category); |
| 488 MockServiceObserver observer; |
| 489 service()->AddObserver(&observer); |
| 490 |
| 491 provider->FireSuggestionsChanged(category, {1, 2}); |
| 492 ExpectThatSuggestionsAre(category, {1, 2}); |
| 493 |
| 494 EXPECT_CALL(observer, |
| 495 OnCategoryStatusChanged(category, CategoryStatus::NOT_PROVIDED)); |
| 496 provider->FireCategoryStatusChanged(category, CategoryStatus::NOT_PROVIDED); |
| 497 |
| 498 EXPECT_THAT(service()->GetCategoryStatus(category), |
| 499 Eq(CategoryStatus::NOT_PROVIDED)); |
| 500 EXPECT_TRUE(service()->GetCategories().empty()); |
| 501 ExpectThatSuggestionsAre(category, std::vector<int>()); |
| 502 |
| 503 service()->RemoveObserver(&observer); |
| 504 } |
| 505 |
| 401 } // namespace ntp_snippets | 506 } // namespace ntp_snippets |
| OLD | NEW |