summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/base/test/unit/test_saveAs.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/base/test/unit/test_saveAs.js')
-rw-r--r--comm/mailnews/base/test/unit/test_saveAs.js172
1 files changed, 172 insertions, 0 deletions
diff --git a/comm/mailnews/base/test/unit/test_saveAs.js b/comm/mailnews/base/test/unit/test_saveAs.js
new file mode 100644
index 0000000000..39263d3854
--- /dev/null
+++ b/comm/mailnews/base/test/unit/test_saveAs.js
@@ -0,0 +1,172 @@
+/* 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/. */
+
+/**
+ * Invokes nsMessenger::saveAs with the bypass of the File Picker to check if
+ * the saved file as .eml .html or .txt contains certain strings (header, body, ...).
+ *
+ * See `checkedContent` for the compared strings.
+ */
+
+var { MessageGenerator } = ChromeUtils.import(
+ "resource://testing-common/mailnews/MessageGenerator.jsm"
+);
+var { PromiseTestUtils } = ChromeUtils.import(
+ "resource://testing-common/mailnews/PromiseTestUtils.jsm"
+);
+var { mailTestUtils } = ChromeUtils.import(
+ "resource://testing-common/mailnews/MailTestUtils.jsm"
+);
+var { ImapMessage } = ChromeUtils.import(
+ "resource://testing-common/mailnews/Imapd.jsm"
+);
+var { IMAPPump, setupIMAPPump, teardownIMAPPump } = ChromeUtils.import(
+ "resource://testing-common/mailnews/IMAPpump.jsm"
+);
+var { TestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/TestUtils.sys.mjs"
+);
+
+var { FileTestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/FileTestUtils.sys.mjs"
+);
+
+var messenger = Cc["@mozilla.org/messenger;1"].createInstance(Ci.nsIMessenger);
+
+setupIMAPPump();
+
+registerCleanupFunction(function () {
+ teardownIMAPPump();
+});
+
+/**
+ * Creates a SyntheticMessage and prepares it for loading it
+ * into a fake IMAP inbox.
+ *
+ * @returns {object[]}
+ * [0] is an {ImapMessage}
+ * [1] is an {SyntheticMessage}
+ */
+async function createMessage() {
+ let gMessageGenerator = new MessageGenerator();
+ let synthMessage = gMessageGenerator.makeMessage();
+
+ let msgURI = Services.io.newURI(
+ "data:text/plain;base64," + btoa(synthMessage.toMessageString())
+ );
+ let imapInbox = IMAPPump.daemon.getMailbox("INBOX");
+ let ImapMessageFromSynthMsg = new ImapMessage(
+ msgURI.spec,
+ imapInbox.uidnext++,
+ []
+ );
+ return [ImapMessageFromSynthMsg, synthMessage];
+}
+
+/**
+ * Adds a fake msg to a fake IMAP.
+ *
+ * @param {ImapMessage} fooMessage
+ */
+async function addImapMessage(fooMessage) {
+ IMAPPump.mailbox.addMessage(fooMessage);
+ let promiseUrlListener = new PromiseTestUtils.PromiseUrlListener();
+ IMAPPump.inbox.updateFolderWithListener(null, promiseUrlListener);
+ await promiseUrlListener.promise;
+}
+
+/**
+ * Saves the file and waits until its able to load.
+ * nsMessenger doesn't have an event for the loaded File.
+ *
+ * @param {string} fileEnding
+ * @returns {string}
+ */
+async function saveAndLoad(fileEnding) {
+ // getTempFile guarantees that the file doesn't exist.
+ let tmpFile = FileTestUtils.getTempFile(`someprefix${fileEnding}`);
+ Assert.ok(
+ tmpFile.path.endsWith(fileEnding),
+ "Sanity check if the file ending is intact"
+ );
+
+ // Get the ImapMessage.
+ let hdr = mailTestUtils.firstMsgHdr(IMAPPump.inbox);
+ let uri = IMAPPump.inbox.getUriForMsg(hdr);
+
+ // nsMessenger::saveAs
+ messenger.saveAs(uri, true, null, tmpFile.path, true);
+ info(`File saved at ${tmpFile.path}`);
+
+ await TestUtils.waitForCondition(
+ () => IOUtils.exists(tmpFile.path),
+ "wait for nsMessenger::saveAs file exists"
+ );
+ let fileContent = await IOUtils.readUTF8(tmpFile.path);
+ return fileContent;
+}
+
+/**
+ * All of these strings must appear in the saved file.
+ *
+ * @param {SyntheticMessage} synthMessage
+ * This message is the original message.
+ * @returns {object}
+ */
+function checkedContent(synthMessage) {
+ return {
+ // Skip dateCheck because of Formatting and Timezone.
+ // date: synthMessage.date.toString(),
+ fromName: synthMessage.from[0],
+ fromEmail: synthMessage.from[1],
+ subject: synthMessage.subject,
+ toName: synthMessage.toName,
+ toAddress: synthMessage.toAddress,
+ body: synthMessage.bodyPart.body,
+ };
+}
+
+async function emlTest(synthMessage) {
+ let loadedFileContent = await saveAndLoad(".eml");
+ let messageParts = checkedContent(synthMessage);
+ for (const msgPart in messageParts) {
+ Assert.stringContains(
+ loadedFileContent,
+ messageParts[msgPart],
+ `nsMessenger::saveAs with .eml should contain ${msgPart}`
+ );
+ }
+}
+
+async function htmlTest(synthMessage) {
+ let loadedFileContent = await saveAndLoad(".html");
+ let messageParts = checkedContent(synthMessage);
+ for (const msgPart in messageParts) {
+ Assert.stringContains(
+ loadedFileContent,
+ messageParts[msgPart],
+ `nsMessenger::saveAs with .html should contain ${msgPart}`
+ );
+ }
+}
+
+async function txtTest(synthMessage) {
+ let loadedFileContent = await saveAndLoad(".txt");
+ let messageParts = checkedContent(synthMessage);
+ for (const msgPart in messageParts) {
+ Assert.stringContains(
+ loadedFileContent,
+ messageParts[msgPart],
+ `nsMessenger::saveAs with .txt should contain ${msgPart}`
+ );
+ }
+}
+
+add_task(async function test_saveAs() {
+ let [fakedImapMessage, synthMessage] = await createMessage();
+ await addImapMessage(fakedImapMessage);
+ await emlTest(synthMessage);
+ await txtTest(synthMessage);
+ await htmlTest(synthMessage);
+});