summaryrefslogtreecommitdiffstats
path: root/toolkit/components/places/tests/bookmarks/test_405938_restore_queries.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/places/tests/bookmarks/test_405938_restore_queries.js')
-rw-r--r--toolkit/components/places/tests/bookmarks/test_405938_restore_queries.js253
1 files changed, 253 insertions, 0 deletions
diff --git a/toolkit/components/places/tests/bookmarks/test_405938_restore_queries.js b/toolkit/components/places/tests/bookmarks/test_405938_restore_queries.js
new file mode 100644
index 0000000000..c893f1db3f
--- /dev/null
+++ b/toolkit/components/places/tests/bookmarks/test_405938_restore_queries.js
@@ -0,0 +1,253 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var tests = [];
+
+/*
+
+Backup/restore tests example:
+
+var myTest = {
+ populate: function () { ... add bookmarks ... },
+ validate: function () { ... query for your bookmarks ... }
+}
+
+this.push(myTest);
+
+*/
+
+/*
+
+test summary:
+- create folders with content
+- create a query bookmark for those folders
+- backs up bookmarks
+- restores bookmarks
+- confirms that the query has the new ids for the same folders
+
+scenarios:
+- 1 folder (folder shortcut)
+- n folders (single query)
+- n folders (multiple queries)
+
+*/
+
+var test = {
+ _testRootId: null,
+ _testRootTitle: "test root",
+ _folderGuids: [],
+ _bookmarkURIs: [],
+ _count: 3,
+ _extraBookmarksCount: 10,
+
+ populate: async function populate() {
+ // folder to hold this test
+ await PlacesUtils.bookmarks.eraseEverything();
+
+ let testFolderItems = [];
+ // Set a date 60 seconds ago, so that we can set newer bookmarks later.
+ let dateAdded = new Date(new Date() - 60000);
+
+ // create test folders each with a bookmark
+ for (let i = 0; i < this._count; i++) {
+ this._folderGuids.push(PlacesUtils.history.makeGuid());
+ testFolderItems.push({
+ guid: this._folderGuids[i],
+ title: `folder${i}`,
+ type: PlacesUtils.bookmarks.TYPE_FOLDER,
+ dateAdded,
+ children: [
+ {
+ dateAdded,
+ url: `http://${i}`,
+ title: `bookmark${i}`,
+ },
+ ],
+ });
+ }
+
+ let bookmarksTree = {
+ guid: PlacesUtils.bookmarks.toolbarGuid,
+ children: [
+ {
+ dateAdded,
+ title: this._testRootTitle,
+ type: PlacesUtils.bookmarks.TYPE_FOLDER,
+ children: testFolderItems,
+ },
+ ],
+ };
+
+ let insertedBookmarks = await PlacesUtils.bookmarks.insertTree(
+ bookmarksTree
+ );
+
+ // create a query URI with 1 folder (ie: folder shortcut)
+ this._queryURI1 = `place:parent=${this._folderGuids[0]}&queryType=1`;
+ this._queryTitle1 = "query1";
+ await PlacesUtils.bookmarks.insert({
+ parentGuid: insertedBookmarks[0].guid,
+ dateAdded,
+ url: this._queryURI1,
+ title: this._queryTitle1,
+ });
+
+ // create a query URI with _count folders
+ this._queryURI2 = `place:parent=${this._folderGuids.join(
+ "&parent="
+ )}&queryType=1`;
+ this._queryTitle2 = "query2";
+ await PlacesUtils.bookmarks.insert({
+ parentGuid: insertedBookmarks[0].guid,
+ dateAdded,
+ url: this._queryURI2,
+ title: this._queryTitle2,
+ });
+
+ // Create a query URI for most recent bookmarks with NO folders specified.
+ this._queryURI3 =
+ "place:queryType=1&sort=12&maxResults=10&excludeQueries=1";
+ this._queryTitle3 = "query3";
+ await PlacesUtils.bookmarks.insert({
+ parentGuid: insertedBookmarks[0].guid,
+ dateAdded,
+ url: this._queryURI3,
+ title: this._queryTitle3,
+ });
+ },
+
+ clean() {},
+
+ validate: async function validate(addExtras) {
+ if (addExtras) {
+ // Throw a wrench in the works by inserting some new bookmarks,
+ // ensuring folder ids won't be the same, when restoring.
+ let date = new Date() - this._extraBookmarksCount * 1000;
+ for (let i = 0; i < this._extraBookmarksCount; i++) {
+ await PlacesUtils.bookmarks.insert({
+ parentGuid: PlacesUtils.bookmarks.menuGuid,
+ url: uri("http://aaaa" + i),
+ dateAdded: new Date(date + (this._extraBookmarksCount - i) * 1000),
+ });
+ }
+ }
+
+ var toolbar = PlacesUtils.getFolderContents(
+ PlacesUtils.bookmarks.toolbarGuid,
+ false,
+ true
+ ).root;
+ Assert.equal(toolbar.childCount, 1);
+
+ var folderNode = toolbar.getChild(0);
+ Assert.equal(folderNode.type, folderNode.RESULT_TYPE_FOLDER);
+ Assert.equal(folderNode.title, this._testRootTitle);
+ folderNode.QueryInterface(Ci.nsINavHistoryQueryResultNode);
+ folderNode.containerOpen = true;
+
+ // |_count| folders + the query nodes
+ Assert.equal(folderNode.childCount, this._count + 3);
+
+ for (let i = 0; i < this._count; i++) {
+ var subFolder = folderNode.getChild(i);
+ Assert.equal(subFolder.title, "folder" + i);
+ subFolder.QueryInterface(Ci.nsINavHistoryContainerResultNode);
+ subFolder.containerOpen = true;
+ Assert.equal(subFolder.childCount, 1);
+ var child = subFolder.getChild(0);
+ Assert.equal(child.title, "bookmark" + i);
+ Assert.ok(uri(child.uri).equals(uri("http://" + i)));
+ }
+
+ // validate folder shortcut
+ this.validateQueryNode1(folderNode.getChild(this._count));
+
+ // validate folders query
+ this.validateQueryNode2(folderNode.getChild(this._count + 1));
+
+ // validate recent folders query
+ this.validateQueryNode3(folderNode.getChild(this._count + 2));
+
+ // clean up
+ folderNode.containerOpen = false;
+ toolbar.containerOpen = false;
+ },
+
+ validateQueryNode1: function validateQueryNode1(aNode) {
+ Assert.equal(aNode.title, this._queryTitle1);
+ Assert.ok(PlacesUtils.nodeIsFolder(aNode));
+
+ aNode.QueryInterface(Ci.nsINavHistoryContainerResultNode);
+ aNode.containerOpen = true;
+ Assert.equal(aNode.childCount, 1);
+ var child = aNode.getChild(0);
+ Assert.ok(uri(child.uri).equals(uri("http://0")));
+ Assert.equal(child.title, "bookmark0");
+ aNode.containerOpen = false;
+ },
+
+ validateQueryNode2: function validateQueryNode2(aNode) {
+ Assert.equal(aNode.title, this._queryTitle2);
+ Assert.ok(PlacesUtils.nodeIsQuery(aNode));
+
+ aNode.QueryInterface(Ci.nsINavHistoryContainerResultNode);
+ aNode.containerOpen = true;
+ Assert.equal(aNode.childCount, this._count);
+ for (var i = 0; i < aNode.childCount; i++) {
+ var child = aNode.getChild(i);
+ Assert.ok(uri(child.uri).equals(uri("http://" + i)));
+ Assert.equal(child.title, "bookmark" + i);
+ }
+ aNode.containerOpen = false;
+ },
+
+ validateQueryNode3(aNode) {
+ Assert.equal(aNode.title, this._queryTitle3);
+ Assert.ok(PlacesUtils.nodeIsQuery(aNode));
+
+ aNode.QueryInterface(Ci.nsINavHistoryContainerResultNode);
+ aNode.containerOpen = true;
+ // The query will list the extra bookmarks added at the start of validate.
+ Assert.equal(aNode.childCount, this._extraBookmarksCount);
+ for (var i = 0; i < aNode.childCount; i++) {
+ var child = aNode.getChild(i);
+ Assert.equal(child.uri, `http://aaaa${i}/`);
+ }
+ aNode.containerOpen = false;
+ },
+};
+tests.push(test);
+
+add_task(async function () {
+ // make json file
+ let jsonFile = PathUtils.join(PathUtils.profileDir, "bookmarks.json");
+
+ // populate db
+ for (let singleTest of tests) {
+ await singleTest.populate();
+ // sanity
+ await singleTest.validate(true);
+ }
+
+ // export json to file
+ await BookmarkJSONUtils.exportToFile(jsonFile);
+
+ // clean
+ for (let singleTest of tests) {
+ singleTest.clean();
+ }
+
+ // restore json file
+ await BookmarkJSONUtils.importFromFile(jsonFile, { replace: true });
+
+ // validate
+ for (let singleTest of tests) {
+ await singleTest.validate(false);
+ }
+
+ // clean up
+ await IOUtils.remove(jsonFile);
+});