summaryrefslogtreecommitdiffstats
path: root/browser/components/migration/tests/unit/test_Safari_permissions.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/migration/tests/unit/test_Safari_permissions.js')
-rw-r--r--browser/components/migration/tests/unit/test_Safari_permissions.js145
1 files changed, 145 insertions, 0 deletions
diff --git a/browser/components/migration/tests/unit/test_Safari_permissions.js b/browser/components/migration/tests/unit/test_Safari_permissions.js
new file mode 100644
index 0000000000..eaa6c7788e
--- /dev/null
+++ b/browser/components/migration/tests/unit/test_Safari_permissions.js
@@ -0,0 +1,145 @@
+/* Any copyright is dedicated to the Public Domain.
+http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/**
+ * Tests that if the migrator does not have the permission to
+ * read from the Safari data directory, that it can request
+ * permission to read from it, if the system allows.
+ */
+
+const { SafariProfileMigrator } = ChromeUtils.importESModule(
+ "resource:///modules/SafariProfileMigrator.sys.mjs"
+);
+
+const { sinon } = ChromeUtils.importESModule(
+ "resource://testing-common/Sinon.sys.mjs"
+);
+
+const { MockFilePicker } = ChromeUtils.importESModule(
+ "resource://testing-common/MockFilePicker.sys.mjs"
+);
+
+let gDataDir;
+
+add_setup(async () => {
+ let tempDir = do_get_tempdir();
+ gDataDir = PathUtils.join(tempDir.path, "Safari");
+ await IOUtils.makeDirectory(gDataDir);
+
+ registerFakePath("ULibDir", tempDir);
+
+ MockFilePicker.init(globalThis);
+ registerCleanupFunction(() => {
+ MockFilePicker.cleanup();
+ });
+});
+
+/**
+ * Tests that canGetPermissions will return false if the platform does
+ * not allow for folder selection in the native file picker, and returns
+ * the data path otherwise.
+ */
+add_task(async function test_canGetPermissions() {
+ let sandbox = sinon.createSandbox();
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+
+ let migrator = new SafariProfileMigrator();
+ // Not being able to get a folder picker is not a problem on macOS, but
+ // we'll test that case anyways.
+ let canGetPermissionsStub = sandbox
+ .stub(MigrationUtils, "canGetPermissionsOnPlatform")
+ .resolves(false);
+
+ Assert.ok(
+ !(await migrator.canGetPermissions()),
+ "Should not be able to get permissions."
+ );
+
+ canGetPermissionsStub.resolves(true);
+
+ Assert.equal(
+ await migrator.canGetPermissions(),
+ gDataDir,
+ "Should be able to get the permissions path."
+ );
+
+ sandbox.restore();
+});
+
+/**
+ * Tests that getPermissions will show the native file picker in a
+ * loop until either the user cancels or selects a folder that grants
+ * read permissions to the data directory.
+ */
+add_task(async function test_getPermissions() {
+ let sandbox = sinon.createSandbox();
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+
+ let migrator = new SafariProfileMigrator();
+ sandbox.stub(MigrationUtils, "canGetPermissionsOnPlatform").resolves(true);
+ let hasPermissionsStub = sandbox
+ .stub(migrator, "hasPermissions")
+ .resolves(false);
+
+ Assert.equal(
+ await migrator.canGetPermissions(),
+ gDataDir,
+ "Should be able to get the permissions path."
+ );
+
+ let filePickerSeenCount = 0;
+
+ let filePickerShownPromise = new Promise(resolve => {
+ MockFilePicker.showCallback = () => {
+ Assert.ok(true, "Filepicker shown.");
+ MockFilePicker.useDirectory([gDataDir]);
+ filePickerSeenCount++;
+ if (filePickerSeenCount > 3) {
+ Assert.ok(true, "File picker looped 3 times.");
+ hasPermissionsStub.resolves(true);
+ resolve();
+ }
+ };
+ });
+ MockFilePicker.returnValue = MockFilePicker.returnOK;
+
+ // This is a little awkward, but we need to ensure that the
+ // filePickerShownPromise resolves first before we await
+ // the getPermissionsPromise in order to get the correct
+ // filePickerSeenCount.
+ let getPermissionsPromise = migrator.getPermissions();
+ await filePickerShownPromise;
+ Assert.ok(
+ await getPermissionsPromise,
+ "Should report that we got permissions."
+ );
+
+ // Make sure that the user can also hit "cancel" and that we
+ // file picker loop.
+
+ hasPermissionsStub.resolves(false);
+
+ filePickerSeenCount = 0;
+ filePickerShownPromise = new Promise(resolve => {
+ MockFilePicker.showCallback = () => {
+ Assert.ok(true, "Filepicker shown.");
+ filePickerSeenCount++;
+ Assert.equal(filePickerSeenCount, 1, "Saw the picker once.");
+ resolve();
+ };
+ });
+ MockFilePicker.returnValue = MockFilePicker.returnCancel;
+ Assert.ok(
+ !(await migrator.getPermissions()),
+ "Should report that we didn't get permissions."
+ );
+ await filePickerShownPromise;
+
+ sandbox.restore();
+});