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

// Test that the empty notice in the list view disappears as it should

// Don't use a standard list view (e.g. "extension") to ensure that the list is
// initially empty. Don't need to worry about the list of categories displayed
// since only the list view itself is tested.
let VIEW_ID = "addons://list/mock-addon";

let LIST_ID = "addon-list";
let EMPTY_ID = "addon-list-empty";

let gManagerWindow;
let gProvider;
let gItem;

let gInstallProperties = {
  name: "Bug 591663 Mock Install",
  type: "mock-addon"
};
let gAddonProperties = {
  id: "test1@tests.mozilla.org",
  name: "Bug 591663 Mock Add-on",
  type: "mock-addon"
};
let gExtensionProperties = {
  name: "Bug 591663 Extension Install",
  type: "extension"
};

function test() {
  waitForExplicitFinish();

  gProvider = new MockProvider(true, [{
    id: "mock-addon",
    name: "Mock Add-ons",
    uiPriority: 4500,
    flags: AddonManager.TYPE_UI_VIEW_LIST
  }]);

  open_manager(VIEW_ID, function(aWindow) {
    gManagerWindow = aWindow;
    run_next_test();
  });
}

function end_test() {
  close_manager(gManagerWindow, finish);
}

/**
 * Check that the list view is as expected
 *
 * @param  aItem
 *         The expected item in the list, or null if list should be empty
 */
function check_list(aItem) {
  // Check state of the empty notice
  let emptyNotice = gManagerWindow.document.getElementById(EMPTY_ID);
  ok(emptyNotice != null, "Should have found the empty notice");
  is(!emptyNotice.hidden, (aItem == null), "Empty notice should be showing if list empty");

  // Check the children of the list
  let list = gManagerWindow.document.getElementById(LIST_ID);
  is(list.itemCount, aItem ? 1 : 0, "Should get expected number of items in list");
  if (aItem != null) {
    let itemName = list.firstChild.getAttribute("name");
    is(itemName, aItem.name, "List item should have correct name");
  }
}


// Test that the empty notice is showing and no items are showing in list
add_test(function() {
  check_list(null);
  run_next_test();
});

// Test that a new, non-active, install does not affect the list view
add_test(function() {
  gItem = gProvider.createInstalls([gInstallProperties])[0];
  check_list(null);
  run_next_test();
});

// Test that onInstallStarted properly hides empty notice and adds install to list
add_test(function() {
  gItem.addTestListener({
    onDownloadStarted: function() {
      // Install type unknown until download complete
      check_list(null);
    },
    onInstallStarted: function() {
      check_list(gItem);
    },
    onInstallEnded: function() {
      check_list(gItem);
      run_next_test();
    }
  });

  gItem.install();
});

// Test that restarting the manager does not change list
add_test(function() {
  restart_manager(gManagerWindow, VIEW_ID, function(aManagerWindow) {
    gManagerWindow = aManagerWindow;
    check_list(gItem);
    run_next_test();
  });
});

// Test that onInstallCancelled removes install and shows empty notice
add_test(function() {
  gItem.cancel();
  gItem = null;
  check_list(null);
  run_next_test();
});

// Test that add-ons of a different type do not show up in the list view
add_test(function() {
  let extension = gProvider.createInstalls([gExtensionProperties])[0];
  check_list(null);

  extension.addTestListener({
    onDownloadStarted: function() {
      check_list(null);
    },
    onInstallStarted: function() {
      check_list(null);
    },
    onInstallEnded: function() {
      check_list(null);
      extension.cancel();
      run_next_test();
    }
  });

  extension.install();
});

// Test that onExternalInstall properly hides empty notice and adds install to list
add_test(function() {
  gItem = gProvider.createAddons([gAddonProperties])[0];
  check_list(gItem);
  run_next_test();
});

// Test that restarting the manager does not change list
add_test(function() {
  restart_manager(gManagerWindow, VIEW_ID, function(aManagerWindow) {
    gManagerWindow = aManagerWindow;
    check_list(gItem);
    run_next_test();
  });
});

