| // Copyright 2016 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. |
| |
| #include "components/ntp_snippets/remote/remote_suggestion_builder.h" |
| |
| #include <limits> |
| #include <memory> |
| |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/time/time.h" |
| #include "components/ntp_snippets/remote/proto/ntp_snippets.pb.h" |
| #include "components/ntp_snippets/time_serialization.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace ntp_snippets { |
| |
| namespace test { |
| |
| namespace { |
| |
| base::Time GetDefaultSuggestionCreationTime() { |
| base::Time out_time; |
| EXPECT_TRUE(base::Time::FromUTCString("2000-01-01T00:00:01Z", &out_time)); |
| return out_time; |
| } |
| |
| base::Time GetDefaultSuggestionExpirationTime() { |
| base::Time out_time; |
| EXPECT_TRUE(base::Time::FromUTCString("2100-01-01T00:00:01Z", &out_time)); |
| return out_time; |
| } |
| |
| } // namespace |
| |
| RemoteSuggestionBuilder::RemoteSuggestionBuilder() = default; |
| RemoteSuggestionBuilder::RemoteSuggestionBuilder( |
| const RemoteSuggestionBuilder& other) = default; |
| RemoteSuggestionBuilder::~RemoteSuggestionBuilder() = default; |
| |
| RemoteSuggestionBuilder& RemoteSuggestionBuilder::AddId(const std::string& id) { |
| if (!ids_) { |
| ids_ = std::vector<std::string>(); |
| } |
| ids_->push_back(id); |
| return *this; |
| } |
| |
| RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetTitle( |
| const std::string& title) { |
| title_ = title; |
| return *this; |
| } |
| |
| RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetSnippet( |
| const std::string& snippet) { |
| snippet_ = snippet; |
| return *this; |
| } |
| |
| RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetImageUrl( |
| const std::string& image_url) { |
| salient_image_url_ = image_url; |
| return *this; |
| } |
| |
| RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetPublishDate( |
| const base::Time& publish_date) { |
| publish_date_ = publish_date; |
| return *this; |
| } |
| |
| RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetExpiryDate( |
| const base::Time& expiry_date) { |
| expiry_date_ = expiry_date; |
| return *this; |
| } |
| |
| RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetScore(double score) { |
| score_ = score; |
| return *this; |
| } |
| |
| RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetIsDismissed( |
| bool is_dismissed) { |
| is_dismissed_ = is_dismissed; |
| return *this; |
| } |
| |
| RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetRemoteCategoryId( |
| int remote_category_id) { |
| remote_category_id_ = remote_category_id; |
| return *this; |
| } |
| |
| RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetUrl( |
| const std::string& url) { |
| url_ = url; |
| return *this; |
| } |
| |
| RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetPublisher( |
| const std::string& publisher) { |
| publisher_name_ = publisher; |
| return *this; |
| } |
| |
| RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetAmpUrl( |
| const std::string& amp_url) { |
| amp_url_ = amp_url; |
| return *this; |
| } |
| |
| RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetFetchDate( |
| const base::Time& fetch_date) { |
| fetch_date_ = fetch_date; |
| return *this; |
| } |
| |
| RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetRank(int rank) { |
| rank_ = rank; |
| return *this; |
| } |
| |
| RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetShouldNotify( |
| bool should_notify) { |
| should_notify_ = should_notify; |
| return *this; |
| } |
| |
| RemoteSuggestionBuilder& RemoteSuggestionBuilder::SetNotificationDeadline( |
| const base::Time& notification_deadline) { |
| notification_deadline_ = notification_deadline; |
| return *this; |
| } |
| |
| std::unique_ptr<RemoteSuggestion> RemoteSuggestionBuilder::Build() const { |
| SnippetProto proto; |
| proto.set_title(title_.value_or("Title")); |
| proto.set_snippet(snippet_.value_or("Snippet")); |
| proto.set_salient_image_url( |
| salient_image_url_.value_or("http://image_url.com/")); |
| proto.set_publish_date(SerializeTime( |
| publish_date_.value_or(GetDefaultSuggestionCreationTime()))); |
| proto.set_expiry_date(SerializeTime( |
| expiry_date_.value_or(GetDefaultSuggestionExpirationTime()))); |
| proto.set_score(score_.value_or(1)); |
| proto.set_dismissed(is_dismissed_.value_or(false)); |
| proto.set_remote_category_id(remote_category_id_.value_or(1)); |
| auto* source = proto.mutable_source(); |
| source->set_url(url_.value_or("http://url.com/")); |
| source->set_publisher_name(publisher_name_.value_or("Publisher")); |
| source->set_amp_url(amp_url_.value_or("http://amp_url.com/")); |
| proto.set_fetch_date(SerializeTime(fetch_date_.value_or(base::Time::Now()))); |
| for (const auto& id : |
| ids_.value_or(std::vector<std::string>{source->url()})) { |
| proto.add_ids(id); |
| } |
| proto.set_rank(rank_.value_or(std::numeric_limits<int>::max())); |
| std::unique_ptr<RemoteSuggestion> suggestion = |
| RemoteSuggestion::CreateFromProto(proto); |
| suggestion->set_should_notify(should_notify_.value_or(false)); |
| suggestion->set_notification_deadline( |
| notification_deadline_.value_or(base::Time())); |
| return suggestion; |
| } |
| |
| FetchedCategoryBuilder::FetchedCategoryBuilder() = default; |
| FetchedCategoryBuilder::FetchedCategoryBuilder( |
| const FetchedCategoryBuilder& other) = default; |
| FetchedCategoryBuilder::~FetchedCategoryBuilder() = default; |
| |
| FetchedCategoryBuilder& FetchedCategoryBuilder::SetCategory(Category category) { |
| category_ = category; |
| return *this; |
| } |
| |
| FetchedCategoryBuilder& FetchedCategoryBuilder::SetTitle( |
| const std::string& title) { |
| title_ = base::UTF8ToUTF16(title); |
| return *this; |
| } |
| |
| FetchedCategoryBuilder& FetchedCategoryBuilder::SetCardLayout( |
| ContentSuggestionsCardLayout card_layout) { |
| card_layout_ = card_layout; |
| return *this; |
| } |
| |
| FetchedCategoryBuilder& FetchedCategoryBuilder::SetAdditionalAction( |
| ContentSuggestionsAdditionalAction additional_action) { |
| additional_action_ = additional_action; |
| return *this; |
| } |
| |
| FetchedCategoryBuilder& FetchedCategoryBuilder::SetShowIfEmpty( |
| bool show_if_empty) { |
| show_if_empty_ = show_if_empty; |
| return *this; |
| } |
| |
| FetchedCategoryBuilder& FetchedCategoryBuilder::SetNoSuggestionsMessage( |
| const std::string& no_suggestions_message) { |
| no_suggestions_message_ = base::UTF8ToUTF16(no_suggestions_message); |
| return *this; |
| } |
| |
| FetchedCategoryBuilder& FetchedCategoryBuilder::AddSuggestionViaBuilder( |
| const RemoteSuggestionBuilder& builder) { |
| if (!suggestion_builders_) { |
| suggestion_builders_ = std::vector<RemoteSuggestionBuilder>(); |
| } |
| suggestion_builders_->push_back(builder); |
| return *this; |
| } |
| |
| FetchedCategory FetchedCategoryBuilder::Build() const { |
| FetchedCategory result = FetchedCategory( |
| category_.value_or(Category::FromRemoteCategory(1)), |
| CategoryInfo( |
| title_.value_or(base::UTF8ToUTF16("Category title")), |
| card_layout_.value_or(ContentSuggestionsCardLayout::FULL_CARD), |
| additional_action_.value_or( |
| ContentSuggestionsAdditionalAction::FETCH), |
| show_if_empty_.value_or(false), |
| no_suggestions_message_.value_or( |
| base::UTF8ToUTF16("No suggestions message")))); |
| |
| if (suggestion_builders_) { |
| for (const auto& suggestion_builder : *suggestion_builders_) |
| result.suggestions.push_back(suggestion_builder.Build()); |
| } |
| return result; |
| } |
| |
| } // namespace test |
| |
| } // namespace ntp_snippets |