1 // Copyright (c) 2012 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
5 #include "chrome/browser/extensions/api/bookmarks/bookmark_api_helpers.h"
6
7 #include "base/memory/scoped_ptr.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "base/values.h"
10 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
11 #include "chrome/browser/bookmarks/chrome_bookmark_client.h"
12 #include "chrome/browser/bookmarks/chrome_bookmark_client_factory.h"
13 #include "chrome/browser/extensions/api/bookmarks/bookmark_api_constants.h"
14 #include "chrome/common/extensions/api/bookmarks.h"
15 #include "chrome/test/base/testing_profile.h"
16 #include "components/bookmarks/browser/bookmark_model.h"
17 #include "components/bookmarks/test/bookmark_test_helpers.h"
18 #include "content/public/test/test_browser_thread_bundle.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20
21 namespace extensions {
22
23 namespace keys = bookmark_api_constants;
24 using api::bookmarks::BookmarkTreeNode;
25
26 namespace bookmark_api_helpers {
27
28 class ExtensionBookmarksTest : public testing::Test {
29 public:
ExtensionBookmarksTest()30 ExtensionBookmarksTest()
31 : client_(NULL), model_(NULL), node_(NULL), folder_(NULL) {}
32
SetUp()33 virtual void SetUp() OVERRIDE {
34 profile_.CreateBookmarkModel(false);
35 model_ = BookmarkModelFactory::GetForProfile(&profile_);
36 client_ = ChromeBookmarkClientFactory::GetForProfile(&profile_);
37 test::WaitForBookmarkModelToLoad(model_);
38
39 node_ = model_->AddURL(model_->other_node(), 0, base::ASCIIToUTF16("Digg"),
40 GURL("http://www.reddit.com"));
41 model_->AddURL(model_->other_node(), 0, base::ASCIIToUTF16("News"),
42 GURL("http://www.foxnews.com"));
43 folder_ = model_->AddFolder(
44 model_->other_node(), 0, base::ASCIIToUTF16("outer folder"));
45 model_->AddFolder(folder_, 0, base::ASCIIToUTF16("inner folder 1"));
46 model_->AddFolder(folder_, 0, base::ASCIIToUTF16("inner folder 2"));
47 model_->AddURL(
48 folder_, 0, base::ASCIIToUTF16("Digg"), GURL("http://reddit.com"));
49 model_->AddURL(
50 folder_, 0, base::ASCIIToUTF16("CNet"), GURL("http://cnet.com"));
51 }
52
53 content::TestBrowserThreadBundle thread_bundle_;
54 TestingProfile profile_;
55 ChromeBookmarkClient* client_;
56 BookmarkModel* model_;
57 const BookmarkNode* node_;
58 const BookmarkNode* folder_;
59 };
60
TEST_F(ExtensionBookmarksTest,GetFullTreeFromRoot)61 TEST_F(ExtensionBookmarksTest, GetFullTreeFromRoot) {
62 scoped_ptr<BookmarkTreeNode> tree(
63 GetBookmarkTreeNode(client_,
64 model_->other_node(),
65 true, // Recurse.
66 false)); // Not only folders.
67 ASSERT_EQ(3U, tree->children->size());
68 }
69
TEST_F(ExtensionBookmarksTest,GetFoldersOnlyFromRoot)70 TEST_F(ExtensionBookmarksTest, GetFoldersOnlyFromRoot) {
71 scoped_ptr<BookmarkTreeNode> tree(
72 GetBookmarkTreeNode(client_,
73 model_->other_node(),
74 true, // Recurse.
75 true)); // Only folders.
76 ASSERT_EQ(1U, tree->children->size());
77 }
78
TEST_F(ExtensionBookmarksTest,GetSubtree)79 TEST_F(ExtensionBookmarksTest, GetSubtree) {
80 scoped_ptr<BookmarkTreeNode> tree(
81 GetBookmarkTreeNode(client_,
82 folder_,
83 true, // Recurse.
84 false)); // Not only folders.
85 ASSERT_EQ(4U, tree->children->size());
86 linked_ptr<BookmarkTreeNode> digg = tree->children->at(1);
87 ASSERT_TRUE(digg.get());
88 ASSERT_EQ("Digg", digg->title);
89 }
90
TEST_F(ExtensionBookmarksTest,GetSubtreeFoldersOnly)91 TEST_F(ExtensionBookmarksTest, GetSubtreeFoldersOnly) {
92 scoped_ptr<BookmarkTreeNode> tree(
93 GetBookmarkTreeNode(client_,
94 folder_,
95 true, // Recurse.
96 true)); // Only folders.
97 ASSERT_EQ(2U, tree->children->size());
98 linked_ptr<BookmarkTreeNode> inner_folder = tree->children->at(1);
99 ASSERT_TRUE(inner_folder.get());
100 ASSERT_EQ("inner folder 1", inner_folder->title);
101 }
102
TEST_F(ExtensionBookmarksTest,GetModifiableNode)103 TEST_F(ExtensionBookmarksTest, GetModifiableNode) {
104 scoped_ptr<BookmarkTreeNode> tree(
105 GetBookmarkTreeNode(client_,
106 node_,
107 false, // Recurse.
108 false)); // Only folders.
109 EXPECT_EQ("Digg", tree->title);
110 ASSERT_TRUE(tree->url);
111 EXPECT_EQ("http://www.reddit.com/", *tree->url);
112 EXPECT_EQ(BookmarkTreeNode::UNMODIFIABLE_NONE, tree->unmodifiable);
113 }
114
TEST_F(ExtensionBookmarksTest,GetManagedNode)115 TEST_F(ExtensionBookmarksTest, GetManagedNode) {
116 const BookmarkNode* managed_bookmark =
117 model_->AddURL(client_->managed_node(),
118 0,
119 base::ASCIIToUTF16("Chromium"),
120 GURL("http://www.chromium.org/"));
121 scoped_ptr<BookmarkTreeNode> tree(
122 GetBookmarkTreeNode(client_,
123 managed_bookmark,
124 false, // Recurse.
125 false)); // Only folders.
126 EXPECT_EQ("Chromium", tree->title);
127 EXPECT_EQ("http://www.chromium.org/", *tree->url);
128 EXPECT_EQ(BookmarkTreeNode::UNMODIFIABLE_MANAGED, tree->unmodifiable);
129 }
130
TEST_F(ExtensionBookmarksTest,RemoveNodeInvalidId)131 TEST_F(ExtensionBookmarksTest, RemoveNodeInvalidId) {
132 int64 invalid_id = model_->next_node_id();
133 std::string error;
134 EXPECT_FALSE(RemoveNode(model_, client_, invalid_id, true, &error));
135 EXPECT_EQ(keys::kNoNodeError, error);
136 }
137
TEST_F(ExtensionBookmarksTest,RemoveNodePermanent)138 TEST_F(ExtensionBookmarksTest, RemoveNodePermanent) {
139 std::string error;
140 EXPECT_FALSE(
141 RemoveNode(model_, client_, model_->other_node()->id(), true, &error));
142 EXPECT_EQ(keys::kModifySpecialError, error);
143 }
144
TEST_F(ExtensionBookmarksTest,RemoveNodeManaged)145 TEST_F(ExtensionBookmarksTest, RemoveNodeManaged) {
146 const BookmarkNode* managed_bookmark =
147 model_->AddURL(client_->managed_node(),
148 0,
149 base::ASCIIToUTF16("Chromium"),
150 GURL("http://www.chromium.org"));
151 std::string error;
152 EXPECT_FALSE(
153 RemoveNode(model_, client_, managed_bookmark->id(), true, &error));
154 EXPECT_EQ(keys::kModifyManagedError, error);
155 }
156
TEST_F(ExtensionBookmarksTest,RemoveNodeNotRecursive)157 TEST_F(ExtensionBookmarksTest, RemoveNodeNotRecursive) {
158 std::string error;
159 EXPECT_FALSE(RemoveNode(model_, client_, folder_->id(), false, &error));
160 EXPECT_EQ(keys::kFolderNotEmptyError, error);
161 }
162
TEST_F(ExtensionBookmarksTest,RemoveNodeRecursive)163 TEST_F(ExtensionBookmarksTest, RemoveNodeRecursive) {
164 EXPECT_EQ(3, model_->other_node()->child_count());
165 std::string error;
166 EXPECT_TRUE(RemoveNode(model_, client_, folder_->id(), true, &error));
167 EXPECT_EQ(2, model_->other_node()->child_count());
168 }
169
170 } // namespace bookmark_api_helpers
171 } // namespace extensions
172