diff options
Diffstat (limited to 'comm/mail/components/extensions/test/xpcshell/test_ext_experiments.js')
-rw-r--r-- | comm/mail/components/extensions/test/xpcshell/test_ext_experiments.js | 279 |
1 files changed, 279 insertions, 0 deletions
diff --git a/comm/mail/components/extensions/test/xpcshell/test_ext_experiments.js b/comm/mail/components/extensions/test/xpcshell/test_ext_experiments.js new file mode 100644 index 0000000000..d8ccd58da6 --- /dev/null +++ b/comm/mail/components/extensions/test/xpcshell/test_ext_experiments.js @@ -0,0 +1,279 @@ +/* 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/. */ + +"use strict"; + +var { ExtensionTestUtils } = ChromeUtils.importESModule( + "resource://testing-common/ExtensionXPCShellUtils.sys.mjs" +); + +add_task(async function test_managers() { + let account = createAccount(); + let folder = await createSubfolder( + account.incomingServer.rootFolder, + "test1" + ); + await createMessages(folder, 5); + + let files = { + "background.js": async () => { + let [testAccount] = await browser.accounts.list(); + let testFolder = testAccount.folders.find(f => f.name == "test1"); + let { + messages: [testMessage], + } = await browser.messages.list(testFolder); + + let messageCount = await browser.testapi.testCanGetFolder(testFolder); + browser.test.assertEq(5, messageCount); + + let convertedFolder = await browser.testapi.testCanConvertFolder(); + browser.test.assertEq(testFolder.accountId, convertedFolder.accountId); + browser.test.assertEq(testFolder.path, convertedFolder.path); + + let subject = await browser.testapi.testCanGetMessage(testMessage.id); + browser.test.assertEq(testMessage.subject, subject); + + let convertedMessage = await browser.testapi.testCanConvertMessage(); + browser.test.log(JSON.stringify(convertedMessage)); + browser.test.assertEq(testMessage.id, convertedMessage.id); + browser.test.assertEq(testMessage.subject, convertedMessage.subject); + + let messageList = await browser.testapi.testCanStartMessageList(); + browser.test.assertEq(36, messageList.id.length); + browser.test.assertEq(4, messageList.messages.length); + browser.test.assertEq( + testMessage.subject, + messageList.messages[0].subject + ); + + messageList = await browser.messages.continueList(messageList.id); + browser.test.assertEq(null, messageList.id); + browser.test.assertEq(1, messageList.messages.length); + browser.test.assertTrue( + testMessage.subject != messageList.messages[0].subject + ); + + let [bookUID, contactUID, listUID] = await window.sendMessage("get UIDs"); + let [foundBook, foundContact, foundList] = + await browser.testapi.testCanFindAddressBookItems( + bookUID, + contactUID, + listUID + ); + browser.test.assertEq("new book", foundBook.name); + browser.test.assertEq("new contact", foundContact.properties.DisplayName); + browser.test.assertEq("new list", foundList.name); + + browser.test.notifyPass("finished"); + }, + }; + let extension = ExtensionTestUtils.loadExtension({ + files: { + ...files, + "schema.json": [ + { + namespace: "testapi", + functions: [ + { + name: "testCanGetFolder", + type: "function", + async: true, + parameters: [ + { + name: "folder", + $ref: "folders.MailFolder", + }, + ], + }, + { + name: "testCanConvertFolder", + type: "function", + async: true, + parameters: [], + }, + { + name: "testCanGetMessage", + type: "function", + async: true, + parameters: [ + { + name: "messageId", + type: "integer", + }, + ], + }, + { + name: "testCanConvertMessage", + type: "function", + async: true, + parameters: [], + }, + { + name: "testCanStartMessageList", + type: "function", + async: true, + parameters: [], + }, + { + name: "testCanFindAddressBookItems", + type: "function", + async: true, + parameters: [ + { name: "bookUID", type: "string" }, + { name: "contactUID", type: "string" }, + { name: "listUID", type: "string" }, + ], + }, + ], + }, + ], + "implementation.js": () => { + var { ExtensionCommon } = ChromeUtils.importESModule( + "resource://gre/modules/ExtensionCommon.sys.mjs" + ); + var { MailServices } = ChromeUtils.import( + "resource:///modules/MailServices.jsm" + ); + this.testapi = class extends ExtensionCommon.ExtensionAPI { + getAPI(context) { + return { + testapi: { + async testCanGetFolder({ accountId, path }) { + let realFolder = context.extension.folderManager.get( + accountId, + path + ); + return realFolder.getTotalMessages(false); + }, + async testCanConvertFolder() { + let realFolder = MailServices.accounts.allFolders.find( + f => f.name == "test1" + ); + return context.extension.folderManager.convert(realFolder); + }, + async testCanGetMessage(messageId) { + let realMessage = + context.extension.messageManager.get(messageId); + return realMessage.subject; + }, + async testCanConvertMessage() { + let realFolder = MailServices.accounts.allFolders.find( + f => f.name == "test1" + ); + let realMessage = [...realFolder.messages][0]; + return context.extension.messageManager.convert(realMessage); + }, + async testCanStartMessageList() { + let realFolder = MailServices.accounts.allFolders.find( + f => f.name == "test1" + ); + return context.extension.messageManager.startMessageList( + realFolder.messages + ); + }, + async testCanFindAddressBookItems( + bookUID, + contactUID, + listUID + ) { + let foundBook = + context.extension.addressBookManager.findAddressBookById( + bookUID + ); + let foundContact = + context.extension.addressBookManager.findContactById( + contactUID + ); + let foundList = + context.extension.addressBookManager.findMailingListById( + listUID + ); + + return [ + await context.extension.addressBookManager.convert( + foundBook + ), + await context.extension.addressBookManager.convert( + foundContact + ), + await context.extension.addressBookManager.convert( + foundList + ), + ]; + }, + }, + }; + } + }; + }, + "utils.js": await getUtilsJS(), + }, + manifest: { + background: { scripts: ["utils.js", "background.js"] }, + permissions: ["accountsRead", "addressBooks", "messagesRead"], + experiment_apis: { + testapi: { + schema: "schema.json", + parent: { + scopes: ["addon_parent"], + paths: [["testapi"]], + script: "implementation.js", + }, + }, + }, + }, + }); + + let dirPrefId = MailServices.ab.newAddressBook( + "new book", + "", + Ci.nsIAbManager.JS_DIRECTORY_TYPE + ); + let book = MailServices.ab.getDirectoryFromId(dirPrefId); + + let contact = Cc["@mozilla.org/addressbook/cardproperty;1"].createInstance( + Ci.nsIAbCard + ); + contact.displayName = "new contact"; + contact.firstName = "new"; + contact.lastName = "contact"; + contact.primaryEmail = "new.contact@invalid"; + contact = book.addCard(contact); + + let list = Cc["@mozilla.org/addressbook/directoryproperty;1"].createInstance( + Ci.nsIAbDirectory + ); + list.isMailList = true; + list.dirName = "new list"; + list = book.addMailList(list); + list.addCard(contact); + + Services.prefs.setIntPref("extensions.webextensions.messagesPerPage", 4); + + await extension.startup(); + await extension.awaitMessage("get UIDs"); + extension.sendMessage(book.UID, contact.UID, list.UID); + await extension.awaitFinish("finished"); + await extension.unload(); + + Services.prefs.clearUserPref("extensions.webextensions.messagesPerPage"); + + await new Promise(resolve => { + let observer = { + observe() { + Services.obs.removeObserver(observer, "addrbook-directory-deleted"); + resolve(); + }, + }; + Services.obs.addObserver(observer, "addrbook-directory-deleted"); + MailServices.ab.deleteAddressBook(book.URI); + }); +}); + +registerCleanupFunction(() => { + // Make sure any open database is given a chance to close. + Services.startup.advanceShutdownPhase( + Services.startup.SHUTDOWN_PHASE_APPSHUTDOWNCONFIRMED + ); +}); |