diff options
Diffstat (limited to 'comm/mailnews/imap/test/unit/test_imapUndo.js')
-rw-r--r-- | comm/mailnews/imap/test/unit/test_imapUndo.js | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/comm/mailnews/imap/test/unit/test_imapUndo.js b/comm/mailnews/imap/test/unit/test_imapUndo.js new file mode 100644 index 0000000000..8db0ad6903 --- /dev/null +++ b/comm/mailnews/imap/test/unit/test_imapUndo.js @@ -0,0 +1,160 @@ +/* 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/. */ + +// This file tests undoing of an imap delete to the trash. +// There are three main cases: +// 1. Normal undo +// 2. Undo after the source folder has been compacted. +// 2.1 Same, but the server doesn't support COPYUID (GMail case) +// +// Original Author: David Bienvenu <bienvenu@nventure.com> + +var { MailServices } = ChromeUtils.import( + "resource:///modules/MailServices.jsm" +); +var { PromiseTestUtils } = ChromeUtils.import( + "resource://testing-common/mailnews/PromiseTestUtils.jsm" +); + +var gRootFolder; +var gMessages = []; +var gMsgWindow; + +var gMsgFile1 = do_get_file("../../../data/bugmail10"); +var gMsgFile2 = do_get_file("../../../data/bugmail11"); +// var gMsgFile3 = do_get_file("../../../data/draft1"); +var gMsgFile4 = do_get_file("../../../data/bugmail7"); +var gMsgFile5 = do_get_file("../../../data/bugmail6"); + +// Copied straight from the example files +var gMsgId1 = "200806061706.m56H6RWT004933@mrapp54.mozilla.org"; +var gMsgId2 = "200804111417.m3BEHTk4030129@mrapp51.mozilla.org"; +// var gMsgId3 = "4849BF7B.2030800@example.com"; +var gMsgId4 = "bugmail7.m47LtAEf007542@mrapp51.mozilla.org"; +var gMsgId5 = "bugmail6.m47LtAEf007542@mrapp51.mozilla.org"; + +// Adds some messages directly to a mailbox (eg new mail) +function addMessagesToServer(messages, mailbox) { + // For every message we have, we need to convert it to a file:/// URI + messages.forEach(function (message) { + let URI = Services.io + .newFileURI(message.file) + .QueryInterface(Ci.nsIFileURL); + // Create the ImapMessage and store it on the mailbox. + mailbox.addMessage(new ImapMessage(URI.spec, mailbox.uidnext++, [])); + }); +} + +function alertListener() {} + +alertListener.prototype = { + reset() {}, + + onAlert(aMessage, aMsgWindow) { + throw new Error("got alert - TEST FAILED " + aMessage); + }, +}; + +add_setup(function () { + setupIMAPPump(); + + var listener1 = new alertListener(); + + MailServices.mailSession.addUserFeedbackListener(listener1); + + Services.prefs.setBoolPref( + "mail.server.server1.autosync_offline_stores", + false + ); + Services.prefs.setBoolPref("mail.server.server1.offline_download", false); + + gMsgWindow = Cc["@mozilla.org/messenger/msgwindow;1"].createInstance( + Ci.nsIMsgWindow + ); + + gRootFolder = IMAPPump.incomingServer.rootFolder; + // these hacks are required because we've created the inbox before + // running initial folder discovery, and adding the folder bails + // out before we set it as verified online, so we bail out, and + // then remove the INBOX folder since it's not verified. + IMAPPump.inbox.hierarchyDelimiter = "/"; + IMAPPump.inbox.verifiedAsOnlineFolder = true; + + // Add a couple of messages to the INBOX + // this is synchronous, afaik + addMessagesToServer( + [ + { file: gMsgFile1, messageId: gMsgId1 }, + { file: gMsgFile4, messageId: gMsgId4 }, + { file: gMsgFile5, messageId: gMsgId5 }, + { file: gMsgFile2, messageId: gMsgId2 }, + ], + IMAPPump.mailbox + ); +}); + +add_task(async function updateFolder() { + let listener = new PromiseTestUtils.PromiseUrlListener(); + IMAPPump.inbox.updateFolderWithListener(null, listener); + await listener.promise; +}); + +add_task(async function deleteMessage() { + let msgToDelete = IMAPPump.inbox.msgDatabase.getMsgHdrForMessageID(gMsgId1); + let copyListener = new PromiseTestUtils.PromiseCopyListener(); + gMessages.push(msgToDelete); + IMAPPump.inbox.deleteMessages( + gMessages, + gMsgWindow, + false, + true, + copyListener, + true + ); + await copyListener.promise; +}); + +add_task(async function expunge() { + let listener = new PromiseTestUtils.PromiseUrlListener(); + IMAPPump.inbox.expunge(listener, gMsgWindow); + await listener.promise; + + // Ensure that the message has been surely deleted. + Assert.equal(IMAPPump.inbox.msgDatabase.dBFolderInfo.numMessages, 3); +}); + +add_task(async function undoDelete() { + gMsgWindow.transactionManager.undoTransaction(); + // after undo, we select the trash and then the inbox, so that we sync + // up with the server, and clear out the effects of having done the + // delete offline. + let listener = new PromiseTestUtils.PromiseUrlListener(); + let trash = gRootFolder.getChildNamed("Trash"); + trash + .QueryInterface(Ci.nsIMsgImapMailFolder) + .updateFolderWithListener(null, listener); + await listener.promise; +}); + +add_task(async function goBackToInbox() { + let listener = new PromiseTestUtils.PromiseUrlListener(); + IMAPPump.inbox.updateFolderWithListener(gMsgWindow, listener); + await listener.promise; +}); + +add_task(function verifyFolders() { + let msgRestored = IMAPPump.inbox.msgDatabase.getMsgHdrForMessageID(gMsgId1); + Assert.ok(msgRestored !== null); + Assert.equal(IMAPPump.inbox.msgDatabase.dBFolderInfo.numMessages, 4); +}); + +add_task(function endTest() { + // Cleanup, null out everything, close all cached connections and stop the + // server + gMessages = []; + gMsgWindow.closeWindow(); + gMsgWindow = null; + gRootFolder = null; + teardownIMAPPump(); +}); |