summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/base/test/unit/test_bug428427.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/base/test/unit/test_bug428427.js')
-rw-r--r--comm/mailnews/base/test/unit/test_bug428427.js249
1 files changed, 249 insertions, 0 deletions
diff --git a/comm/mailnews/base/test/unit/test_bug428427.js b/comm/mailnews/base/test/unit/test_bug428427.js
new file mode 100644
index 0000000000..f00f2bd571
--- /dev/null
+++ b/comm/mailnews/base/test/unit/test_bug428427.js
@@ -0,0 +1,249 @@
+/* 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/. */
+
+// Test of message count changes in virtual folder views
+
+var { MailServices } = ChromeUtils.import(
+ "resource:///modules/MailServices.jsm"
+);
+
+var bugmail1 = do_get_file("../../../data/bugmail1");
+// main test
+
+// the headers for the test messages. All messages are identical, but
+// have different properties set on them.
+var hdrs = [];
+
+// how many identical messages to load
+var messageCount = 5;
+
+// tag used with test messages
+var tag1 = "istag";
+
+function run_test() {
+ localAccountUtils.loadLocalMailAccount();
+
+ // Get messageCount messages into the local filestore.
+ do_test_pending();
+
+ // function setupVirtualFolder() continues the testing after copyFileMessage.
+ MailServices.copy.copyFileMessage(
+ bugmail1,
+ localAccountUtils.inboxFolder,
+ null,
+ false,
+ 0,
+ "",
+ copyListener,
+ null
+ );
+ return true;
+}
+
+// nsIMsgCopyServiceListener implementation
+var copyListener = {
+ OnStartCopy() {},
+ OnProgress(aProgress, aProgressMax) {},
+ SetMessageKey(aKey) {
+ hdrs.push(localAccountUtils.inboxFolder.GetMessageHeader(aKey));
+ },
+ SetMessageId(aMessageId) {},
+ OnStopCopy(aStatus) {
+ if (--messageCount) {
+ MailServices.copy.copyFileMessage(
+ bugmail1,
+ localAccountUtils.inboxFolder,
+ null,
+ false,
+ 0,
+ "",
+ copyListener,
+ null
+ );
+ } else {
+ try {
+ setupVirtualFolder();
+ } catch (ex) {
+ dump(ex);
+ }
+ }
+ },
+};
+
+var virtualFolder;
+var numTotalMessages;
+var numUnreadMessages;
+
+// virtual folder setup
+function setupVirtualFolder() {
+ // add as valid tag tag1, though probably not really necessary
+ MailServices.tags.addTagForKey(tag1, tag1, null, null);
+
+ // add tag1 to 4 messages
+ let messages0to3 = [hdrs[0], hdrs[1], hdrs[2], hdrs[3]];
+ localAccountUtils.inboxFolder.addKeywordsToMessages(messages0to3, tag1);
+
+ // set 3 messages unread, 2 messages read
+ let messages0to2 = [hdrs[0], hdrs[1], hdrs[2]];
+ localAccountUtils.inboxFolder.markMessagesRead(messages0to2, false);
+
+ let messages3to4 = [hdrs[3], hdrs[4]];
+ localAccountUtils.inboxFolder.markMessagesRead(messages3to4, true);
+
+ // search will look for tag tag1 in the inbox folder
+ var searchTerm = makeSearchTerm(
+ localAccountUtils.inboxFolder,
+ tag1,
+ Ci.nsMsgSearchAttrib.Keywords,
+ Ci.nsMsgSearchOp.Contains
+ );
+
+ dump("creating virtual folder\n");
+ var rootFolder = localAccountUtils.incomingServer.rootMsgFolder;
+ virtualFolder = CreateVirtualFolder(
+ "VfTest",
+ rootFolder,
+ localAccountUtils.inboxFolder.URI,
+ searchTerm,
+ false
+ );
+
+ // Setup search session. Execution continues with testVirtualFolder()
+ // after search is done.
+
+ var searchSession = Cc[
+ "@mozilla.org/messenger/searchSession;1"
+ ].createInstance(Ci.nsIMsgSearchSession);
+ searchSession.addScopeTerm(
+ Ci.nsMsgSearchScope.offlineMail,
+ localAccountUtils.inboxFolder
+ );
+ searchSession.appendTerm(searchTerm, false);
+ searchSession.registerListener(searchListener);
+ dump("starting search of vf\n");
+ searchSession.search(null);
+}
+
+// partially based on gSearchNotificationListener in searchBar.js
+// nsIMsgSearchNotify implementation
+var searchListener = {
+ onNewSearch() {
+ dump("in onnewsearch\n");
+ numTotalMessages = 0;
+ numUnreadMessages = 0;
+ },
+ onSearchHit(dbHdr, folder) {
+ print("Search hit, isRead is " + dbHdr.isRead);
+ numTotalMessages++;
+ if (!dbHdr.isRead) {
+ numUnreadMessages++;
+ }
+ },
+ onSearchDone(status) {
+ print("Finished search hitCount = " + numTotalMessages);
+ var db = virtualFolder.msgDatabase;
+ var dbFolderInfo = db.dBFolderInfo;
+ dbFolderInfo.numMessages = numTotalMessages;
+ dbFolderInfo.numUnreadMessages = numUnreadMessages;
+ virtualFolder.updateSummaryTotals(true);
+ print("virtual folder unread is " + virtualFolder.getNumUnread(false));
+ testVirtualFolder();
+ },
+};
+
+function testVirtualFolder() {
+ // basic functionality tests
+
+ // total messages matching search
+ Assert.equal(4, virtualFolder.getTotalMessages(false));
+
+ // total unread messages in search
+ Assert.equal(3, virtualFolder.getNumUnread(false));
+
+ // change unread of one item in search to decrease count
+ localAccountUtils.inboxFolder.markMessagesRead([hdrs[0]], true);
+ virtualFolder.updateSummaryTotals(true);
+
+ Assert.equal(2, virtualFolder.getNumUnread(false));
+
+ // failures fixed in this bug
+
+ // remove tag from one item to decrease count
+ var message1 = [hdrs[1]];
+ localAccountUtils.inboxFolder.removeKeywordsFromMessages(message1, tag1);
+ virtualFolder.updateSummaryTotals(true);
+ Assert.equal(3, virtualFolder.getTotalMessages(false));
+ Assert.equal(1, virtualFolder.getNumUnread(false));
+
+ // End of test, so release our header references
+ hdrs = null;
+
+ do_test_finished();
+ return true;
+}
+
+// helper functions
+
+// adapted from commandglue.js
+function CreateVirtualFolder(
+ newName,
+ parentFolder,
+ searchFolderURIs,
+ searchTerm,
+ searchOnline
+) {
+ var newFolder = parentFolder.addSubfolder(newName);
+ newFolder.setFlag(Ci.nsMsgFolderFlags.Virtual);
+ var vfdb = newFolder.msgDatabase;
+ var searchTermString = getSearchTermString(searchTerm);
+
+ var dbFolderInfo = vfdb.dBFolderInfo;
+ // set the view string as a property of the db folder info
+ // set the original folder name as well.
+ dbFolderInfo.setCharProperty("searchStr", searchTermString);
+ dbFolderInfo.setCharProperty("searchFolderUri", searchFolderURIs);
+ dbFolderInfo.setBooleanProperty("searchOnline", searchOnline);
+ // This fails because the folder doesn't exist - why were we doing it?
+ // vfdb.summaryValid = true;
+ vfdb.close(true);
+ // use acctMgr to setup the virtual folder listener
+ var acctMgr = MailServices.accounts.QueryInterface(Ci.nsIFolderListener);
+ // print(acctMgr);
+ acctMgr.onFolderAdded(parentFolder, newFolder);
+ return newFolder;
+}
+
+function getSearchTermString(term) {
+ var condition = "";
+
+ if (condition.length > 1) {
+ condition += " ";
+ }
+
+ if (term.matchAll) {
+ condition = "ALL";
+ }
+ condition += term.booleanAnd ? "AND (" : "OR (";
+ condition += term.termAsString + ")";
+ return condition;
+}
+
+// Create a search term for searching aFolder
+// using aAttrib, aOp, and string aStrValue
+function makeSearchTerm(aFolder, aStrValue, aAttrib, aOp) {
+ // use a temporary search session
+ var searchSession = Cc[
+ "@mozilla.org/messenger/searchSession;1"
+ ].createInstance(Ci.nsIMsgSearchSession);
+ searchSession.addScopeTerm(Ci.nsMsgSearchScope.offlineMail, aFolder);
+ var searchTerm = searchSession.createTerm();
+ var value = searchTerm.value;
+ value.str = aStrValue;
+ searchTerm.value = value;
+ searchTerm.attrib = aAttrib;
+ searchTerm.op = aOp;
+ searchTerm.booleanAnd = false;
+ searchSession = null;
+ return searchTerm;
+}