summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/imap/test/unit/test_imapFlagChange.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/imap/test/unit/test_imapFlagChange.js')
-rw-r--r--comm/mailnews/imap/test/unit/test_imapFlagChange.js216
1 files changed, 216 insertions, 0 deletions
diff --git a/comm/mailnews/imap/test/unit/test_imapFlagChange.js b/comm/mailnews/imap/test/unit/test_imapFlagChange.js
new file mode 100644
index 0000000000..332e434527
--- /dev/null
+++ b/comm/mailnews/imap/test/unit/test_imapFlagChange.js
@@ -0,0 +1,216 @@
+/* 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 to ensure that imap flag changes made from a different profile/machine
+ * are stored in db.
+ */
+
+var { MessageGenerator } = ChromeUtils.import(
+ "resource://testing-common/mailnews/MessageGenerator.jsm"
+);
+var { PromiseTestUtils } = ChromeUtils.import(
+ "resource://testing-common/mailnews/PromiseTestUtils.jsm"
+);
+
+var gMessage;
+var gSecondFolder;
+var gSynthMessage;
+
+add_setup(async function () {
+ Services.prefs.setBoolPref(
+ "mail.server.default.autosync_offline_stores",
+ false
+ );
+
+ setupIMAPPump();
+
+ IMAPPump.daemon.createMailbox("secondFolder", { subscribed: true });
+
+ // build up a diverse list of messages
+ let messages = [];
+ let gMessageGenerator = new MessageGenerator();
+ messages = messages.concat(gMessageGenerator.makeMessage());
+ gSynthMessage = messages[0];
+
+ let msgURI = Services.io.newURI(
+ "data:text/plain;base64," + btoa(gSynthMessage.toMessageString())
+ );
+ gMessage = new ImapMessage(msgURI.spec, IMAPPump.mailbox.uidnext++, []);
+ IMAPPump.mailbox.addMessage(gMessage);
+
+ // update folder to download header.
+ let listener = new PromiseTestUtils.PromiseUrlListener();
+ IMAPPump.inbox.updateFolderWithListener(null, listener);
+ await listener.promise;
+});
+
+add_task(async function switchAwayFromInbox() {
+ let rootFolder = IMAPPump.incomingServer.rootFolder;
+ gSecondFolder = rootFolder
+ .getChildNamed("secondFolder")
+ .QueryInterface(Ci.nsIMsgImapMailFolder);
+
+ // Selecting the second folder will close the cached connection
+ // on the inbox because fake server only supports one connection at a time.
+ // Then, we can poke at the message on the imap server directly, which
+ // simulates the user changing the message from a different machine,
+ // and Thunderbird discovering the change when it does a flag sync
+ // upon reselecting the Inbox.
+ let listener = new PromiseTestUtils.PromiseUrlListener();
+ gSecondFolder.updateFolderWithListener(null, listener);
+ await listener.promise;
+});
+
+add_task(async function simulateForwardFlagSet() {
+ gMessage.setFlag("$Forwarded");
+ let listener = new PromiseTestUtils.PromiseUrlListener();
+ IMAPPump.inbox.updateFolderWithListener(null, listener);
+ await listener.promise;
+});
+
+add_task(async function checkForwardedFlagSet() {
+ let msgHdr = IMAPPump.inbox.msgDatabase.getMsgHdrForMessageID(
+ gSynthMessage.messageId
+ );
+ Assert.equal(
+ msgHdr.flags & Ci.nsMsgMessageFlags.Forwarded,
+ Ci.nsMsgMessageFlags.Forwarded
+ );
+ let listener = new PromiseTestUtils.PromiseUrlListener();
+ gSecondFolder.updateFolderWithListener(null, listener);
+ await listener.promise;
+});
+
+add_task(async function clearForwardedFlag() {
+ gMessage.clearFlag("$Forwarded");
+ let listener = new PromiseTestUtils.PromiseUrlListener();
+ IMAPPump.inbox.updateFolderWithListener(null, listener);
+ await listener.promise;
+});
+
+add_task(async function checkForwardedFlagCleared() {
+ let msgHdr = IMAPPump.inbox.msgDatabase.getMsgHdrForMessageID(
+ gSynthMessage.messageId
+ );
+ Assert.equal(msgHdr.flags & Ci.nsMsgMessageFlags.Forwarded, 0);
+ let listener = new PromiseTestUtils.PromiseUrlListener();
+ gSecondFolder.updateFolderWithListener(null, listener);
+ await listener.promise;
+});
+
+add_task(async function setSeenFlag() {
+ gMessage.setFlag("\\Seen");
+ let listener = new PromiseTestUtils.PromiseUrlListener();
+ IMAPPump.inbox.updateFolderWithListener(null, listener);
+ await listener.promise;
+});
+
+add_task(async function checkSeenFlagSet() {
+ let msgHdr = IMAPPump.inbox.msgDatabase.getMsgHdrForMessageID(
+ gSynthMessage.messageId
+ );
+ Assert.equal(
+ msgHdr.flags & Ci.nsMsgMessageFlags.Read,
+ Ci.nsMsgMessageFlags.Read
+ );
+ let listener = new PromiseTestUtils.PromiseUrlListener();
+ gSecondFolder.updateFolderWithListener(null, listener);
+ await listener.promise;
+});
+
+add_task(async function simulateRepliedFlagSet() {
+ gMessage.setFlag("\\Answered");
+ let listener = new PromiseTestUtils.PromiseUrlListener();
+ IMAPPump.inbox.updateFolderWithListener(null, listener);
+ await listener.promise;
+});
+
+add_task(async function checkRepliedFlagSet() {
+ let msgHdr = IMAPPump.inbox.msgDatabase.getMsgHdrForMessageID(
+ gSynthMessage.messageId
+ );
+ Assert.equal(
+ msgHdr.flags & Ci.nsMsgMessageFlags.Replied,
+ Ci.nsMsgMessageFlags.Replied
+ );
+ let listener = new PromiseTestUtils.PromiseUrlListener();
+ gSecondFolder.updateFolderWithListener(null, listener);
+ await listener.promise;
+});
+
+add_task(async function simulateTagAdded() {
+ gMessage.setFlag("randomtag");
+ let listener = new PromiseTestUtils.PromiseUrlListener();
+ IMAPPump.inbox.updateFolderWithListener(null, listener);
+ await listener.promise;
+});
+
+add_task(async function checkTagSet() {
+ let msgHdr = IMAPPump.inbox.msgDatabase.getMsgHdrForMessageID(
+ gSynthMessage.messageId
+ );
+ let keywords = msgHdr.getStringProperty("keywords");
+ Assert.ok(keywords.includes("randomtag"));
+ let listener = new PromiseTestUtils.PromiseUrlListener();
+ gSecondFolder.updateFolderWithListener(null, listener);
+ await listener.promise;
+});
+
+/** Test that the NonJunk tag from the server is noticed. */
+add_task(async function checkNonJunkTagSet() {
+ gMessage.clearFlag("NotJunk");
+ gMessage.setFlag("NonJunk");
+ let listener = new PromiseTestUtils.PromiseUrlListener();
+ IMAPPump.inbox.updateFolderWithListener(null, listener);
+ await listener.promise;
+
+ let msgHdr = IMAPPump.inbox.msgDatabase.getMsgHdrForMessageID(
+ gSynthMessage.messageId
+ );
+ let junkScore = msgHdr.getStringProperty("junkscore");
+ Assert.equal(
+ junkScore,
+ Ci.nsIJunkMailPlugin.IS_HAM_SCORE,
+ "NonJunk flag on server should mark as ham"
+ );
+});
+
+/** Test that the NotJunk tag from the server is noticed. */
+add_task(async function checkNotJunkTagSet() {
+ gMessage.clearFlag("NonJunk");
+ gMessage.setFlag("NotJunk");
+ let listener = new PromiseTestUtils.PromiseUrlListener();
+ IMAPPump.inbox.updateFolderWithListener(null, listener);
+ await listener.promise;
+
+ let msgHdr = IMAPPump.inbox.msgDatabase.getMsgHdrForMessageID(
+ gSynthMessage.messageId
+ );
+ let junkScore = msgHdr.getStringProperty("junkscore");
+ Assert.equal(
+ junkScore,
+ Ci.nsIJunkMailPlugin.IS_HAM_SCORE,
+ "NotJunk flag on server should mark as ham"
+ );
+});
+
+add_task(async function clearTag() {
+ gMessage.clearFlag("randomtag");
+ let listener = new PromiseTestUtils.PromiseUrlListener();
+ IMAPPump.inbox.updateFolderWithListener(null, listener);
+ await listener.promise;
+});
+
+add_task(function checkTagCleared() {
+ let msgHdr = IMAPPump.inbox.msgDatabase.getMsgHdrForMessageID(
+ gSynthMessage.messageId
+ );
+ let keywords = msgHdr.getStringProperty("keywords");
+ Assert.ok(!keywords.includes("randomtag"));
+});
+
+add_task(function endTest() {
+ teardownIMAPPump();
+});