summaryrefslogtreecommitdiffstats
path: root/browser/components/preferences/tests/browser_cloud_storage.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/preferences/tests/browser_cloud_storage.js')
-rw-r--r--browser/components/preferences/tests/browser_cloud_storage.js163
1 files changed, 163 insertions, 0 deletions
diff --git a/browser/components/preferences/tests/browser_cloud_storage.js b/browser/components/preferences/tests/browser_cloud_storage.js
new file mode 100644
index 0000000000..1870942312
--- /dev/null
+++ b/browser/components/preferences/tests/browser_cloud_storage.js
@@ -0,0 +1,163 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
+ChromeUtils.defineModuleGetter(
+ this,
+ "CloudStorage",
+ "resource://gre/modules/CloudStorage.jsm"
+);
+ChromeUtils.defineModuleGetter(
+ this,
+ "FileUtils",
+ "resource://gre/modules/FileUtils.jsm"
+);
+
+const DROPBOX_DOWNLOAD_FOLDER = "Dropbox";
+const CLOUD_SERVICES_PREF = "cloud.services.";
+
+function create_subdir(dir, subdirname) {
+ let subdir = dir.clone();
+ subdir.append(subdirname);
+ if (subdir.exists()) {
+ subdir.remove(true);
+ }
+ subdir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755);
+ return subdir;
+}
+
+/**
+ * Replaces a directory service entry with a given nsIFile.
+ */
+function registerFakePath(key, folderName) {
+ let dirsvc = Services.dirsvc.QueryInterface(Ci.nsIProperties);
+
+ // Create a directory inside the profile and register it as key
+ let profD = dirsvc.get("ProfD", Ci.nsIFile);
+ // create a subdir just to keep our files out of the way
+ let file = create_subdir(profD, folderName);
+
+ let originalFile;
+ try {
+ // If a file is already provided save it and undefine, otherwise set will
+ // throw for persistent entries (ones that are cached).
+ originalFile = dirsvc.get(key, Ci.nsIFile);
+ dirsvc.undefine(key);
+ } catch (e) {
+ // dirsvc.get will throw if nothing provides for the key and dirsvc.undefine
+ // will throw if it's not a persistent entry, in either case we don't want
+ // to set the original file in cleanup.
+ originalFile = undefined;
+ }
+
+ dirsvc.set(key, file);
+ registerCleanupFunction(() => {
+ dirsvc.undefine(key);
+ if (originalFile) {
+ dirsvc.set(key, originalFile);
+ }
+ });
+}
+
+async function mock_dropbox() {
+ // Mock Dropbox Download folder in Home directory
+ let downloadFolder = FileUtils.getFile("Home", [
+ DROPBOX_DOWNLOAD_FOLDER,
+ "Downloads",
+ ]);
+ if (!downloadFolder.exists()) {
+ downloadFolder.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
+ }
+ console.log(downloadFolder.path);
+
+ registerCleanupFunction(() => {
+ if (downloadFolder.exists()) {
+ downloadFolder.remove(true);
+ }
+ });
+}
+
+add_task(async function setup() {
+ // Create mock Dropbox download folder for cloudstorage API
+ // Set prefs required to display second radio option
+ // 'Save to Dropbox' under Downloads
+ let folderName = "CloudStorage";
+ registerFakePath("Home", folderName);
+ await mock_dropbox();
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ [CLOUD_SERVICES_PREF + "api.enabled", true],
+ [CLOUD_SERVICES_PREF + "storage.key", "Dropbox"],
+ ],
+ });
+});
+
+add_task(async function test_initProvider() {
+ // Get preferred provider key
+ let preferredProvider = await CloudStorage.getPreferredProvider();
+ is(preferredProvider, "Dropbox", "Cloud Storage preferred provider key");
+
+ let isInitialized = await CloudStorage.init();
+ is(isInitialized, true, "Providers Metadata successfully initialized");
+
+ // Get preferred provider in use display name
+ let providerDisplayName = await CloudStorage.getProviderIfInUse();
+ is(
+ providerDisplayName,
+ "Dropbox",
+ "Cloud Storage preferred provider display name"
+ );
+});
+
+add_task(async function() {
+ await openPreferencesViaOpenPreferencesAPI("general", { leaveOpen: true });
+ let doc = gBrowser.selectedBrowser.contentDocument;
+ let saveWhereOptions = doc.getElementById("saveWhere");
+ let saveToCloud = doc.getElementById("saveToCloud");
+ is(saveWhereOptions.itemCount, 3, "Radio options count");
+ is_element_visible(saveToCloud, "Save to Dropbox option is visible");
+
+ let saveTo = doc.getElementById("saveTo");
+ ok(saveTo.selected, "Ensure first option is selected by default");
+ is(
+ Services.prefs.getIntPref("browser.download.folderList"),
+ 1,
+ "Set to system downloadsfolder as the default download location"
+ );
+
+ let downloadFolder = doc.getElementById("downloadFolder");
+ let chooseFolder = doc.getElementById("chooseFolder");
+ is(downloadFolder.disabled, false, "downloadFolder filefield is enabled");
+ is(chooseFolder.disabled, false, "chooseFolder button is enabled");
+
+ // Test click of second radio option sets browser.download.folderList as 3
+ // which means the default download location is elsewhere as specified by
+ // cloud storage API getDownloadFolder and pref cloud.services.storage.key
+ saveToCloud.click();
+ is(
+ Services.prefs.getIntPref("browser.download.folderList"),
+ 3,
+ "Default download location is elsewhere as specified by cloud storage API"
+ );
+ is(downloadFolder.disabled, true, "downloadFolder filefield is disabled");
+ is(chooseFolder.disabled, true, "chooseFolder button is disabled");
+
+ // Test selecting first radio option enables downloadFolder filefield and chooseFolder button
+ saveTo.click();
+ is(downloadFolder.disabled, false, "downloadFolder filefield is enabled");
+ is(chooseFolder.disabled, false, "chooseFolder button is enabled");
+
+ // Test selecting third radio option keeps downloadFolder and chooseFolder elements disabled
+ let alwaysAsk = doc.getElementById("alwaysAsk");
+ saveToCloud.click();
+ alwaysAsk.click();
+ is(downloadFolder.disabled, true, "downloadFolder filefield is disabled");
+ is(chooseFolder.disabled, true, "chooseFolder button is disabled");
+ saveTo.click();
+ ok(saveTo.selected, "Reset back first option as selected by default");
+
+ gBrowser.removeCurrentTab();
+});