diff options
Diffstat (limited to 'comm/mail/test/browser/account/browser_manageIdentities.js')
-rw-r--r-- | comm/mail/test/browser/account/browser_manageIdentities.js | 325 |
1 files changed, 325 insertions, 0 deletions
diff --git a/comm/mail/test/browser/account/browser_manageIdentities.js b/comm/mail/test/browser/account/browser_manageIdentities.js new file mode 100644 index 0000000000..f67f19891b --- /dev/null +++ b/comm/mail/test/browser/account/browser_manageIdentities.js @@ -0,0 +1,325 @@ +/* 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 for the account settings manage identity. + */ + +"use strict"; + +var { + click_account_tree_row, + get_account_tree_row, + open_advanced_settings, + openAccountSettings, +} = ChromeUtils.import( + "resource://testing-common/mozmill/AccountManagerHelpers.jsm" +); +const { wait_for_frame_load } = ChromeUtils.import( + "resource://testing-common/mozmill/WindowHelpers.jsm" +); +var { gMockPromptService } = ChromeUtils.import( + "resource://testing-common/mozmill/PromptHelpers.jsm" +); +var { plan_for_modal_dialog, wait_for_modal_dialog } = ChromeUtils.import( + "resource://testing-common/mozmill/WindowHelpers.jsm" +); + +var { MailServices } = ChromeUtils.import( + "resource:///modules/MailServices.jsm" +); + +var { mc } = ChromeUtils.import( + "resource://testing-common/mozmill/FolderDisplayHelpers.jsm" +); + +const { OpenPGPTestUtils } = ChromeUtils.import( + "resource://testing-common/mozmill/OpenPGPTestUtils.jsm" +); + +var gPopAccount, gOriginalAccountCount, gIdentitiesWin; + +/** + * Load the identities dialog. + * + * @returns {Window} The loaded window of the identities dialog. + */ +async function identitiesListDialogLoaded(win) { + let manageButton = win.document.getElementById( + "identity.manageIdentitiesbutton" + ); + let identitiesDialogLoad = promiseLoadSubDialog( + "chrome://messenger/content/am-identities-list.xhtml" + ); + EventUtils.synthesizeMouseAtCenter(manageButton, {}, win); + return identitiesDialogLoad; +} + +/** + * Load an identity listed in the identities dialog. + * + * @param {number} identityIdx - The index of the identity, in the list. + * @returns {Window} The loaded window of the identities dialog. + */ +async function identityDialogLoaded(identityIdx) { + let identitiesList = gIdentitiesWin.document.getElementById("identitiesList"); + + // Let's dbl click to open the identity. + let identityDialogLoaded = promiseLoadSubDialog( + "chrome://messenger/content/am-identity-edit.xhtml" + ); + EventUtils.synthesizeMouseAtCenter( + identitiesList.children[identityIdx], + { clickCount: 2 }, + gIdentitiesWin + ); + return identityDialogLoaded; +} + +/** Close the open dialog. */ +async function dialogClosed(win) { + let dialogElement = win.document.querySelector("dialog"); + let dialogClosing = BrowserTestUtils.waitForEvent( + dialogElement, + "dialogclosing" + ); + dialogElement.acceptDialog(); + return dialogClosing; +} + +add_setup(async function () { + // There may be pre-existing accounts from other tests. + gOriginalAccountCount = MailServices.accounts.allServers.length; + + // Create a POP server + let popServer = MailServices.accounts + .createIncomingServer("nobody", "exampleX.invalid", "pop3") + .QueryInterface(Ci.nsIPop3IncomingServer); + + let identity = MailServices.accounts.createIdentity(); + identity.email = "tinderbox@example.invalid"; + + gPopAccount = MailServices.accounts.createAccount(); + gPopAccount.incomingServer = popServer; + gPopAccount.addIdentity(identity); + + // Now there should be one more account. + Assert.equal( + MailServices.accounts.allServers.length, + gOriginalAccountCount + 1 + ); + + let firstIdentity = gPopAccount.identities[0]; + + Assert.equal( + firstIdentity.autoEncryptDrafts, + true, + "encrypted drafts should be enabled by default" + ); + Assert.equal( + firstIdentity.protectSubject, + true, + "protected subject should be enabled by default" + ); + Assert.equal( + firstIdentity.signMail, + false, + "signing should be disabled by default" + ); + + firstIdentity.autoEncryptDrafts = false; + + registerCleanupFunction(function rmAccount() { + // Remove our test account to leave the profile clean. + MailServices.accounts.removeAccount(gPopAccount); + // There should be only the original accounts left. + Assert.equal( + MailServices.accounts.allServers.length, + gOriginalAccountCount + ); + }); + + // Go to the account settings. + let tab = await openAccountSettings(); + registerCleanupFunction(function closeTab() { + mc.window.document.getElementById("tabmail").closeTab(tab); + }); + + // To the account main page. + let accountRow = get_account_tree_row( + gPopAccount.key, + null, // "am-main.xhtml", + tab + ); + click_account_tree_row(tab, accountRow); + + // Click "Manage Identities" to show the list of identities. + let iframe = + tab.browser.contentWindow.document.getElementById("contentFrame"); + gIdentitiesWin = await identitiesListDialogLoaded(iframe.contentWindow); +}); + +/** + * Test that adding a new identity works, and that the identity is listed + * once the dialog to add new identity closes. + */ +add_task(async function test_add_identity() { + let identitiesList = gIdentitiesWin.document.getElementById("identitiesList"); + + Assert.equal( + identitiesList.childElementCount, + 1, + "should start with 1 identity" + ); + + // Open the dialog to add a new identity. + let identityDialogLoaded = promiseLoadSubDialog( + "chrome://messenger/content/am-identity-edit.xhtml" + ); + let addButton = gIdentitiesWin.document.getElementById("addButton"); + EventUtils.synthesizeMouseAtCenter(addButton, {}, gIdentitiesWin); + let identityWin = await identityDialogLoaded; + + // Fill in some values, and close. The new identity should now be listed. + identityWin.document.getElementById("identity.fullName").focus(); + EventUtils.sendString("bob", identityWin); + identityWin.document.getElementById("identity.email").focus(); + EventUtils.sendString("bob@openpgp.example", identityWin); + + // Check the e2e tab is only available for existing identities that + // have the email set - that is, it should not be shown yet. + Assert.ok(identityWin.document.getElementById("identityE2ETab").hidden); + + await dialogClosed(identityWin); + + Assert.equal( + identitiesList.childElementCount, + 2, + "should have 2 identities now" + ); +}); + +async function test_identity_idx(idx) { + info(`Checking identity #${idx}`); + let identityWin = await identityDialogLoaded(idx); + + let identity = gPopAccount.identities[idx]; + Assert.ok(!!identity, "identity #1 should be set"); + let keyId = identity.getCharAttribute("openpgp_key_id"); + + // The e2e tab should now be shown. + Assert.ok( + !identityWin.document.getElementById("identityE2ETab").hidden, + "e2e tab should show" + ); + // Click the e2e tab to switch to it (for further clicks below). + EventUtils.synthesizeMouseAtCenter( + identityWin.document.getElementById("identityE2ETab"), + {}, + identityWin + ); + + Assert.equal( + identityWin.document.getElementById("openPgpKeyListRadio").value, + keyId, + "keyId should be correct" + ); + + Assert.equal( + identityWin.document + .getElementById("openPgpKeyListRadio") + .querySelectorAll("radio[selected]").length, + 1, + "Should have exactly one key selected (can be None)" + ); + + if (keyId) { + // Click "More information", then "Key Properties" to see that the key + // properties dialog opens. + let keyDetailsDialogLoaded = promiseLoadSubDialog( + "chrome://openpgp/content/ui/keyDetailsDlg.xhtml" + ); + info(`Will open key details dialog for key 0x${keyId}`); + let arrowHead = identityWin.document.querySelector( + `#openPgpOption${keyId} button.arrowhead` + ); + arrowHead.scrollIntoView(); // Test window is small on CI... + EventUtils.synthesizeMouseAtCenter(arrowHead, {}, identityWin); + let propsButton = identityWin.document.querySelector( + `#openPgpOption${keyId} button.openpgp-props-btn` + ); + Assert.ok(BrowserTestUtils.is_visible(propsButton)); + propsButton.scrollIntoView(); // Test window is small on CI... + EventUtils.synthesizeMouseAtCenter(propsButton, {}, identityWin); + let keyDetailsDialog = await keyDetailsDialogLoaded; + info(`Key details dialog for key 0x${keyId} loaded`); + keyDetailsDialog.close(); + } + + Assert.equal( + identityWin.document.getElementById("encryptionChoices").value, + identity.encryptionPolicy, + "Encrypt setting should be correct" + ); + + // Signing checked based on the pref. + Assert.equal( + identityWin.document.getElementById("identity_sign_mail").checked, + identity.signMail + ); + // Disabled if the identity don't have a key configured. + Assert.equal( + identityWin.document.getElementById("identity_sign_mail").disabled, + !identity.getCharAttribute("openpgp_key_id") + ); + + return dialogClosed(identityWin); +} + +add_task(async function test_identity_idx_1() { + return test_identity_idx(1); +}); + +add_task(async function test_identity_changes() { + let identity = gPopAccount.identities[1]; + + // Check that prefs were copied from identity 0 to identity 1 + Assert.equal( + identity.autoEncryptDrafts, + false, + "encrypted drafts should be disabled in [1] because we disabled it in [0]" + ); + Assert.equal( + identity.protectSubject, + true, + "protected subject should be enabled in [1] because it is enabled in [0]" + ); + Assert.equal( + identity.signMail, + false, + "signing should be disabled in [1] because it is disabled in [0]" + ); + + // Let's poke identity 1 and check the changes got applied + // Note: can't set the prefs to encrypt/sign unless there's also a key. + + let [id] = await OpenPGPTestUtils.importPrivateKey( + window, + new FileUtils.File( + getTestFilePath( + "../openpgp/data/keys/bob@openpgp.example-0xfbfcc82a015e7330-secret.asc" + ) + ) + ); + info(`Set up openpgp key; id=${id}`); + + identity.setUnicharAttribute("openpgp_key_id", id.split("0x").join("")); + identity.signMail = "true"; // Sign by default. + identity.encryptionPolicy = 2; // Require encryption. + info("Modified identity 1 - will check it now"); + await test_identity_idx(1); + + info("Will load identity 0 again and re-check that"); + await test_identity_idx(0); +}); |