remote_suggestion_builder.cc 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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
  3. // found in the LICENSE file.
  4. #include "components/ntp_snippets/remote/remote_suggestion_builder.h"
  5. #include <limits>
  6. #include <memory>
  7. #include "base/strings/utf_string_conversions.h"
  8. #include "base/time/time.h"
  9. #include "components/ntp_snippets/remote/proto/ntp_snippets.pb.h"
  10. #include "components/ntp_snippets/time_serialization.h"
  11. #include "testing/gtest/include/gtest/gtest.h"
  12. namespace ntp_snippets {
  13. namespace test {
  14. namespace {
  15. base::Time GetDefaultSuggestionCreationTime() {
  16. base::Time out_time;
  17. EXPECT_TRUE(base::Time::FromUTCString("2000-01-01T00:00:01Z", &out_time));
  18. return out_time;
  19. }
  20. base::Time GetDefaultSuggestionExpirationTime() {
  21. base::Time out_time;
  22. EXPECT_TRUE(base::Time::FromUTCString("2100-01-01T00:00:01Z", &out_time));
  23. return out_time;
  24. }
  25. } // namespace
  26. RemoteSuggestionBuilder::RemoteSuggestionBuilder() = default;
  27. RemoteSuggestionBuilder::RemoteSuggestionBuilder(
  28. const RemoteSuggestionBuilder& other) = default;
  29. RemoteSuggestionBuilder::~RemoteSuggestionBuilder() = default;
  30. RemoteSuggestionBuilder& RemoteSuggestionBuilder::AddId(const std::string& id) {
  31. if (!ids_) {
  32. ids_ = std::vector<std::string>();
  33. }
  34. ids_->push_back(id);
  35. return *this;
  36. }
  37. RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetTitle(
  38. const std::string& title) {
  39. title_ = title;
  40. return *this;
  41. }
  42. RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetSnippet(
  43. const std::string& snippet) {
  44. snippet_ = snippet;
  45. return *this;
  46. }
  47. RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetImageUrl(
  48. const std::string& image_url) {
  49. salient_image_url_ = image_url;
  50. return *this;
  51. }
  52. RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetPublishDate(
  53. const base::Time& publish_date) {
  54. publish_date_ = publish_date;
  55. return *this;
  56. }
  57. RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetExpiryDate(
  58. const base::Time& expiry_date) {
  59. expiry_date_ = expiry_date;
  60. return *this;
  61. }
  62. RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetScore(double score) {
  63. score_ = score;
  64. return *this;
  65. }
  66. RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetIsDismissed(
  67. bool is_dismissed) {
  68. is_dismissed_ = is_dismissed;
  69. return *this;
  70. }
  71. RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetRemoteCategoryId(
  72. int remote_category_id) {
  73. remote_category_id_ = remote_category_id;
  74. return *this;
  75. }
  76. RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetUrl(
  77. const std::string& url) {
  78. url_ = url;
  79. return *this;
  80. }
  81. RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetPublisher(
  82. const std::string& publisher) {
  83. publisher_name_ = publisher;
  84. return *this;
  85. }
  86. RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetAmpUrl(
  87. const std::string& amp_url) {
  88. amp_url_ = amp_url;
  89. return *this;
  90. }
  91. RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetFetchDate(
  92. const base::Time& fetch_date) {
  93. fetch_date_ = fetch_date;
  94. return *this;
  95. }
  96. RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetRank(int rank) {
  97. rank_ = rank;
  98. return *this;
  99. }
  100. RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetShouldNotify(
  101. bool should_notify) {
  102. should_notify_ = should_notify;
  103. return *this;
  104. }
  105. RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetNotificationDeadline(
  106. const base::Time& notification_deadline) {
  107. notification_deadline_ = notification_deadline;
  108. return *this;
  109. }
  110. std::unique_ptr<RemoteSuggestion> RemoteSuggestionBuilder::Build() const {
  111. SnippetProto proto;
  112. proto.set_title(title_.value_or("Title"));
  113. proto.set_snippet(snippet_.value_or("Snippet"));
  114. proto.set_salient_image_url(
  115. salient_image_url_.value_or("http://image_url.com/"));
  116. proto.set_publish_date(SerializeTime(
  117. publish_date_.value_or(GetDefaultSuggestionCreationTime())));
  118. proto.set_expiry_date(SerializeTime(
  119. expiry_date_.value_or(GetDefaultSuggestionExpirationTime())));
  120. proto.set_score(score_.value_or(1));
  121. proto.set_dismissed(is_dismissed_.value_or(false));
  122. proto.set_remote_category_id(remote_category_id_.value_or(1));
  123. auto* source = proto.mutable_source();
  124. source->set_url(url_.value_or("http://url.com/"));
  125. source->set_publisher_name(publisher_name_.value_or("Publisher"));
  126. source->set_amp_url(amp_url_.value_or("http://amp_url.com/"));
  127. proto.set_fetch_date(SerializeTime(fetch_date_.value_or(base::Time::Now())));
  128. for (const auto& id :
  129. ids_.value_or(std::vector<std::string>{source->url()})) {
  130. proto.add_ids(id);
  131. }
  132. proto.set_rank(rank_.value_or(std::numeric_limits<int>::max()));
  133. std::unique_ptr<RemoteSuggestion> suggestion =
  134. RemoteSuggestion::CreateFromProto(proto);
  135. suggestion->set_should_notify(should_notify_.value_or(false));
  136. suggestion->set_notification_deadline(
  137. notification_deadline_.value_or(base::Time()));
  138. return suggestion;
  139. }
  140. FetchedCategoryBuilder::FetchedCategoryBuilder() = default;
  141. FetchedCategoryBuilder::FetchedCategoryBuilder(
  142. const FetchedCategoryBuilder& other) = default;
  143. FetchedCategoryBuilder::~FetchedCategoryBuilder() = default;
  144. FetchedCategoryBuilder& FetchedCategoryBuilder::SetCategory(Category category) {
  145. category_ = category;
  146. return *this;
  147. }
  148. FetchedCategoryBuilder& FetchedCategoryBuilder::SetTitle(
  149. const std::string& title) {
  150. title_ = base::UTF8ToUTF16(title);
  151. return *this;
  152. }
  153. FetchedCategoryBuilder& FetchedCategoryBuilder::SetCardLayout(
  154. ContentSuggestionsCardLayout card_layout) {
  155. card_layout_ = card_layout;
  156. return *this;
  157. }
  158. FetchedCategoryBuilder& FetchedCategoryBuilder::SetAdditionalAction(
  159. ContentSuggestionsAdditionalAction additional_action) {
  160. additional_action_ = additional_action;
  161. return *this;
  162. }
  163. FetchedCategoryBuilder& FetchedCategoryBuilder::SetShowIfEmpty(
  164. bool show_if_empty) {
  165. show_if_empty_ = show_if_empty;
  166. return *this;
  167. }
  168. FetchedCategoryBuilder& FetchedCategoryBuilder::SetNoSuggestionsMessage(
  169. const std::string& no_suggestions_message) {
  170. no_suggestions_message_ = base::UTF8ToUTF16(no_suggestions_message);
  171. return *this;
  172. }
  173. FetchedCategoryBuilder& FetchedCategoryBuilder::AddSuggestionViaBuilder(
  174. const RemoteSuggestionBuilder& builder) {
  175. if (!suggestion_builders_) {
  176. suggestion_builders_ = std::vector<RemoteSuggestionBuilder>();
  177. }
  178. suggestion_builders_->push_back(builder);
  179. return *this;
  180. }
  181. FetchedCategory FetchedCategoryBuilder::Build() const {
  182. FetchedCategory result = FetchedCategory(
  183. category_.value_or(Category::FromRemoteCategory(1)),
  184. CategoryInfo(
  185. title_.value_or(u"Category title"),
  186. card_layout_.value_or(ContentSuggestionsCardLayout::FULL_CARD),
  187. additional_action_.value_or(
  188. ContentSuggestionsAdditionalAction::FETCH),
  189. show_if_empty_.value_or(false),
  190. no_suggestions_message_.value_or(u"No suggestions message")));
  191. if (suggestion_builders_) {
  192. for (const auto& suggestion_builder : *suggestion_builders_)
  193. result.suggestions.push_back(suggestion_builder.Build());
  194. }
  195. return result;
  196. }
  197. } // namespace test
  198. } // namespace ntp_snippets