blob: 78d6b034acb3b9af970a915ee9ba8b2187fd84d6 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/quick_insert/model/quick_insert_link_suggester.h"
#include "base/files/scoped_temp_dir.h"
#include "base/test/gmock_callback_support.h"
#include "base/test/mock_callback.h"
#include "base/test/task_environment.h"
#include "base/test/test_future.h"
#include "components/favicon/core/test/mock_favicon_service.h"
#include "components/history/core/browser/history_service.h"
#include "components/history/core/browser/history_types.h"
#include "components/history/core/test/history_service_test_util.h"
namespace ash {
namespace {
using ::testing::Field;
class TestFaviconService : public favicon::MockFaviconService {
public:
TestFaviconService() = default;
TestFaviconService(const TestFaviconService&) = delete;
TestFaviconService& operator=(const TestFaviconService&) = delete;
~TestFaviconService() override = default;
// favicon::FaviconService:
base::CancelableTaskTracker::TaskId GetFaviconImageForPageURL(
const GURL& page_url,
favicon_base::FaviconImageCallback callback,
base::CancelableTaskTracker* tracker) override {
page_url_ = page_url;
std::move(callback).Run(favicon_base::FaviconImageResult());
return {};
}
GURL page_url_;
};
class QuickInsertLinkSuggesterTest : public testing::Test {
public:
QuickInsertLinkSuggesterTest() {
CHECK(history_dir_.CreateUniqueTempDir());
history_service_ =
history::CreateHistoryService(history_dir_.GetPath(), true);
}
history::HistoryService* GetHistoryService() {
return history_service_.get();
}
private:
base::test::TaskEnvironment task_environment_;
base::ScopedTempDir history_dir_;
std::unique_ptr<history::HistoryService> history_service_;
};
TEST_F(QuickInsertLinkSuggesterTest, GetSuggestedLinkResultsReturnsLinks) {
const base::Time now = base::Time::Now();
auto* history_service = GetHistoryService();
history_service->AddPageWithDetails(
GURL("http://a.com"), /*title=*/u"", /*visit_count=*/1,
/*typed_count=*/1,
/*last_visit=*/now - base::Seconds(1),
/*hidden=*/false, history::SOURCE_BROWSED);
history_service->AddPageWithDetails(
GURL("http://b.com"), /*title=*/u"", /*visit_count=*/1,
/*typed_count=*/1,
/*last_visit=*/now,
/*hidden=*/false, history::SOURCE_BROWSED);
history::BlockUntilHistoryProcessesPendingRequests(history_service);
TestFaviconService favicon_service;
QuickInsertLinkSuggester link_suggester;
base::test::TestFuture<std::vector<ash::QuickInsertSearchResult>> future;
link_suggester.GetSuggestedLinks(history_service, &favicon_service, 100u,
future.GetRepeatingCallback());
EXPECT_THAT(
future.Get(),
ElementsAre(VariantWith<ash::QuickInsertBrowsingHistoryResult>(
Field("url", &ash::QuickInsertBrowsingHistoryResult::url,
GURL("http://b.com"))),
VariantWith<ash::QuickInsertBrowsingHistoryResult>(
Field("url", &ash::QuickInsertBrowsingHistoryResult::url,
GURL("http://a.com")))));
EXPECT_EQ(favicon_service.page_url_, GURL("http://a.com"));
}
TEST_F(QuickInsertLinkSuggesterTest,
GetSuggestedLinkResultsAreTruncatedToMostRecent) {
const base::Time now = base::Time::Now();
auto* history_service = GetHistoryService();
history_service->AddPageWithDetails(
GURL("http://a.com"), /*title=*/u"", /*visit_count=*/1,
/*typed_count=*/1,
/*last_visit=*/now - base::Seconds(1),
/*hidden=*/false, history::SOURCE_BROWSED);
history_service->AddPageWithDetails(
GURL("http://b.com"), /*title=*/u"", /*visit_count=*/1,
/*typed_count=*/1,
/*last_visit=*/now,
/*hidden=*/false, history::SOURCE_BROWSED);
history::BlockUntilHistoryProcessesPendingRequests(history_service);
TestFaviconService favicon_service;
QuickInsertLinkSuggester link_suggester;
base::test::TestFuture<std::vector<ash::QuickInsertSearchResult>> future;
link_suggester.GetSuggestedLinks(history_service, &favicon_service, 1u,
future.GetRepeatingCallback());
EXPECT_THAT(future.Get(),
ElementsAre(VariantWith<ash::QuickInsertBrowsingHistoryResult>(
Field("url", &ash::QuickInsertBrowsingHistoryResult::url,
GURL("http://b.com")))));
EXPECT_EQ(favicon_service.page_url_, GURL("http://b.com"));
}
TEST_F(QuickInsertLinkSuggesterTest,
GetSuggestedLinkResultsFiltersOutPersonalizedLinks) {
const base::Time now = base::Time::Now();
auto* history_service = GetHistoryService();
history_service->AddPageWithDetails(
GURL("https://mail.google.com/mail/u/0/#inbox/aaa"), /*title=*/u"",
/*visit_count=*/1,
/*typed_count=*/1,
/*last_visit=*/now - base::Seconds(1),
/*hidden=*/false, history::SOURCE_BROWSED);
history_service->AddPageWithDetails(
GURL("https://mail.google.com/chat/u/0/#chat/aaa"), /*title=*/u"",
/*visit_count=*/1,
/*typed_count=*/1,
/*last_visit=*/now,
/*hidden=*/false, history::SOURCE_BROWSED);
history_service->AddPageWithDetails(
GURL("https://mail.google.com"), /*title=*/u"", /*visit_count=*/1,
/*typed_count=*/1,
/*last_visit=*/now,
/*hidden=*/false, history::SOURCE_BROWSED);
history::BlockUntilHistoryProcessesPendingRequests(history_service);
QuickInsertLinkSuggester link_suggester;
base::test::TestFuture<std::vector<ash::QuickInsertSearchResult>> future;
link_suggester.GetSuggestedLinks(history_service,
/*favicon_service=*/nullptr, 100u,
future.GetRepeatingCallback());
EXPECT_THAT(future.Get(),
ElementsAre(VariantWith<ash::QuickInsertBrowsingHistoryResult>(
Field("url", &ash::QuickInsertBrowsingHistoryResult::url,
GURL("https://mail.google.com")))));
}
} // namespace
} // namespace ash