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

"use strict";

// Test if the hamburger menu in about:preferences will remove the "update-restart" badge
// after the user declines the in-progress update when turning off automatic update
add_task(async function aboutPrefs_foregroundCheck_discardUpdateNotif() {
  await SpecialPowers.pushPrefEnv({
    set: [["app.update.badgeWaitTime", 0]],
  });

  let downloadInfo = [];
  if (Services.prefs.getBoolPref(PREF_APP_UPDATE_BITS_ENABLED)) {
    downloadInfo[0] = { patchType: "partial", bitsResult: "0" };
  } else {
    downloadInfo[0] = { patchType: "partial", internalResult: "0" };
  }

  // Since the partial should be successful specify an invalid size for the
  // complete update.
  let params = { queryString: "&promptWaitTime=0" };

  await runAboutPrefsUpdateTest(params, [
    {
      panelId: "checkingForUpdates",
      checkActiveUpdate: null,
      continueFile: CONTINUE_CHECK,
    },
    {
      panelId: "downloading",
      checkActiveUpdate: { state: STATE_DOWNLOADING },
      continueFile: CONTINUE_DOWNLOAD,
      downloadInfo,
    },
    async function aboutDialog_restart_notification() {
      is(
        PanelUI.isNotificationPanelOpen,
        true,
        "An update avaliable doorhanger notification exists"
      );
      // The panel may still be animating open, in which case its contents
      // aren't focusable yet.
      await BrowserTestUtils.waitForPopupEvent(
        PanelUI.notificationPanel,
        "shown"
      );
      let dismissButton = getNotificationButton(
        window,
        AppMenuNotifications.activeNotification.id,
        "secondaryButton"
      );
      dismissButton.click();
      await TestUtils.waitForCondition(
        () => PanelUI.menuButton.hasAttribute("badge-status"),
        "Waiting for update badge",
        undefined,
        200
      ).catch(e => {
        // Instead of throwing let the check below fail the test.
        logTestInfo(e);
      });
      ok(
        PanelUI.menuButton.hasAttribute("badge-status"),
        "The window has a badge."
      );
      is(
        PanelUI.menuButton.getAttribute("badge-status"),
        "update-restart",
        "The update restart badge is showing on the hamburger menu"
      );
    },
  ]);
  let manualDesktopCheckbox = content.document.getElementById("manualDesktop");
  manualDesktopCheckbox.click();
  is(
    manualDesktopCheckbox.checked,
    true,
    "Manual update option should be selected"
  );
  //The "accept" button is actually the "discard update" button on the dialog
  await BrowserTestUtils.promiseAlertDialog("accept");

  let notif_cleared_test = async () => {
    await TestUtils.waitForCondition(
      () => !PanelUI.menuButton.hasAttribute("badge-status"),
      "Waiting for the update badge to be cleared",
      undefined,
      200
    ).catch(e => {
      // Instead of throwing let the check below fail the test.
      logTestInfo(e);
    });
    is(
      PanelUI.menuButton.getAttribute("badge-status"),
      null,
      "The window does not have a badge."
    );
  };
  await notif_cleared_test();
});
