/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

// Tests the dialog which allows the user to unblock a downloaded file.

registerCleanupFunction(() => {});

async function assertDialogResult({ args, buttonToClick, expectedResult }) {
  let promise = BrowserTestUtils.promiseAlertDialog(buttonToClick);
  is(
    await DownloadsCommon.confirmUnblockDownload(args),
    expectedResult,
    `Expect ${expectedResult} from ${buttonToClick}`
  );
  await promise;
}

/**
 * Tests the "unblock" dialog, for each of the possible verdicts.
 */
add_task(async function test_unblock_dialog_unblock() {
  for (let verdict of [
    Downloads.Error.BLOCK_VERDICT_MALWARE,
    Downloads.Error.BLOCK_VERDICT_POTENTIALLY_UNWANTED,
    Downloads.Error.BLOCK_VERDICT_INSECURE,
    Downloads.Error.BLOCK_VERDICT_UNCOMMON,
  ]) {
    let args = { verdict, window, dialogType: "unblock" };

    // Test both buttons.
    await assertDialogResult({
      args,
      buttonToClick: "accept",
      expectedResult: "unblock",
    });
    await assertDialogResult({
      args,
      buttonToClick: "cancel",
      expectedResult: "cancel",
    });
  }
});

/**
 * Tests the "chooseUnblock" dialog for potentially unwanted downloads.
 */
add_task(async function test_chooseUnblock_dialog() {
  for (let verdict of [
    Downloads.Error.BLOCK_VERDICT_POTENTIALLY_UNWANTED,
    Downloads.Error.BLOCK_VERDICT_INSECURE,
  ]) {
    let args = {
      verdict,
      window,
      dialogType: "chooseUnblock",
    };

    // Test each of the three buttons.
    await assertDialogResult({
      args,
      buttonToClick: "accept",
      expectedResult: "unblock",
    });
    await assertDialogResult({
      args,
      buttonToClick: "cancel",
      expectedResult: "cancel",
    });
    await assertDialogResult({
      args,
      buttonToClick: "extra1",
      expectedResult: "confirmBlock",
    });
  }
});

/**
 * Tests the "chooseOpen" dialog for uncommon downloads.
 */
add_task(async function test_chooseOpen_dialog() {
  for (let verdict of [
    Downloads.Error.BLOCK_VERDICT_UNCOMMON,
    Downloads.Error.BLOCK_VERDICT_INSECURE,
  ]) {
    let args = {
      verdict,
      window,
      dialogType: "chooseOpen",
    };

    // Test each of the three buttons.
    await assertDialogResult({
      args,
      buttonToClick: "accept",
      expectedResult: "open",
    });
    await assertDialogResult({
      args,
      buttonToClick: "cancel",
      expectedResult: "cancel",
    });
    await assertDialogResult({
      args,
      buttonToClick: "extra1",
      expectedResult: "confirmBlock",
    });
  }
});
