summaryrefslogtreecommitdiffstats
path: root/comm/mail/test/browser/composition/browser_replyAddresses.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/test/browser/composition/browser_replyAddresses.js')
-rw-r--r--comm/mail/test/browser/composition/browser_replyAddresses.js1143
1 files changed, 1143 insertions, 0 deletions
diff --git a/comm/mail/test/browser/composition/browser_replyAddresses.js b/comm/mail/test/browser/composition/browser_replyAddresses.js
new file mode 100644
index 0000000000..0cf540297c
--- /dev/null
+++ b/comm/mail/test/browser/composition/browser_replyAddresses.js
@@ -0,0 +1,1143 @@
+/* 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/. */
+
+/**
+ * Tests that we get correct adressees for different type of replies:
+ * reply to sender, reply to all, reply to list, mail-followup-tp,
+ * mail-reply-to, and reply to self.
+ */
+
+"use strict";
+
+var {
+ close_compose_window,
+ open_compose_with_reply,
+ open_compose_with_reply_to_all,
+ open_compose_with_reply_to_list,
+} = ChromeUtils.import("resource://testing-common/mozmill/ComposeHelpers.jsm");
+var {
+ add_message_to_folder,
+ assert_selected_and_displayed,
+ be_in_folder,
+ create_message,
+ mc,
+ select_click_row,
+} = ChromeUtils.import(
+ "resource://testing-common/mozmill/FolderDisplayHelpers.jsm"
+);
+
+var folder;
+var i = 0;
+
+var myEmail = "me@example.com";
+var myEmail2 = "otherme@example.com";
+
+var identity;
+var identity2;
+
+var { MailServices } = ChromeUtils.import(
+ "resource:///modules/MailServices.jsm"
+);
+
+add_setup(function () {
+ requestLongerTimeout(4);
+
+ // Now set up an account with some identities.
+ let account = MailServices.accounts.createAccount();
+ account.incomingServer = MailServices.accounts.createIncomingServer(
+ "nobody",
+ "Reply Addresses Testing",
+ "pop3"
+ );
+
+ folder = account.incomingServer.rootFolder
+ .QueryInterface(Ci.nsIMsgLocalMailFolder)
+ .createLocalSubfolder("Msgs4Reply");
+
+ identity = MailServices.accounts.createIdentity();
+ identity.email = myEmail;
+ account.addIdentity(identity);
+
+ identity2 = MailServices.accounts.createIdentity();
+ identity2.email = myEmail2;
+ account.addIdentity(identity2);
+
+ registerCleanupFunction(() => {
+ MailServices.accounts.removeAccount(account, true);
+ });
+
+ // Let's add messages to the folder later as we go, it's hard to read
+ // out of context what the expected results should be.
+});
+
+/**
+ * Helper to open a reply, check the fields are as expected, and close the
+ * reply window.
+ *
+ * @param aReplyFunction which reply function to call
+ * @param aExpectedFields the fields expected
+ */
+function checkReply(aReplyFunction, aExpectedFields) {
+ let rwc = aReplyFunction();
+ checkToAddresses(rwc, aExpectedFields);
+ close_compose_window(rwc);
+}
+
+/**
+ * Helper to check that the reply window has the expected address fields.
+ */
+function checkToAddresses(replyWinController, expectedFields) {
+ let rows = replyWinController.window.document.querySelectorAll(
+ "#recipientsContainer .address-row:not(.hidden)"
+ );
+
+ let obtainedFields = [];
+ for (let row of rows) {
+ let addresses = [];
+ for (let pill of row.querySelectorAll("mail-address-pill")) {
+ addresses.push(pill.fullAddress);
+ }
+
+ obtainedFields[row.dataset.recipienttype] = addresses;
+ }
+
+ // Check what we expect is there.
+ for (let type in expectedFields) {
+ let expected = expectedFields[type];
+ let obtained = obtainedFields[type];
+
+ for (let i = 0; i < expected.length; i++) {
+ if (!obtained || !obtained.includes(expected[i])) {
+ throw new Error(
+ expected[i] +
+ " is not in " +
+ type +
+ " fields; " +
+ "obtained=" +
+ obtained
+ );
+ }
+ }
+ Assert.equal(
+ obtained.length,
+ expected.length,
+ "Unexpected number of fields obtained for type=" +
+ type +
+ "; obtained=" +
+ obtained +
+ "; expected=" +
+ expected
+ );
+ }
+
+ // Check there's no "extra" fields either.
+ for (let type in obtainedFields) {
+ let expected = expectedFields[type];
+ let obtained = obtainedFields[type];
+ if (!expected) {
+ throw new Error(
+ "Didn't expect a field for type=" + type + "; obtained=" + obtained
+ );
+ }
+ }
+
+ // Check if the input "aria-label" attribute was properly updated.
+ for (let row of rows) {
+ let addrLabel = row.querySelector(".address-label-container > label").value;
+ let addrTextbox = row.querySelector(".address-row-input");
+ let ariaLabel = addrTextbox.getAttribute("aria-label");
+ let pillCount = row.querySelectorAll("mail-address-pill").length;
+
+ switch (pillCount) {
+ case 0:
+ Assert.equal(ariaLabel, addrLabel);
+ break;
+ case 1:
+ Assert.equal(
+ ariaLabel,
+ addrLabel + " with one address, use left arrow key to focus on it."
+ );
+ break;
+ default:
+ Assert.equal(
+ ariaLabel,
+ addrLabel +
+ " with " +
+ pillCount +
+ " addresses, use left arrow key to focus on them."
+ );
+ break;
+ }
+ }
+}
+
+/**
+ * Helper to set an auto-Cc list for an identity.
+ */
+function useAutoCc(aIdentity, aCcList) {
+ aIdentity.doCc = true;
+ aIdentity.doCcList = aCcList;
+}
+
+/**
+ * Helper to stop using auto-Cc for an identity.
+ */
+function stopUsingAutoCc(aIdentity) {
+ aIdentity.doCc = false;
+ aIdentity.doCcList = "";
+}
+
+/**
+ * Helper to ensure autoCc is turned off.
+ */
+function ensureNoAutoCc(aIdentity) {
+ aIdentity.doCc = false;
+}
+
+/**
+ * Helper to set an auto-bcc list for an identity.
+ */
+function useAutoBcc(aIdentity, aBccList) {
+ aIdentity.doBcc = true;
+ aIdentity.doBccList = aBccList;
+}
+
+/**
+ * Helper to stop using auto-bcc for an identity.
+ */
+function stopUsingAutoBcc(aIdentity) {
+ aIdentity.doBcc = false;
+ aIdentity.doBccList = "";
+}
+
+/**
+ * Helper to ensure auto-bcc is turned off.
+ */
+function ensureNoAutoBcc(aIdentity) {
+ aIdentity.doBcc = false;
+}
+
+/**
+ * Tests that for a list post with munged Reply-To:
+ * - reply: goes to From
+ * - reply all: includes From + the usual thing
+ * - reply list: goes to the list
+ */
+add_task(async function testReplyToMungedReplyToList() {
+ let msg0 = create_message({
+ from: "Tester <test@example.com>",
+ to: "munged.list@example.com, someone.else@example.com",
+ subject: "testReplyToMungedReplyToList",
+ clobberHeaders: {
+ "Reply-To": "Munged List <munged.list@example.com>",
+ "List-Post": "<mailto:munged.list@example.com>",
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+
+ checkReply(open_compose_with_reply, {
+ addr_to: ["Tester <test@example.com>"],
+ });
+
+ checkReply(open_compose_with_reply_to_all, {
+ addr_to: [
+ "Munged List <munged.list@example.com>",
+ "someone.else@example.com",
+ "Tester <test@example.com>",
+ ],
+ });
+
+ checkReply(open_compose_with_reply_to_list, {
+ addr_to: ["munged.list@example.com"],
+ });
+});
+
+/**
+ * Tests that addresses get set properly when doing a normal reply.
+ */
+add_task(async function testToCcReply() {
+ let msg0 = create_message({
+ from: "Homer <homer@example.com>",
+ to: "Mr Burns <mrburns@example.com>, workers@example.com, " + myEmail,
+ cc: "Lisa <lisa@example.com>",
+ subject: "testToCcReply - normal mail with to and cc (me in To)",
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply,
+ // To: From
+ { addr_to: ["Homer <homer@example.com>"] }
+ );
+
+ useAutoCc(identity, myEmail + ", smithers@example.com");
+ checkReply(
+ open_compose_with_reply,
+ // To: From
+ // Cc: identity Cc list, including self.
+ {
+ addr_to: ["Homer <homer@example.com>"],
+ addr_cc: [myEmail, "smithers@example.com"],
+ }
+ );
+ stopUsingAutoCc(identity);
+});
+
+/**
+ * Tests that addresses get set properly when doing a normal reply to all.
+ */
+add_task(async function testToCcReplyAll() {
+ let msg0 = create_message({
+ from: "Homer <homer@example.com>",
+ to: "Mr Burns <mrburns@example.com>, workers@example.com, " + myEmail,
+ cc: "Lisa <lisa@example.com>",
+ subject: "testToCcReplyAll - normal mail with to and cc (me in To)",
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: From + Tos without me.
+ // Cc: original Ccs
+ {
+ addr_to: [
+ "Homer <homer@example.com>",
+ "Mr Burns <mrburns@example.com>",
+ "workers@example.com",
+ ],
+ addr_cc: ["Lisa <lisa@example.com>"],
+ }
+ );
+
+ useAutoCc(identity, myEmail + ", smithers@example.com");
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: From + Tos without me.
+ // Cc: original Ccs + auto-Ccs
+ {
+ addr_to: [
+ "Homer <homer@example.com>",
+ "Mr Burns <mrburns@example.com>",
+ "workers@example.com",
+ ],
+ addr_cc: ["Lisa <lisa@example.com>", myEmail, "smithers@example.com"],
+ }
+ );
+ stopUsingAutoCc(identity);
+});
+
+/**
+ * Tests that that addresses get set properly when doing a normal reply to all
+ * where when recipients aren't all ascii.
+ */
+add_task(async function testToCcReplyAllInternational() {
+ let msg0 = create_message({
+ from: "Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= <hideaki@example.com>",
+ to:
+ "Mr Burns <mrburns@example.com>, =?UTF-8?B?w4VrZQ==?= <ake@example.com>, " +
+ "=?KOI8-R?Q?=E9=D7=C1=CE?= <ivan@example.com>, " +
+ myEmail,
+ cc: "=?Big5?B?pP2oca1e?= <xiuying@example.com>",
+ subject:
+ "testToCcReplyAllInternational - non-ascii people mail with to and cc (me in To)",
+ clobberHeaders: { "Content-Transfer-Encoding": "quoted-printable" },
+ // Content-Transfer-Encoding ^^^ should be set from the body encoding below,
+ // but that doesn't seem to work. (No Content-Transfer-Encoding header is
+ // generated).
+ body: {
+ charset: "windows-1251",
+ encoding: "quoted-printable",
+ body: "=CF=F0=E8=E2=E5=F2 =E8=E7 =CC=EE=F1=EA=E2=FB",
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: From + Tos without me.
+ // Cc: original Ccs
+ {
+ addr_to: [
+ "Hideaki / 吉藤英明 <hideaki@example.com>",
+ "Mr Burns <mrburns@example.com>",
+ "Åke <ake@example.com>",
+ "Иван <ivan@example.com>",
+ ],
+ addr_cc: ["王秀英 <xiuying@example.com>"],
+ }
+ );
+
+ useAutoCc(identity, "Åsa <asa@example.com>");
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: From + Tos without me.
+ // Cc: original Ccs + auto-Ccs
+ {
+ addr_to: [
+ "Hideaki / 吉藤英明 <hideaki@example.com>",
+ "Mr Burns <mrburns@example.com>",
+ "Åke <ake@example.com>",
+ "Иван <ivan@example.com>",
+ ],
+ addr_cc: ["王秀英 <xiuying@example.com>", "Åsa <asa@example.com>"],
+ }
+ );
+ stopUsingAutoCc(identity);
+});
+
+/**
+ * Tests that that addresses get set properly when doing a reply to a mail with
+ * reply-to set.
+ */
+add_task(async function testToCcReplyWhenReplyToSet() {
+ let msg0 = create_message({
+ from: "Homer <homer@example.com>",
+ to: "workers@example.com",
+ cc: "Lisa <lisa@example.com>, " + myEmail,
+ subject:
+ "testToCcReplyWhenReplyToSet - to/cc mail with reply-to set (me in Cc)",
+ clobberHeaders: {
+ "Reply-To": "marge@example.com",
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply,
+ // To: reply-to
+ { addr_to: ["marge@example.com"] }
+ );
+
+ useAutoCc(identity, myEmail + ", smithers@example.com");
+ checkReply(
+ open_compose_with_reply,
+ // To: reply-to
+ // Cc: auto-Ccs
+ {
+ addr_to: ["marge@example.com"],
+ addr_cc: [myEmail, "smithers@example.com"],
+ }
+ );
+ stopUsingAutoCc(identity);
+});
+
+/**
+ * Tests that addresses get set properly when doing a reply to all for a mail
+ * w/ Reply-To.
+ */
+add_task(async function testToCcReplyAllWhenReplyToSet() {
+ let msg0 = create_message({
+ from: "Homer <homer@example.com>",
+ to: "workers@example.com",
+ cc: "Lisa <lisa@example.com>, " + myEmail,
+ subject:
+ "testToCcReplyAllWhenReplyToSet - to/cc mail with reply-to set (me in Cc)",
+ clobberHeaders: {
+ "Reply-To": "marge@example.com",
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: Reply-To + Tos
+ // Cc: original Ccs without me.
+ {
+ addr_to: ["marge@example.com", "workers@example.com"],
+ addr_cc: ["Lisa <lisa@example.com>"],
+ }
+ );
+
+ useAutoCc(identity, myEmail + ", smithers@example.com");
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: Reply-To + Tos
+ // Cc: original Ccs + auto-Ccs (which includes me!)
+ {
+ addr_to: ["marge@example.com", "workers@example.com"],
+ addr_cc: ["Lisa <lisa@example.com>", myEmail, "smithers@example.com"],
+ }
+ );
+ stopUsingAutoCc(identity);
+});
+
+/**
+ * Tests that addresses get set properly when doing a reply to list.
+ */
+add_task(async function testReplyToList() {
+ let msg0 = create_message({
+ from: "Homer <homer@example.com>",
+ to: "workers-list@example.com",
+ cc: "Lisa <lisa@example.com>, " + myEmail,
+ subject: "testReplyToList - mailing list message (me in Cc)",
+ clobberHeaders: {
+ "List-Post": "<mailto:workers-list@example.com>",
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply_to_list,
+ // To: the list
+ { addr_to: ["workers-list@example.com"] }
+ );
+
+ useAutoCc(identity, myEmail + ", smithers@example.com");
+ checkReply(
+ open_compose_with_reply_to_list,
+ // To: the list
+ // Cc: auto-Ccs
+ {
+ addr_to: ["workers-list@example.com"],
+ addr_cc: [myEmail, "smithers@example.com"],
+ }
+ );
+ stopUsingAutoCc(identity);
+});
+
+/**
+ * Tests that addresses get set properly when doing a reply to sender for a
+ * list post.
+ */
+add_task(async function testReplySenderForListPost() {
+ let msg0 = create_message({
+ from: "Homer <homer@example.com>",
+ to: "workers-list@example.com",
+ cc: "Lisa <lisa@example.com>, " + myEmail,
+ subject: "testReplySenderForListPost - mailing list message (me in Cc)",
+ clobberHeaders: {
+ "List-Post": "<mailto:workers-list@example.com>",
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply,
+ // To: From
+ { addr_to: ["Homer <homer@example.com>"] }
+ );
+
+ useAutoCc(identity, myEmail + ", smithers@example.com");
+ checkReply(
+ open_compose_with_reply,
+ // To: From
+ // Cc: auto-Ccs
+ {
+ addr_to: ["Homer <homer@example.com>"],
+ addr_cc: [myEmail, "smithers@example.com"],
+ }
+ );
+ stopUsingAutoCc(identity);
+});
+
+/**
+ * Tests that addresses get set properly when doing a reply all to a list post.
+ */
+add_task(async function testReplyToAllForListPost() {
+ let msg0 = create_message({
+ from: "Homer <homer@example.com>",
+ to: "workers-list@example.com",
+ cc: "Lisa <lisa@example.com>, " + myEmail,
+ subject: "testReplyToAllForListPost - mailing list message (me in Cc)",
+ clobberHeaders: {
+ "List-Post": "<mailto:workers-list@example.com>",
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: From + original To
+ // Cc: original CC without me
+ {
+ addr_to: ["Homer <homer@example.com>", "workers-list@example.com"],
+ addr_cc: ["Lisa <lisa@example.com>"],
+ }
+ );
+
+ useAutoCc(identity, myEmail + ", smithers@example.com");
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: From + original To
+ // Cc: original CC + auto-Ccs (including me!)
+ {
+ addr_to: ["Homer <homer@example.com>", "workers-list@example.com"],
+ addr_cc: ["Lisa <lisa@example.com>", myEmail, "smithers@example.com"],
+ }
+ );
+ stopUsingAutoCc(identity);
+});
+
+/**
+ * Tests that addresses get set properly when doing a reply to all for a list
+ * post when also reply-to is set.
+ */
+add_task(async function testReplyToListWhenReplyToSet() {
+ let msg0 = create_message({
+ from: "Homer <homer@example.com>",
+ to: "workers-list@example.com, " + myEmail,
+ cc: "Lisa <lisa@example.com>",
+ subject:
+ "testReplyToListWhenReplyToSet - mailing list message w/ cc, reply-to (me in To)",
+ clobberHeaders: {
+ "Reply-To": "marge@example.com",
+ "List-Post": "<mailto:workers-list@example.com>",
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: Reply-To, original Tos
+ // Cc: original Cc
+ {
+ addr_to: ["marge@example.com", "workers-list@example.com"],
+ addr_cc: ["Lisa <lisa@example.com>"],
+ }
+ );
+
+ useAutoCc(identity, myEmail + ", smithers@example.com");
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: Reply-To, original Tos
+ // Cc: original Cc + auto-Ccs
+ {
+ addr_to: ["marge@example.com", "workers-list@example.com"],
+ addr_cc: ["Lisa <lisa@example.com>", myEmail, "smithers@example.com"],
+ }
+ );
+ stopUsingAutoCc(identity);
+});
+
+/**
+ * Test that addresses get set properly for Mail-Reply-To. Mail-Reply-To should
+ * be used for reply to author, if present.
+ *
+ * @see http://cr.yp.to/proto/replyto.html
+ */
+add_task(async function testMailReplyTo() {
+ let msg0 = create_message({
+ from: "Homer <homer@example.com>",
+ to: "workers-list@example.com",
+ cc: "Lisa <lisa@example.com>",
+ subject: "testMailReplyTo - mail with Mail-Reply-To header",
+ clobberHeaders: {
+ "Reply-To": "workers-list@example.com", // reply-to munging
+ "Mail-Reply-To": "Homer S. <homer@example.com>",
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply,
+ // To: Mail-Reply-To
+ { addr_to: ["Homer S. <homer@example.com>"] }
+ );
+
+ useAutoCc(identity, myEmail + ", smithers@example.com");
+ checkReply(
+ open_compose_with_reply,
+ // To: Mail-Reply-To
+ // Cc: auto-Ccs
+ {
+ addr_to: ["Homer S. <homer@example.com>"],
+ addr_cc: [myEmail, "smithers@example.com"],
+ }
+ );
+ stopUsingAutoCc(identity);
+});
+
+/**
+ * Test that addresses get set properly Mail-Followup-To. Mail-Followup-To
+ * should be the default recipient list for reply-all, if present.
+ *
+ * @see http://cr.yp.to/proto/replyto.html
+ */
+add_task(async function testMailFollowupTo() {
+ let msg0 = create_message({
+ from: "Homer <homer@example.com>",
+ to: "workers-list@example.com, " + myEmail,
+ cc: "Lisa <lisa@example.com>",
+ subject: "testMailFollowupTo - mail with Mail-Followup-To header",
+ clobberHeaders: {
+ // Homer is on the list, and don't want extra copies, so he has
+ // set the Mail-Followup-To header so followups go to the list.
+ "Mail-Followup-To": "workers-list@example.com",
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: Mail-Followup-To
+ { addr_to: ["workers-list@example.com"] }
+ );
+
+ useAutoCc(identity, myEmail + ", smithers@example.com");
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: Mail-Followup-To
+ // Cc: auto-Ccs
+ {
+ addr_to: ["workers-list@example.com"],
+ addr_cc: [myEmail, "smithers@example.com"],
+ }
+ );
+ stopUsingAutoCc(identity);
+});
+
+/**
+ * Tests that addresses get set properly for reply to self.
+ */
+add_task(async function testReplyToSelfReply() {
+ let msg0 = create_message({
+ // Upper case just to make sure we don't care about case sensitivity.
+ from: myEmail.toUpperCase(),
+ to: "Bart <bart@example.com>, Maggie <maggie@example.com>",
+ cc: "Lisa <lisa@example.com>",
+ subject: "testReplyToSelfReply - reply to self",
+ clobberHeaders: {
+ Bcc: "Moe <moe@example.com>",
+ "Reply-To": "Flanders <flanders@example.com>",
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply,
+ // To: original To
+ // Reply-To: original Reply-To
+ {
+ addr_to: ["Bart <bart@example.com>", "Maggie <maggie@example.com>"],
+ addr_reply: ["Flanders <flanders@example.com>"],
+ }
+ );
+
+ useAutoCc(identity, myEmail + ", smithers@example.com");
+ checkReply(
+ open_compose_with_reply,
+ // To: original To
+ // Cc: auto-Ccs
+ // Reply-To: original Reply-To
+ {
+ addr_to: ["Bart <bart@example.com>", "Maggie <maggie@example.com>"],
+ addr_cc: [myEmail, "smithers@example.com"],
+ addr_reply: ["Flanders <flanders@example.com>"],
+ }
+ );
+ stopUsingAutoCc(identity);
+});
+
+/**
+ * Tests that addresses get set properly for a reply all to self - this should
+ * be treated as a followup.
+ */
+add_task(async function testReplyToSelfReplyAll() {
+ let msg0 = create_message({
+ from: myEmail,
+ to: "Bart <bart@example.com>, Maggie <maggie@example.com>",
+ cc: "Lisa <lisa@example.com>",
+ subject: "testReplyToSelfReplyAll - reply to self",
+ clobberHeaders: {
+ Bcc: "Moe <moe@example.com>",
+ "Reply-To": "Flanders <flanders@example.com>",
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: original To
+ // Cc: original Cc
+ // Bcc: original Bcc
+ // Reply-To: original Reply-To
+ {
+ addr_to: ["Bart <bart@example.com>", "Maggie <maggie@example.com>"],
+ addr_cc: ["Lisa <lisa@example.com>"],
+ addr_bcc: ["Moe <moe@example.com>"],
+ addr_reply: ["Flanders <flanders@example.com>"],
+ }
+ );
+
+ useAutoCc(identity, myEmail + ", smithers@example.com");
+ useAutoBcc(identity, "Lisa <lisa@example.com>");
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: original To
+ // Cc: original Cc (auto-Ccs would have been included here already)
+ // Bcc: original Bcc
+ // Reply-To: original Reply-To
+ {
+ addr_to: ["Bart <bart@example.com>", "Maggie <maggie@example.com>"],
+ addr_cc: ["Lisa <lisa@example.com>"],
+ addr_bcc: ["Moe <moe@example.com>"],
+ addr_reply: ["Flanders <flanders@example.com>"],
+ }
+ );
+ stopUsingAutoCc(identity);
+ stopUsingAutoBcc(identity);
+});
+
+/**
+ * Tests that addresses get set properly for a reply all to self - but for a
+ * message that is not really the original sent message. Like an auto-bcc:d copy
+ * or from Gmail. This should be treated as a followup.
+ */
+add_task(async function testReplyToSelfNotOriginalSourceMsgReplyAll() {
+ let msg0 = create_message({
+ from: myEmail2,
+ to: "Bart <bart@example.com>, Maggie <maggie@example.com>",
+ cc: "Lisa <lisa@example.com>",
+ subject: "testReplyToSelfNotOriginalSourceMsgReplyAll - reply to self",
+ clobberHeaders: {
+ "Reply-To": "Flanders <flanders@example.com>",
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity2);
+ useAutoBcc(identity2, myEmail + ", smithers@example.com");
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: original To
+ // Cc: original Cc
+ // Bcc: auto-bccs
+ // Reply-To: original Reply-To
+ {
+ addr_to: ["Bart <bart@example.com>", "Maggie <maggie@example.com>"],
+ addr_cc: ["Lisa <lisa@example.com>"],
+ addr_bcc: [myEmail, "smithers@example.com"],
+ addr_reply: ["Flanders <flanders@example.com>"],
+ }
+ );
+ stopUsingAutoBcc(identity2);
+
+ useAutoCc(identity2, myEmail + ", smithers@example.com");
+ useAutoBcc(identity2, "moe@example.com,bart@example.com,lisa@example.com");
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: original To
+ // Cc: original Cc (auto-Ccs would have been included here already)
+ // Bcc: auto-bcc minus addresses already in To/Cc
+ // Reply-To: original Reply-To
+ {
+ addr_to: ["Bart <bart@example.com>", "Maggie <maggie@example.com>"],
+ addr_cc: ["Lisa <lisa@example.com>", myEmail, "smithers@example.com"],
+ addr_bcc: ["moe@example.com"],
+ addr_reply: ["Flanders <flanders@example.com>"],
+ }
+ );
+ stopUsingAutoCc(identity2);
+ stopUsingAutoBcc(identity2);
+
+ useAutoBcc(identity2, myEmail2 + ", smithers@example.com");
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: original To
+ // Cc: original Cc (auto-Ccs would have been included here already)
+ // Bcc: auto-bccs
+ // Reply-To: original Reply-To
+ {
+ addr_to: ["Bart <bart@example.com>", "Maggie <maggie@example.com>"],
+ addr_cc: ["Lisa <lisa@example.com>"],
+ addr_bcc: [myEmail2, "smithers@example.com"],
+ addr_reply: ["Flanders <flanders@example.com>"],
+ }
+ );
+ stopUsingAutoBcc(identity2);
+});
+
+/**
+ * Tests that a reply to an other identity isn't treated as a reply to self
+ * followup.
+ */
+add_task(async function testReplyToOtherIdentity() {
+ let msg0 = create_message({
+ from: myEmail,
+ to: myEmail2 + ", barney@example.com",
+ cc: "Lisa <lisa@example.com>",
+ subject: "testReplyToOtherIdentity - reply to other identity",
+ clobberHeaders: {
+ "Reply-To": "secretary@example.com",
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity2);
+ ensureNoAutoBcc(identity2);
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: from + to (except me2)
+ // Cc: original Cc
+ //
+ {
+ addr_to: ["secretary@example.com", "barney@example.com"],
+ addr_cc: ["Lisa <lisa@example.com>"],
+ }
+ );
+});
+
+/**
+ * Tests that addresses get set properly for a reply all to self w/ bccs -
+ * this should be treated as a followup.
+ */
+add_task(async function testReplyToSelfWithBccs() {
+ let msg0 = create_message({
+ from: myEmail,
+ to: myEmail,
+ cc: myEmail2 + ", Lisa <lisa@example.com>",
+ subject: "testReplyToSelfWithBccs - reply to self",
+ clobberHeaders: {
+ Bcc: "Moe <moe@example.com>, Barney <barney@example.com>",
+ "Reply-To": myEmail2,
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: original To
+ // Cc: original Cc
+ // Bcc: original Bcc
+ // Reply-To: original Reply-To
+ {
+ addr_to: [myEmail],
+ addr_cc: [myEmail2, "Lisa <lisa@example.com>"],
+ addr_bcc: ["Moe <moe@example.com>", "Barney <barney@example.com>"],
+ addr_reply: [myEmail2],
+ }
+ );
+});
+
+/**
+ * Tests that addresses get set properly for a reply all to other identity w/ bccs -
+ * this be treated as a followup.
+ */
+add_task(async function testReplyToOtherIdentityWithBccs() {
+ let msg0 = create_message({
+ from: myEmail,
+ to: myEmail2,
+ cc: "Lisa <lisa@example.com>",
+ subject: "testReplyToOtherIdentityWithBccs - reply to other identity",
+ clobberHeaders: {
+ Bcc: "Moe <moe@example.com>, Barney <barney@example.com>",
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: original To
+ // Cc: original Cc
+ // Bcc: original Bcc
+ {
+ addr_to: [myEmail2],
+ addr_cc: ["Lisa <lisa@example.com>"],
+ addr_bcc: ["Moe <moe@example.com>", "Barney <barney@example.com>"],
+ }
+ );
+});
+
+/**
+ * Tests that addresses get set properly for a nntp reply-all.
+ */
+add_task(async function testNewsgroupsReplyAll() {
+ let msg0 = create_message({
+ from: "Homer <homer@example.com>",
+ to: "test1-list@example.org",
+ subject: "testNewsgroupsReplyAll - sent to two newsgroups and a list",
+ clobberHeaders: {
+ Newsgroups: "example.test1, example.test2",
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: From, original To
+ // Newsgroups: original Ccs
+ {
+ addr_to: ["Homer <homer@example.com>", "test1-list@example.org"],
+ addr_newsgroups: ["example.test1", "example.test2"],
+ }
+ );
+
+ useAutoCc(identity, myEmail + ", smithers@example.com");
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: From, original To
+ // Newsgroups: original Ccs
+ {
+ addr_to: ["Homer <homer@example.com>", "test1-list@example.org"],
+ addr_cc: [myEmail, "smithers@example.com"],
+ addr_newsgroups: ["example.test1", "example.test2"],
+ }
+ );
+ stopUsingAutoCc(identity);
+});
+
+/**
+ * Tests that addresses get set properly for an nntp followup, when Followup-To
+ * is set.
+ */
+add_task(async function testNewsgroupsReplyAllFollowupTo() {
+ let msg0 = create_message({
+ from: "Homer <homer@example.com>",
+ to: "test1-list@example.org, " + myEmail,
+ subject: "testNewsgroupsReplyAllFollowupTo - Followup-To set",
+ clobberHeaders: {
+ Newsgroups: "example.test1, example.test2",
+ "Followup-To": "example.test2",
+ },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: From + original To (except me)
+ // Newsgroups: <Followup-To>
+ {
+ addr_to: ["Homer <homer@example.com>", "test1-list@example.org"],
+ addr_newsgroups: ["example.test2"],
+ }
+ );
+
+ useAutoCc(identity, myEmail + ", smithers@example.com");
+ checkReply(
+ open_compose_with_reply_to_all,
+ // To: From + original To (except me)
+ // Cc: auto-Ccs
+ // Newsgroups: <Followup-To>
+ {
+ addr_to: ["Homer <homer@example.com>", "test1-list@example.org"],
+ addr_cc: [myEmail, "smithers@example.com"],
+ addr_newsgroups: ["example.test2"],
+ }
+ );
+ stopUsingAutoCc(identity);
+});
+
+/**
+ * Tests that addresses get set properly when doing a reply where To=From
+ * and a Reply-To exists.
+ */
+add_task(async function testToFromWithReplyTo() {
+ let msg0 = create_message({
+ from: myEmail,
+ to: myEmail,
+ subject: "testToFromWithReplyTo - To=From w/ Reply-To set",
+ clobberHeaders: { "Reply-To": "Flanders <flanders@example.com>" },
+ });
+ await add_message_to_folder([folder], msg0);
+
+ await be_in_folder(folder);
+ let msg = select_click_row(i++);
+ assert_selected_and_displayed(mc, msg);
+
+ ensureNoAutoCc(identity);
+ checkReply(
+ open_compose_with_reply,
+ // To: Reply-To
+ { addr_to: ["Flanders <flanders@example.com>"] }
+ );
+});