blob: 4c9e2d023e2701ce0ebb8956704a2b07ac53d76f [file] [log] [blame]
// Copyright 2018 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_tiles/custom_links_manager_impl.h"
#include <stdint.h>
#include <memory>
#include "base/strings/utf_string_conversions.h"
#include "components/sync_preferences/testing_pref_service_syncable.h"
#include "testing/gtest/include/gtest/gtest.h"
using sync_preferences::TestingPrefServiceSyncable;
namespace ntp_tiles {
namespace {
struct TestCaseItem {
const char* url;
const char* title;
};
const TestCaseItem kTestCase1[] = {{"http://foo1.com/", "Foo1"}};
const TestCaseItem kTestCase2[] = {
{"http://foo1.com/", "Foo1"},
{"http://foo2.com/", "Foo2"},
};
const TestCaseItem kTestCaseMax[] = {
{"http://foo1.com/", "Foo1"}, {"http://foo2.com/", "Foo2"},
{"http://foo3.com/", "Foo3"}, {"http://foo4.com/", "Foo4"},
{"http://foo5.com/", "Foo5"}, {"http://foo6.com/", "Foo6"},
{"http://foo7.com/", "Foo7"}, {"http://foo8.com/", "Foo8"},
{"http://foo9.com/", "Foo9"}, {"http://foo10.com/", "Foo10"},
};
const char kTestTitle[] = "Test";
const char kTestUrl[] = "http://test.com/";
void AddTile(NTPTilesVector* tiles, const char* url, const char* title) {
NTPTile tile;
tile.url = GURL(url);
tile.title = base::UTF8ToUTF16(title);
tiles->push_back(std::move(tile));
}
NTPTilesVector FillTestTiles(base::span<const TestCaseItem> test_cases) {
NTPTilesVector tiles;
for (const auto& test_case : test_cases) {
AddTile(&tiles, test_case.url, test_case.title);
}
return tiles;
}
std::vector<CustomLinksManager::Link> FillTestLinks(
base::span<const TestCaseItem> test_cases) {
std::vector<CustomLinksManager::Link> links;
for (const auto& test_case : test_cases) {
links.emplace_back(CustomLinksManager::Link{
GURL(test_case.url), base::UTF8ToUTF16(test_case.title)});
}
return links;
}
} // namespace
class CustomLinksManagerImplTest : public testing::Test {
public:
CustomLinksManagerImplTest() {
CustomLinksManagerImpl::RegisterProfilePrefs(prefs_.registry());
custom_links_ = std::make_unique<CustomLinksManagerImpl>(&prefs_);
}
protected:
sync_preferences::TestingPrefServiceSyncable prefs_;
std::unique_ptr<CustomLinksManagerImpl> custom_links_;
DISALLOW_COPY_AND_ASSIGN(CustomLinksManagerImplTest);
};
TEST_F(CustomLinksManagerImplTest, InitializeOnlyOnce) {
NTPTilesVector initial_tiles = FillTestTiles(kTestCase1);
NTPTilesVector new_tiles = FillTestTiles(kTestCase2);
std::vector<CustomLinksManager::Link> initial_links =
FillTestLinks(kTestCase1);
std::vector<CustomLinksManager::Link> empty_links;
ASSERT_FALSE(custom_links_->IsInitialized());
ASSERT_TRUE(custom_links_->GetLinks().empty());
// Initialize.
EXPECT_TRUE(custom_links_->Initialize(initial_tiles));
EXPECT_EQ(initial_links, custom_links_->GetLinks());
// Try to initialize again. This should fail and leave the links intact.
EXPECT_FALSE(custom_links_->Initialize(new_tiles));
EXPECT_EQ(initial_links, custom_links_->GetLinks());
}
TEST_F(CustomLinksManagerImplTest, UninitializeDeletesOldLinks) {
NTPTilesVector initial_tiles = FillTestTiles(kTestCase1);
std::vector<CustomLinksManager::Link> initial_links =
FillTestLinks(kTestCase1);
// Initialize.
ASSERT_TRUE(custom_links_->Initialize(initial_tiles));
ASSERT_EQ(initial_links, custom_links_->GetLinks());
custom_links_->Uninitialize();
EXPECT_TRUE(custom_links_->GetLinks().empty());
// Initialize with no links.
EXPECT_TRUE(custom_links_->Initialize(NTPTilesVector()));
EXPECT_TRUE(custom_links_->GetLinks().empty());
}
TEST_F(CustomLinksManagerImplTest, ReInitializeWithNewLinks) {
NTPTilesVector initial_tiles = FillTestTiles(kTestCase1);
NTPTilesVector new_tiles = FillTestTiles(kTestCase2);
std::vector<CustomLinksManager::Link> initial_links =
FillTestLinks(kTestCase1);
std::vector<CustomLinksManager::Link> new_links = FillTestLinks(kTestCase2);
// Initialize.
ASSERT_TRUE(custom_links_->Initialize(initial_tiles));
ASSERT_EQ(initial_links, custom_links_->GetLinks());
custom_links_->Uninitialize();
ASSERT_TRUE(custom_links_->GetLinks().empty());
// Initialize with new links.
EXPECT_TRUE(custom_links_->Initialize(new_tiles));
EXPECT_EQ(new_links, custom_links_->GetLinks());
}
TEST_F(CustomLinksManagerImplTest, AddLink) {
NTPTilesVector initial_tiles = FillTestTiles(kTestCase1);
std::vector<CustomLinksManager::Link> initial_links =
FillTestLinks(kTestCase1);
std::vector<CustomLinksManager::Link> expected_links = initial_links;
expected_links.emplace_back(
CustomLinksManager::Link{GURL(kTestUrl), base::UTF8ToUTF16(kTestTitle)});
// Initialize.
ASSERT_TRUE(custom_links_->Initialize(initial_tiles));
ASSERT_EQ(initial_links, custom_links_->GetLinks());
// Add link.
EXPECT_TRUE(
custom_links_->AddLink(GURL(kTestUrl), base::UTF8ToUTF16(kTestTitle)));
EXPECT_EQ(expected_links, custom_links_->GetLinks());
}
TEST_F(CustomLinksManagerImplTest, AddLinkWhenAtMaxLinks) {
NTPTilesVector initial_tiles = FillTestTiles(kTestCaseMax);
std::vector<CustomLinksManager::Link> initial_links =
FillTestLinks(kTestCaseMax);
// Initialize.
ASSERT_TRUE(custom_links_->Initialize(initial_tiles));
ASSERT_EQ(initial_links, custom_links_->GetLinks());
// Try to add link. This should fail and not modify the list.
EXPECT_FALSE(
custom_links_->AddLink(GURL(kTestUrl), base::UTF8ToUTF16(kTestTitle)));
EXPECT_EQ(initial_links, custom_links_->GetLinks());
}
TEST_F(CustomLinksManagerImplTest, AddDuplicateLink) {
NTPTilesVector initial_tiles = FillTestTiles(kTestCase1);
std::vector<CustomLinksManager::Link> initial_links =
FillTestLinks(kTestCase1);
// Initialize.
ASSERT_TRUE(custom_links_->Initialize(initial_tiles));
ASSERT_EQ(initial_links, custom_links_->GetLinks());
// Try to add duplicate link. This should fail and not modify the list.
EXPECT_FALSE(custom_links_->AddLink(GURL(kTestCase1[0].url),
base::UTF8ToUTF16(kTestCase1[0].title)));
EXPECT_EQ(initial_links, custom_links_->GetLinks());
}
TEST_F(CustomLinksManagerImplTest, DeleteLink) {
NTPTilesVector initial_tiles;
AddTile(&initial_tiles, kTestUrl, kTestTitle);
std::vector<CustomLinksManager::Link> initial_links({CustomLinksManager::Link{
GURL(kTestUrl), base::UTF8ToUTF16(kTestTitle)}});
// Initialize.
ASSERT_TRUE(custom_links_->Initialize(initial_tiles));
ASSERT_EQ(initial_links, custom_links_->GetLinks());
// Delete link.
EXPECT_TRUE(custom_links_->DeleteLink(GURL(kTestUrl)));
EXPECT_TRUE(custom_links_->GetLinks().empty());
}
TEST_F(CustomLinksManagerImplTest, DeleteLinkWhenUrlDoesNotExist) {
NTPTilesVector initial_tiles;
// Initialize.
ASSERT_TRUE(custom_links_->Initialize(initial_tiles));
ASSERT_TRUE(custom_links_->GetLinks().empty());
// Try to delete link. This should fail and not modify the list.
EXPECT_FALSE(custom_links_->DeleteLink(GURL(kTestUrl)));
EXPECT_TRUE(custom_links_->GetLinks().empty());
}
TEST_F(CustomLinksManagerImplTest, UndoDeleteLink) {
NTPTilesVector initial_tiles;
AddTile(&initial_tiles, kTestUrl, kTestTitle);
std::vector<CustomLinksManager::Link> expected_links(
{CustomLinksManager::Link{GURL(kTestUrl),
base::UTF8ToUTF16(kTestTitle)}});
// Initialize.
ASSERT_TRUE(custom_links_->Initialize(initial_tiles));
ASSERT_EQ(expected_links, custom_links_->GetLinks());
// Try to undo delete before delete is called. This should fail and not modify
// the list.
EXPECT_FALSE(custom_links_->UndoDeleteLink());
EXPECT_EQ(expected_links, custom_links_->GetLinks());
// Delete link.
ASSERT_TRUE(custom_links_->DeleteLink(GURL(kTestUrl)));
ASSERT_TRUE(custom_links_->GetLinks().empty());
// Undo delete link.
EXPECT_TRUE(custom_links_->UndoDeleteLink());
EXPECT_EQ(expected_links, custom_links_->GetLinks());
}
TEST_F(CustomLinksManagerImplTest, UndoDeleteLinkAfterAdd) {
NTPTilesVector initial_tiles;
std::vector<CustomLinksManager::Link> expected_links(
{CustomLinksManager::Link{GURL(kTestUrl),
base::UTF8ToUTF16(kTestTitle)}});
// Initialize.
ASSERT_TRUE(custom_links_->Initialize(initial_tiles));
ASSERT_TRUE(custom_links_->GetLinks().empty());
// Add link.
ASSERT_TRUE(
custom_links_->AddLink(GURL(kTestUrl), base::UTF8ToUTF16(kTestTitle)));
ASSERT_EQ(expected_links, custom_links_->GetLinks());
// Delete link.
ASSERT_TRUE(custom_links_->DeleteLink(GURL(kTestUrl)));
ASSERT_TRUE(custom_links_->GetLinks().empty());
// Undo delete link.
EXPECT_TRUE(custom_links_->UndoDeleteLink());
EXPECT_EQ(expected_links, custom_links_->GetLinks());
}
TEST_F(CustomLinksManagerImplTest, UndoDeleteLinkWhenAtMaxLinks) {
NTPTilesVector initial_tiles = FillTestTiles(kTestCaseMax);
std::vector<CustomLinksManager::Link> intial_links =
FillTestLinks(kTestCaseMax);
std::vector<CustomLinksManager::Link> links_after_delete(intial_links);
links_after_delete.pop_back();
std::vector<CustomLinksManager::Link> links_after_add(links_after_delete);
links_after_add.emplace_back(
CustomLinksManager::Link{GURL(kTestUrl), base::UTF8ToUTF16(kTestTitle)});
// Initialize.
ASSERT_TRUE(custom_links_->Initialize(initial_tiles));
ASSERT_EQ(intial_links, custom_links_->GetLinks());
// Delete link.
ASSERT_TRUE(custom_links_->DeleteLink(GURL(kTestCaseMax[9].url)));
ASSERT_EQ(links_after_delete, custom_links_->GetLinks());
// Add link. Should be at max links.
ASSERT_TRUE(
custom_links_->AddLink(GURL(kTestUrl), base::UTF8ToUTF16(kTestTitle)));
ASSERT_EQ(links_after_add, custom_links_->GetLinks());
// Try to undo delete link. This should fail and not modify the list.
EXPECT_FALSE(custom_links_->UndoDeleteLink());
EXPECT_EQ(links_after_add, custom_links_->GetLinks());
}
} // namespace ntp_tiles