diff options
Diffstat (limited to 'comm/mail/components/extensions/test/xpcshell/test_ext_messages_onNewMailReceived.js')
-rw-r--r-- | comm/mail/components/extensions/test/xpcshell/test_ext_messages_onNewMailReceived.js | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/comm/mail/components/extensions/test/xpcshell/test_ext_messages_onNewMailReceived.js b/comm/mail/components/extensions/test/xpcshell/test_ext_messages_onNewMailReceived.js new file mode 100644 index 0000000000..5c8e62872d --- /dev/null +++ b/comm/mail/components/extensions/test/xpcshell/test_ext_messages_onNewMailReceived.js @@ -0,0 +1,153 @@ +/* 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/. */ + +var { ExtensionTestUtils } = ChromeUtils.importESModule( + "resource://testing-common/ExtensionXPCShellUtils.sys.mjs" +); +var { AddonTestUtils } = ChromeUtils.importESModule( + "resource://testing-common/AddonTestUtils.sys.mjs" +); + +ExtensionTestUtils.mockAppInfo(); +AddonTestUtils.maybeInit(this); + +registerCleanupFunction(async () => { + // Remove the temporary MozillaMailnews folder, which is not deleted in time when + // the cleanupFunction registered by AddonTestUtils.maybeInit() checks for left over + // files in the temp folder. + // Note: PathUtils.tempDir points to the system temp folder, which is different. + let path = PathUtils.join( + Services.dirsvc.get("TmpD", Ci.nsIFile).path, + "MozillaMailnews" + ); + await IOUtils.remove(path, { recursive: true }); +}); + +// Function to start an event page extension (MV3), which can be called whenever +// the main test is about to trigger an event. The extension terminates its +// background and listens for that single event, verifying it is waking up correctly. +async function event_page_extension(eventName, actionCallback) { + let ext = ExtensionTestUtils.loadExtension({ + files: { + "background.js": async () => { + // Whenever the extension starts or wakes up, hasFired is set to false. In + // case of a wake-up, the first fired event is the one that woke up the background. + let hasFired = false; + let _eventName = browser.runtime.getManifest().description; + + browser.messages[_eventName].addListener(async (...args) => { + // Only send the first event after background wake-up, this should + // be the only one expected. + if (!hasFired) { + hasFired = true; + browser.test.sendMessage(`${_eventName} received`, args); + } + }); + browser.test.sendMessage("background started"); + }, + }, + manifest: { + manifest_version: 3, + description: eventName, + background: { scripts: ["background.js"] }, + browser_specific_settings: { + gecko: { id: "event_page_extension@mochi.test" }, + }, + permissions: ["accountsRead", "messagesRead", "messagesMove"], + }, + }); + await ext.startup(); + await ext.awaitMessage("background started"); + // The listener should be persistent, but not primed. + assertPersistentListeners(ext, "messages", eventName, { primed: false }); + + await ext.terminateBackground({ disableResetIdleForTest: true }); + // Verify the primed persistent listener. + assertPersistentListeners(ext, "messages", eventName, { primed: true }); + + await actionCallback(); + let rv = await ext.awaitMessage(`${eventName} received`); + await ext.awaitMessage("background started"); + // The listener should be persistent, but not primed. + assertPersistentListeners(ext, "messages", eventName, { primed: false }); + + await ext.unload(); + return rv; +} + +add_task(async function () { + await AddonTestUtils.promiseStartupManager(); + + let account = createAccount(); + let inbox = await createSubfolder(account.incomingServer.rootFolder, "test1"); + + let files = { + "background.js": async () => { + browser.messages.onNewMailReceived.addListener((folder, messageList) => { + window.assertDeepEqual( + { accountId: "account1", name: "test1", path: "/test1" }, + folder + ); + browser.test.sendMessage("onNewMailReceived event received", [ + folder, + messageList, + ]); + }); + }, + "utils.js": await getUtilsJS(), + }; + let extension = ExtensionTestUtils.loadExtension({ + files, + manifest: { + background: { scripts: ["utils.js", "background.js"] }, + permissions: ["accountsRead", "messagesRead"], + }, + }); + + await extension.startup(); + + // Create a new message. + + await createMessages(inbox, 1); + inbox.hasNewMessages = true; + inbox.setNumNewMessages(1); + inbox.biffState = Ci.nsIMsgFolder.nsMsgBiffState_NewMail; + + let inboxMessages = [...inbox.messages]; + let newMessages = await extension.awaitMessage( + "onNewMailReceived event received" + ); + equal(newMessages[1].messages.length, 1); + equal(newMessages[1].messages[0].subject, inboxMessages[0].subject); + + // Create 2 more new messages. + + let primedOnNewMailReceivedEventData = await event_page_extension( + "onNewMailReceived", + async () => { + await createMessages(inbox, 2); + inbox.hasNewMessages = true; + inbox.setNumNewMessages(2); + inbox.biffState = Ci.nsIMsgFolder.nsMsgBiffState_NewMail; + } + ); + + inboxMessages = [...inbox.messages]; + newMessages = await extension.awaitMessage( + "onNewMailReceived event received" + ); + Assert.deepEqual( + primedOnNewMailReceivedEventData, + newMessages, + "The primed and non-primed onNewMailReceived events should return the same values" + ); + equal(newMessages[1].messages.length, 2); + equal(newMessages[1].messages[0].subject, inboxMessages[1].subject); + equal(newMessages[1].messages[1].subject, inboxMessages[2].subject); + + await extension.unload(); + + cleanUpAccount(account); + await AddonTestUtils.promiseShutdownManager(); +}); |