diff options
Diffstat (limited to '')
-rw-r--r-- | comm/mailnews/compose/test/unit/test_autoReply.js | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/comm/mailnews/compose/test/unit/test_autoReply.js b/comm/mailnews/compose/test/unit/test_autoReply.js new file mode 100644 index 0000000000..a81dc7bcef --- /dev/null +++ b/comm/mailnews/compose/test/unit/test_autoReply.js @@ -0,0 +1,254 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +/** + * Tests messages generated by ReplyWithTemplate. + */ + +var { TestUtils } = ChromeUtils.importESModule( + "resource://testing-common/TestUtils.sys.mjs" +); +const { PromiseTestUtils } = ChromeUtils.import( + "resource://testing-common/mailnews/PromiseTestUtils.jsm" +); + +var { MailServices } = ChromeUtils.import( + "resource:///modules/MailServices.jsm" +); +const { MimeParser } = ChromeUtils.import("resource:///modules/mimeParser.jsm"); + +load("../../../resources/logHelper.js"); // watch for errors in the error console + +const kSender = "from@foo.invalid"; + +var gIncomingMailFile = do_get_file("../../../data/bugmail10"); // mail to reply to +// reply-filter-testmail: mail to reply to (but not really) +var gIncomingMailFile2 = do_get_file("../../../data/reply-filter-testmail"); +// mail to reply to (but not really, no from) +var gIncomingMailFile3 = do_get_file("../../../data/mail-without-from"); +var gTemplateMailFile = do_get_file("../../../data/template-latin1"); // template +var gTemplateMailFile2 = do_get_file("../../../data/template-utf8"); // template2 +var gTemplateFolder; + +var gServer; + +function run_test() { + localAccountUtils.loadLocalMailAccount(); + gTemplateFolder = + localAccountUtils.rootFolder.createLocalSubfolder("Templates"); + + gServer = setupServerDaemon(); + gServer.start(); + + run_next_test(); +} + +add_task(async function copy_gIncomingMailFile() { + let promiseCopyListener = new PromiseTestUtils.PromiseCopyListener(); + // Copy gIncomingMailFile into the Inbox. + MailServices.copy.copyFileMessage( + gIncomingMailFile, + localAccountUtils.inboxFolder, + null, + false, + 0, + "", + promiseCopyListener, + null + ); + await promiseCopyListener.promise; +}); + +add_task(async function copy_gIncomingMailFile2() { + let promiseCopyListener = new PromiseTestUtils.PromiseCopyListener(); + // Copy gIncomingMailFile2 into the Inbox. + MailServices.copy.copyFileMessage( + gIncomingMailFile2, + localAccountUtils.inboxFolder, + null, + false, + 0, + "", + promiseCopyListener, + null + ); + await promiseCopyListener.promise; +}); + +add_task(async function copy_gIncomingMailFile3() { + let promiseCopyListener = new PromiseTestUtils.PromiseCopyListener(); + // Copy gIncomingMailFile3 into the Inbox. + MailServices.copy.copyFileMessage( + gIncomingMailFile3, + localAccountUtils.inboxFolder, + null, + false, + 0, + "", + promiseCopyListener, + null + ); + await promiseCopyListener.promise; +}); + +add_task(async function copy_gTemplateMailFile() { + let promiseCopyListener = new PromiseTestUtils.PromiseCopyListener(); + // Copy gTemplateMailFile into the Templates folder. + MailServices.copy.copyFileMessage( + gTemplateMailFile, + gTemplateFolder, + null, + true, + 0, + "", + promiseCopyListener, + null + ); + await promiseCopyListener.promise; +}); + +add_task(async function copy_gTemplateMailFile2() { + let promiseCopyListener = new PromiseTestUtils.PromiseCopyListener(); + // Copy gTemplateMailFile2 into the Templates folder. + MailServices.copy.copyFileMessage( + gTemplateMailFile2, + gTemplateFolder, + null, + true, + 0, + "", + promiseCopyListener, + null + ); + await promiseCopyListener.promise; +}); + +// Test that a reply is NOT sent when the message is not addressed to "me". +add_task(async function testReplyingToUnaddressedFails() { + try { + await testReply(0); // mail 0 is not to us! + do_throw("Replied to a message not addressed to us!"); + } catch (e) { + if (e.result != Cr.NS_ERROR_ABORT) { + throw e; + } + // Ok! We didn't reply to the message not specifically addressed to + // us (from@foo.invalid). + } +}); + +// Test that a reply is sent when the message is addressed to "me". +add_task(async function testReplyingToAdressedWorksLatin1() { + try { + await testReply(1); // mail 1 is addressed to us, using template-latin1 + } catch (e) { + do_throw("Didn't reply properly to a message addressed to us! " + e); + } +}); + +// Test that a reply is sent when the message is addressed to "me". +add_task(async function testReplyingToAdressedWorksUTF8() { + try { + await testReply(1, 1); // mail 1 is addressed to us, template-utf8 + } catch (e) { + do_throw("Didn't reply properly to a message addressed to us! " + e); + } +}); + +// Test that a reply is NOT even tried when the message has no From. +add_task(async function testReplyingToMailWithNoFrom() { + try { + await testReply(2); // mail 2 has no From + do_throw( + "Shouldn't even have tried to reply reply to the message " + + "with no From and no Reply-To" + ); + } catch (e) { + if (e.result != Cr.NS_ERROR_FAILURE) { + throw e; + } + } +}); + +// Test reply with template. +async function testReply(aHrdIdx, aTemplateHdrIdx = 0) { + let smtpServer = getBasicSmtpServer(); + smtpServer.port = gServer.port; + + let identity = getSmtpIdentity(kSender, smtpServer); + localAccountUtils.msgAccount.addIdentity(identity); + + let msgHdr = mailTestUtils.getMsgHdrN(localAccountUtils.inboxFolder, aHrdIdx); + info( + "Msg#" + + aHrdIdx + + " author=" + + msgHdr.author + + ", recipients=" + + msgHdr.recipients + ); + let templateHdr = mailTestUtils.getMsgHdrN(gTemplateFolder, aTemplateHdrIdx); + + // See <method name="getTemplates"> in searchWidgets.xml + let msgTemplateUri = + gTemplateFolder.URI + + "?messageId=" + + templateHdr.messageId + + "&subject=" + + templateHdr.mime2DecodedSubject; + MailServices.compose.replyWithTemplate( + msgHdr, + msgTemplateUri, + null, + localAccountUtils.incomingServer + ); + + await TestUtils.waitForCondition(() => gServer._daemon.post); + let headers, body; + [headers, body] = MimeParser.extractHeadersAndBody(gServer._daemon.post); + Assert.ok(headers.get("Subject").startsWith("Auto: ")); + Assert.equal(headers.get("Auto-submitted"), "auto-replied"); + Assert.equal(headers.get("In-Reply-To"), "<" + msgHdr.messageId + ">"); + Assert.equal(headers.get("References"), "<" + msgHdr.messageId + ">"); + // XXX: something's wrong with how the fake server gets the data. + // The text gets converted to UTF-8 (regardless of what it is) at some point. + // Suspect a bug with how BinaryInputStream handles the strings. + if (templateHdr.charset == "windows-1252") { + // XXX: should really check for "åäö xlatin1" + if (!body.includes("åäö xlatin1")) { + // template-latin1 contains this + do_throw( + "latin1 body didn't go through! hdr msgid=" + + templateHdr.messageId + + ", msgbody=" + + body + ); + } + } else if (templateHdr.charset == "utf-8") { + // XXX: should really check for "åäö xutf8" + if (!body.includes("åäö xutf8")) { + // template-utf8 contains this + do_throw( + "utf8 body didn't go through! hdr msgid=" + + templateHdr.messageId + + ", msgbody=" + + body + ); + } + } else if (templateHdr.charset) { + do_throw( + "unexpected msg charset: " + + templateHdr.charset + + ", hdr msgid=" + + templateHdr.messageId + ); + } else { + do_throw("didn't find a msg charset! hdr msgid=" + templateHdr.messageId); + } + gServer.resetTest(); +} + +add_task(function teardown() { + // fake server cleanup + gServer.stop(); +}); |