| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/remote/ntp_snippets_service.h" | 5 #include "components/ntp_snippets/remote/ntp_snippets_service.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 | 83 |
| 84 const char kSnippetUrl[] = "http://localhost/foobar"; | 84 const char kSnippetUrl[] = "http://localhost/foobar"; |
| 85 const char kSnippetTitle[] = "Title"; | 85 const char kSnippetTitle[] = "Title"; |
| 86 const char kSnippetText[] = "Snippet"; | 86 const char kSnippetText[] = "Snippet"; |
| 87 const char kSnippetSalientImage[] = "http://localhost/salient_image"; | 87 const char kSnippetSalientImage[] = "http://localhost/salient_image"; |
| 88 const char kSnippetPublisherName[] = "Foo News"; | 88 const char kSnippetPublisherName[] = "Foo News"; |
| 89 const char kSnippetAmpUrl[] = "http://localhost/amp"; | 89 const char kSnippetAmpUrl[] = "http://localhost/amp"; |
| 90 | 90 |
| 91 const char kSnippetUrl2[] = "http://foo.com/bar"; | 91 const char kSnippetUrl2[] = "http://foo.com/bar"; |
| 92 | 92 |
| 93 const char kTestJsonDefaultCategoryTitle[] = "Some title"; |
| 94 |
| 93 base::Time GetDefaultCreationTime() { | 95 base::Time GetDefaultCreationTime() { |
| 94 base::Time out_time; | 96 base::Time out_time; |
| 95 EXPECT_TRUE(base::Time::FromUTCExploded(kDefaultCreationTime, &out_time)); | 97 EXPECT_TRUE(base::Time::FromUTCExploded(kDefaultCreationTime, &out_time)); |
| 96 return out_time; | 98 return out_time; |
| 97 } | 99 } |
| 98 | 100 |
| 99 base::Time GetDefaultExpirationTime() { | 101 base::Time GetDefaultExpirationTime() { |
| 100 return base::Time::Now() + base::TimeDelta::FromHours(1); | 102 return base::Time::Now() + base::TimeDelta::FromHours(1); |
| 101 } | 103 } |
| 102 | 104 |
| 103 std::string GetTestJson(const std::vector<std::string>& snippets) { | 105 std::string GetTestJson(const std::vector<std::string>& snippets, |
| 106 const std::string& category_title) { |
| 104 return base::StringPrintf( | 107 return base::StringPrintf( |
| 105 "{\n" | 108 "{\n" |
| 106 " \"categories\": [{\n" | 109 " \"categories\": [{\n" |
| 107 " \"id\": 1,\n" | 110 " \"id\": 1,\n" |
| 108 " \"localizedTitle\": \"Articles for You\",\n" | 111 " \"localizedTitle\": \"%s\",\n" |
| 109 " \"suggestions\": [%s]\n" | 112 " \"suggestions\": [%s]\n" |
| 110 " }]\n" | 113 " }]\n" |
| 111 "}\n", | 114 "}\n", |
| 115 category_title.c_str(), |
| 112 base::JoinString(snippets, ", ").c_str()); | 116 base::JoinString(snippets, ", ").c_str()); |
| 113 } | 117 } |
| 114 | 118 |
| 119 std::string GetTestJson(const std::vector<std::string>& snippets) { |
| 120 return GetTestJson(snippets, kTestJsonDefaultCategoryTitle); |
| 121 } |
| 122 |
| 123 std::string GetTestJsonWithoutTitle(const std::vector<std::string>& snippets) { |
| 124 return GetTestJson(snippets, std::string()); |
| 125 } |
| 126 |
| 115 std::string GetMultiCategoryJson(const std::vector<std::string>& articles, | 127 std::string GetMultiCategoryJson(const std::vector<std::string>& articles, |
| 116 const std::vector<std::string>& others) { | 128 const std::vector<std::string>& others) { |
| 117 return base::StringPrintf( | 129 return base::StringPrintf( |
| 118 "{\n" | 130 "{\n" |
| 119 " \"categories\": [{\n" | 131 " \"categories\": [{\n" |
| 120 " \"id\": 1,\n" | 132 " \"id\": 1,\n" |
| 121 " \"localizedTitle\": \"Articles for You\",\n" | 133 " \"localizedTitle\": \"Articles for You\",\n" |
| 122 " \"suggestions\": [%s]\n" | 134 " \"suggestions\": [%s]\n" |
| 123 " }, {\n" | 135 " }, {\n" |
| 124 " \"id\": 2,\n" | 136 " \"id\": 2,\n" |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 utils_.pref_service())); | 442 utils_.pref_service())); |
| 431 } | 443 } |
| 432 | 444 |
| 433 void WaitForSnippetsServiceInitialization(bool set_empty_response = true) { | 445 void WaitForSnippetsServiceInitialization(bool set_empty_response = true) { |
| 434 EXPECT_TRUE(observer_); | 446 EXPECT_TRUE(observer_); |
| 435 EXPECT_FALSE(observer_->Loaded()); | 447 EXPECT_FALSE(observer_->Loaded()); |
| 436 | 448 |
| 437 // Add an initial fetch response, as the service tries to fetch when there | 449 // Add an initial fetch response, as the service tries to fetch when there |
| 438 // is nothing in the DB. | 450 // is nothing in the DB. |
| 439 if (set_empty_response) | 451 if (set_empty_response) |
| 440 SetUpFetchResponse(GetTestJson(std::vector<std::string>())); | 452 SetUpFetchResponse(GetTestJsonWithoutTitle(std::vector<std::string>())); |
| 441 | 453 |
| 442 base::RunLoop().RunUntilIdle(); | 454 base::RunLoop().RunUntilIdle(); |
| 443 observer_->WaitForLoad(); | 455 observer_->WaitForLoad(); |
| 444 } | 456 } |
| 445 | 457 |
| 446 void ResetSnippetsService(std::unique_ptr<NTPSnippetsService>* service) { | 458 void ResetSnippetsService(std::unique_ptr<NTPSnippetsService>* service) { |
| 447 service->reset(); | 459 service->reset(); |
| 448 observer_.reset(); | 460 observer_.reset(); |
| 449 *service = MakeSnippetsService(); | 461 *service = MakeSnippetsService(); |
| 450 } | 462 } |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 635 | 647 |
| 636 EXPECT_EQ(MakeArticleID(kSnippetUrl), suggestion.id()); | 648 EXPECT_EQ(MakeArticleID(kSnippetUrl), suggestion.id()); |
| 637 EXPECT_EQ(kSnippetTitle, base::UTF16ToUTF8(suggestion.title())); | 649 EXPECT_EQ(kSnippetTitle, base::UTF16ToUTF8(suggestion.title())); |
| 638 EXPECT_EQ(kSnippetText, base::UTF16ToUTF8(suggestion.snippet_text())); | 650 EXPECT_EQ(kSnippetText, base::UTF16ToUTF8(suggestion.snippet_text())); |
| 639 EXPECT_EQ(GetDefaultCreationTime(), suggestion.publish_date()); | 651 EXPECT_EQ(GetDefaultCreationTime(), suggestion.publish_date()); |
| 640 EXPECT_EQ(kSnippetPublisherName, | 652 EXPECT_EQ(kSnippetPublisherName, |
| 641 base::UTF16ToUTF8(suggestion.publisher_name())); | 653 base::UTF16ToUTF8(suggestion.publisher_name())); |
| 642 EXPECT_EQ(GURL(kSnippetAmpUrl), suggestion.amp_url()); | 654 EXPECT_EQ(GURL(kSnippetAmpUrl), suggestion.amp_url()); |
| 643 } | 655 } |
| 644 | 656 |
| 657 TEST_F(NTPSnippetsServiceTest, CategoryTitle) { |
| 658 const base::string16 response_title = |
| 659 base::UTF8ToUTF16(kTestJsonDefaultCategoryTitle); |
| 660 |
| 661 auto service = MakeSnippetsService(); |
| 662 |
| 663 // The articles category should be there by default, and have a title. |
| 664 CategoryInfo info_before = service->GetCategoryInfo(articles_category()); |
| 665 ASSERT_FALSE(info_before.title().empty()); |
| 666 ASSERT_NE(info_before.title(), response_title); |
| 667 |
| 668 std::string json_str_no_title(GetTestJsonWithoutTitle({GetSnippet()})); |
| 669 LoadFromJSONString(service.get(), json_str_no_title); |
| 670 |
| 671 ASSERT_THAT(observer().SuggestionsForCategory(articles_category()), |
| 672 SizeIs(1)); |
| 673 ASSERT_THAT(service->GetSnippetsForTesting(articles_category()), SizeIs(1)); |
| 674 |
| 675 // The response didn't contain a category title. Make sure we didn't touch |
| 676 // the existing one. |
| 677 CategoryInfo info_no_title = service->GetCategoryInfo(articles_category()); |
| 678 EXPECT_EQ(info_before.title(), info_no_title.title()); |
| 679 |
| 680 std::string json_str_with_title(GetTestJson({GetSnippet()})); |
| 681 LoadFromJSONString(service.get(), json_str_with_title); |
| 682 |
| 683 ASSERT_THAT(observer().SuggestionsForCategory(articles_category()), |
| 684 SizeIs(1)); |
| 685 ASSERT_THAT(service->GetSnippetsForTesting(articles_category()), SizeIs(1)); |
| 686 |
| 687 // This time, the response contained a title, |kTestJsonDefaultCategoryTitle|. |
| 688 // Make sure we updated the title in the CategoryInfo. |
| 689 CategoryInfo info_with_title = service->GetCategoryInfo(articles_category()); |
| 690 EXPECT_NE(info_before.title(), info_with_title.title()); |
| 691 EXPECT_EQ(response_title, info_with_title.title()); |
| 692 } |
| 693 |
| 645 TEST_F(NTPSnippetsServiceTest, MultipleCategories) { | 694 TEST_F(NTPSnippetsServiceTest, MultipleCategories) { |
| 646 std::string json_str( | 695 std::string json_str( |
| 647 GetMultiCategoryJson({GetSnippetN(0)}, {GetSnippetN(1)})); | 696 GetMultiCategoryJson({GetSnippetN(0)}, {GetSnippetN(1)})); |
| 648 | 697 |
| 649 auto service = MakeSnippetsService(); | 698 auto service = MakeSnippetsService(); |
| 650 | 699 |
| 651 LoadFromJSONString(service.get(), json_str); | 700 LoadFromJSONString(service.get(), json_str); |
| 652 | 701 |
| 653 ASSERT_THAT(observer().statuses(), | 702 ASSERT_THAT(observer().statuses(), |
| 654 Eq(std::map<Category, CategoryStatus, Category::CompareByID>{ | 703 Eq(std::map<Category, CategoryStatus, Category::CompareByID>{ |
| (...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1181 base::StringPrintf("http://localhost/snippet-id-%d", i))); | 1230 base::StringPrintf("http://localhost/snippet-id-%d", i))); |
| 1182 } | 1231 } |
| 1183 LoadFromJSONString(service.get(), GetTestJson(suggestions)); | 1232 LoadFromJSONString(service.get(), GetTestJson(suggestions)); |
| 1184 // TODO(tschumann): We should probably trim out any additional results and | 1233 // TODO(tschumann): We should probably trim out any additional results and |
| 1185 // only serve the MaxSnippetCount items. | 1234 // only serve the MaxSnippetCount items. |
| 1186 EXPECT_THAT(service->GetSnippetsForTesting(articles_category()), | 1235 EXPECT_THAT(service->GetSnippetsForTesting(articles_category()), |
| 1187 SizeIs(service->GetMaxSnippetCountForTesting() + 1)); | 1236 SizeIs(service->GetMaxSnippetCountForTesting() + 1)); |
| 1188 } | 1237 } |
| 1189 | 1238 |
| 1190 } // namespace ntp_snippets | 1239 } // namespace ntp_snippets |
| OLD | NEW |