Revision control

Copy as Markdown

Other Tools

/* 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/. */
const { IMAPServer } = ChromeUtils.importESModule(
);
var { MockRegistrar } = ChromeUtils.importESModule(
);
const { TestUtils } = ChromeUtils.importESModule(
);
let incomingServer;
let server;
let inbox;
let storedLogin;
let promptCount = 0;
const msgWindow = Cc["@mozilla.org/messenger/msgwindow;1"].createInstance(
Ci.nsIMsgWindow
);
const asyncPrompter = {
QueryInterface: ChromeUtils.generateQI(["nsIMsgAsyncPrompter"]),
queueAsyncAuthPrompt() {
promptCount++;
incomingServer.password = "password";
},
};
add_setup(async function () {
Services.prefs.setBoolPref(
"mail.server.default.autosync_offline_stores",
false
);
MockRegistrar.register(
"@mozilla.org/messenger/msgAsyncPrompter;1",
asyncPrompter
);
server = new IMAPServer();
const account = MailServices.accounts.createAccount();
account.addIdentity(MailServices.accounts.createIdentity());
incomingServer = MailServices.accounts.createIncomingServer(
"user",
"localhost",
"imap"
);
incomingServer.port = server.port;
account.incomingServer = incomingServer;
const loginInfo = Cc["@mozilla.org/login-manager/loginInfo;1"].createInstance(
Ci.nsILoginInfo
);
loginInfo.init(
null,
"user",
"password",
"",
""
);
storedLogin = await Services.logins.addLoginAsync(loginInfo);
incomingServer.password = "password";
const discoverListener = new PromiseTestUtils.PromiseUrlListener();
MailServices.imap.discoverAllFolders(
incomingServer.rootFolder,
discoverListener,
null
);
await discoverListener.promise;
inbox = incomingServer.rootFolder
.getChildNamed("INBOX")
.QueryInterface(Ci.nsIMsgImapMailFolder);
registerCleanupFunction(async () => {
incomingServer.closeCachedConnections();
MailServices.accounts.removeIncomingServer(incomingServer, false);
await Services.logins.removeLoginAsync(storedLogin);
});
});
async function closeConnections() {
incomingServer.closeCachedConnections();
await TestUtils.waitForCondition(
() => !server.daemon.getConnections().length,
"waiting for all IMAP connections to close"
);
}
async function updateInbox(aMsgWindow) {
const listener = new PromiseTestUtils.PromiseUrlListener();
inbox.updateFolderWithListener(aMsgWindow, listener);
await listener.promise;
}
add_task(async function testRefreshPasswordFromStorageForFetch() {
const generator = new MessageGenerator();
await closeConnections();
incomingServer.forgetSessionPassword(false);
await updateInbox(null);
await closeConnections();
incomingServer.forgetSessionPassword(false);
await server.addMessages("INBOX", [generator.makeMessage()], false);
await updateInbox(msgWindow);
Assert.equal(promptCount, 1, "the manual fetch should queue one prompt");
Assert.equal(
inbox.getTotalMessages(false),
1,
"the manual fetch should retrieve the message"
);
});