diff options
Diffstat (limited to 'browser/components/preferences/tests/browser_cloud_storage.js')
-rw-r--r-- | browser/components/preferences/tests/browser_cloud_storage.js | 163 |
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(); +}); |