Bug 1439935 - Add a test for testing backup JSON file export/import. r?Standard8 draft
authorGeorge Echim <gechim@mozilla.com>
Thu, 08 Mar 2018 15:42:51 +0200
changeset 793533 880e9107c862c9ca15a360a3bdb1068dcd13c8cb
parent 793531 ddeae8717880105e6fc9c8a574f3b08d9830fa5e
push id109418
push userbmo:standard8@mozilla.com
push dateThu, 10 May 2018 09:28:01 +0000
reviewersStandard8
bugs1439935
milestone62.0a1
Bug 1439935 - Add a test for testing backup JSON file export/import. r?Standard8 MozReview-Commit-ID: CCra06PhLNm
browser/components/places/tests/browser/browser.ini
browser/components/places/tests/browser/browser_bookmark_backup_export_import.js
--- a/browser/components/places/tests/browser/browser.ini
+++ b/browser/components/places/tests/browser/browser.ini
@@ -8,16 +8,17 @@ support-files =
   framedPage.html
   frameLeft.html
   frameRight.html
   sidebarpanels_click_test_page.html
   keyword_form.html
 
 [browser_addBookmarkForFrame.js]
 [browser_bookmark_add_tags.js]
+[browser_bookmark_backup_export_import.js]
 [browser_bookmark_change_location.js]
 [browser_bookmark_folder_moveability.js]
 [browser_bookmark_load_in_sidebar.js]
 [browser_bookmark_private_window.js]
 [browser_bookmark_remove_tags.js]
 [browser_bookmarklet_windowOpen.js]
 support-files =
   bookmarklet_windowOpen_dummy.html
new file mode 100644
--- /dev/null
+++ b/browser/components/places/tests/browser/browser_bookmark_backup_export_import.js
@@ -0,0 +1,142 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/**
+ * Tests bookmarks backup export/import as JSON file.
+ */
+
+const BASE_URL = "http://example.com/";
+
+const PLACES = [
+  {
+    guid: PlacesUtils.bookmarks.menuGuid,
+    prefix: "In Menu",
+    total: 5
+  },
+  {
+    guid: PlacesUtils.bookmarks.toolbarGuid,
+    prefix: "In Toolbar",
+    total: 7
+  },
+  {
+    guid: PlacesUtils.bookmarks.unfiledGuid,
+    prefix: "In Other",
+    total: 8
+  }
+];
+
+var importExportPicker, saveDir, actualBookmarks;
+
+async function generateTestBookmarks() {
+  actualBookmarks = [];
+  for (let place of PLACES) {
+    let currentPlaceChildren = [];
+    for (let i = 1; i <= place.total; i++) {
+      currentPlaceChildren.push({
+        url: `${BASE_URL}${i}`,
+        title: `${place.prefix} Bookmark: ${i}`
+      });
+    }
+    await PlacesUtils.bookmarks.insertTree({
+      guid: place.guid,
+      children: currentPlaceChildren
+    });
+    actualBookmarks = actualBookmarks.concat(currentPlaceChildren);
+  }
+}
+
+async function validateImportedBookmarksByParent(parentGuid, expectedChildrenTotal) {
+  let currentPlace = PLACES.filter((elem) => {
+    return elem.guid === parentGuid.toString();
+  })[0];
+
+  let bookmarksTree = await PlacesUtils.promiseBookmarksTree(parentGuid);
+
+  Assert.equal(bookmarksTree.children.length, expectedChildrenTotal, `Imported bookmarks length should be ${expectedChildrenTotal}`);
+
+  for (let importedBookmark of bookmarksTree.children) {
+    Assert.equal(importedBookmark.type, PlacesUtils.TYPE_X_MOZ_PLACE, `Exported bookmarks should be of type bookmark`);
+
+    let doesTitleContain = importedBookmark.title.toString().includes(`${currentPlace.prefix} Bookmark`);
+    Assert.equal(doesTitleContain, true, `Bookmark title should contain text: ${currentPlace.prefix} Bookmark`);
+
+    let doesUriContains = importedBookmark.uri.toString().includes(BASE_URL);
+    Assert.equal(doesUriContains, true, "Bookmark uri should contain base url");
+  }
+}
+
+async function validateImportedBookmarks(fromPlaces) {
+  for (let i = 0; i < fromPlaces.length; i++) {
+    let parentContainer = fromPlaces[i];
+    await validateImportedBookmarksByParent(parentContainer.guid, parentContainer.total);
+  }
+}
+
+async function promiseImportExport(aWindow) {
+  saveDir = Services.dirsvc.get("TmpD", Ci.nsIFile);
+  saveDir.append("temp-bookmarks-export");
+  if (!saveDir.exists()) {
+    saveDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755);
+  }
+  importExportPicker.displayDirectory = saveDir;
+
+  return new Promise(resolve => {
+    importExportPicker.showCallback = async () => {
+      let fileName = "bookmarks-backup.json";
+      let destFile = saveDir.clone();
+      destFile.append(fileName);
+      importExportPicker.setFiles([destFile]);
+      resolve(destFile);
+    };
+  });
+}
+
+add_task(async function setup() {
+  await promisePlacesInitComplete();
+  await PlacesUtils.bookmarks.eraseEverything();
+  await generateTestBookmarks();
+  importExportPicker = SpecialPowers.MockFilePicker;
+  importExportPicker.init(window);
+
+  registerCleanupFunction(async () => {
+    importExportPicker.cleanup();
+    await PlacesUtils.bookmarks.eraseEverything();
+  });
+});
+
+add_task(async function test_export_json() {
+  let libraryWindow = await promiseLibrary();
+  libraryWindow.document.querySelector("#maintenanceButtonPopup #backupBookmarks").click();
+
+  let backupFile = await promiseImportExport();
+  await BrowserTestUtils.waitForCondition(backupFile.exists);
+  await promiseLibraryClosed(libraryWindow);
+
+  await PlacesUtils.bookmarks.eraseEverything();
+});
+
+add_task(async function test_import_json() {
+  let libraryWindow = await promiseLibrary();
+  libraryWindow.document.querySelector("#maintenanceButtonPopup #restoreFromFile").click();
+
+  await promiseImportExport();
+  await BrowserTestUtils.promiseAlertDialogOpen("accept");
+
+  let restored = 0;
+  let promiseBookmarksRestored = PlacesTestUtils.waitForNotification("onItemAdded", () => {
+    restored++;
+    return restored === actualBookmarks.length;
+  });
+
+  await promiseBookmarksRestored;
+  await validateImportedBookmarks(PLACES);
+  await promiseLibraryClosed(libraryWindow);
+
+  registerCleanupFunction(async () => {
+    if (saveDir) {
+      saveDir.remove(true);
+    }
+  });
+});