/* 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 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(); });