summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/base/test/unit/test_newMailNotification.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/base/test/unit/test_newMailNotification.js')
-rw-r--r--comm/mailnews/base/test/unit/test_newMailNotification.js203
1 files changed, 203 insertions, 0 deletions
diff --git a/comm/mailnews/base/test/unit/test_newMailNotification.js b/comm/mailnews/base/test/unit/test_newMailNotification.js
new file mode 100644
index 0000000000..d6e111d86a
--- /dev/null
+++ b/comm/mailnews/base/test/unit/test_newMailNotification.js
@@ -0,0 +1,203 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* Tests for platform-independent code to count new and unread messages and pass the
+ * information to platform-specific notification modules */
+
+var { MailServices } = ChromeUtils.import(
+ "resource:///modules/MailServices.jsm"
+);
+
+/**
+ * Register listener for a particular event, make sure it shows up in the right lists
+ * of listeners (and not the wrong ones) and doesn't show up after being removed
+ */
+add_test(function testListeners() {
+ let notif = MailServices.newMailNotification.wrappedJSObject;
+ let listener = { onCountChanged: () => {} };
+
+ notif.addListener(listener, Ci.mozINewMailNotificationService.count);
+ let list = notif.listenersForFlag(Ci.mozINewMailNotificationService.count);
+ Assert.equal(list.length, 1);
+ Assert.equal(list[0], listener);
+
+ let newlist = notif.listenersForFlag(
+ Ci.mozINewMailNotificationService.messages
+ );
+ Assert.equal(newlist.length, 0);
+
+ notif.removeListener(listener);
+ list = notif.listenersForFlag(Ci.mozINewMailNotificationService.count);
+ Assert.equal(list.length, 0);
+
+ run_next_test();
+});
+
+/*
+ * Register a listener for two types and another for one type, make sure they show up,
+ * remove one and make sure the other stays put
+ */
+add_test(function testMultiListeners() {
+ let notif = MailServices.newMailNotification.wrappedJSObject;
+ let l1 = { onCountChanged: () => {} };
+ let l2 = { b: 2 };
+
+ notif.addListener(
+ l1,
+ Ci.mozINewMailNotificationService.count |
+ Ci.mozINewMailNotificationService.messages
+ );
+ // do_check_eq(notif._listeners.length, 1);
+ notif.addListener(l2, Ci.mozINewMailNotificationService.messages);
+ // do_check_eq(notif._listeners.length, 2);
+ let list = notif.listenersForFlag(Ci.mozINewMailNotificationService.count);
+ Assert.equal(list.length, 1);
+ Assert.equal(list[0], l1);
+
+ let newlist = notif.listenersForFlag(
+ Ci.mozINewMailNotificationService.messages
+ );
+ Assert.equal(newlist.length, 2);
+
+ notif.removeListener(l1);
+ list = notif.listenersForFlag(Ci.mozINewMailNotificationService.count);
+ Assert.equal(list.length, 0);
+ newlist = notif.listenersForFlag(Ci.mozINewMailNotificationService.messages);
+ Assert.equal(newlist.length, 1);
+ Assert.equal(newlist[0], l2);
+ notif.removeListener(l2);
+
+ run_next_test();
+});
+
+/* Make sure we get a notification call when the unread count changes on an Inbox */
+add_test(function testNotifyInbox() {
+ let notified = false;
+ let count = 0;
+ let mockListener = {
+ onCountChanged: function TNU_onCountChanged(updatedCount) {
+ notified = true;
+ count = updatedCount;
+ },
+ };
+ let folder = {
+ URI: "Test Inbox",
+ flags: Ci.nsMsgFolderFlags.Mail | Ci.nsMsgFolderFlags.Inbox,
+ };
+
+ const notificationService = MailServices.newMailNotification.wrappedJSObject;
+
+ // Set up the notification service to start with a non-zero unread count to
+ // verify this value is correctly passed to new listeners. Do this before any
+ // listeners are added.
+ const startCount = 3;
+ notificationService.unreadCount = startCount;
+
+ // Add a listener for count updates.
+ notificationService.addListener(
+ mockListener,
+ Ci.mozINewMailNotificationService.count
+ );
+
+ // Verify that a new listener is notified of the current count.
+ Assert.ok(notified, "New listeners should be notified of count when added.");
+ Assert.equal(
+ count,
+ startCount,
+ "New listener notification should contain the current unread count."
+ );
+
+ // Verify that listeners are notified of subsequent changes.
+ notified = false;
+ const updatedInboxCount = 5;
+ notificationService.onFolderIntPropertyChanged(
+ folder,
+ "TotalUnreadMessages",
+ startCount,
+ updatedInboxCount
+ );
+ Assert.ok(
+ notified,
+ "Listeners should be notified of changes in inbox unread count."
+ );
+ Assert.equal(
+ count,
+ updatedInboxCount,
+ "Notification should contain updated inbox unread count."
+ );
+
+ // Sanity check.
+ Assert.ok(
+ Services.prefs.getBoolPref("mail.notification.count.inbox_only", false),
+ "`inbox_only` pref should be true for test."
+ );
+
+ // Verify that listeners are not notified of changes outside of the inbox.
+ let nonInbox = {
+ URI: "Test Non-Inbox",
+ flags: Ci.nsMsgFolderFlags.Mail,
+ };
+ notified = false;
+ notificationService.onFolderIntPropertyChanged(
+ nonInbox,
+ "TotalUnreadMessages",
+ 0,
+ 2
+ );
+ Assert.ok(
+ !notified,
+ "Listeners should not be notified of changes in unread count outside of inbox by default."
+ );
+ Assert.equal(
+ count,
+ updatedInboxCount,
+ "Total unread message count should not have changed."
+ );
+
+ // Verify that, when `inbox_only` is false, unread messages outside of the
+ // inbox are counted.
+ Services.prefs.setBoolPref("mail.notification.count.inbox_only", false);
+ notified = false;
+ const updatedNonInboxCount = 2;
+ const updatedTotalCount = updatedInboxCount + updatedNonInboxCount;
+ notificationService.onFolderIntPropertyChanged(
+ nonInbox,
+ "TotalUnreadMessages",
+ 0,
+ updatedNonInboxCount
+ );
+ Assert.ok(
+ notified,
+ "Listeners should be notified of changes in unread count outside of inbox when pref is set."
+ );
+ Assert.equal(
+ count,
+ updatedTotalCount,
+ "Notification should contain total unread count for all counted folders."
+ );
+
+ // Verify that listeners are never informed of updates in special folders.
+ let special = {
+ URI: "Test Special",
+ flags: Ci.nsMsgFolderFlags.Mail | Ci.nsMsgFolderFlags.Junk,
+ };
+ notified = false;
+ notificationService.onFolderIntPropertyChanged(
+ special,
+ "TotalUnreadMessages",
+ 0,
+ 2
+ );
+ Assert.ok(
+ !notified,
+ "Listeners should not be notified of changes in special folder unread count."
+ );
+ Assert.equal(
+ count,
+ updatedTotalCount,
+ "Total unread message count should not have changed."
+ );
+
+ run_next_test();
+});