From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../folder-tree-modes/browser_smartFolders.js | 179 +++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 comm/mail/test/browser/folder-tree-modes/browser_smartFolders.js (limited to 'comm/mail/test/browser/folder-tree-modes/browser_smartFolders.js') diff --git a/comm/mail/test/browser/folder-tree-modes/browser_smartFolders.js b/comm/mail/test/browser/folder-tree-modes/browser_smartFolders.js new file mode 100644 index 0000000000..47fdca0058 --- /dev/null +++ b/comm/mail/test/browser/folder-tree-modes/browser_smartFolders.js @@ -0,0 +1,179 @@ +/* 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/. */ + +/* + * Test that the smart folder mode works properly. + */ + +"use strict"; + +var { + archive_selected_messages, + expand_folder, + FAKE_SERVER_HOSTNAME, + get_about_3pane, + get_smart_folder_named, + get_special_folder, + inboxFolder, + make_message_sets_in_folders, + select_click_row, +} = ChromeUtils.import( + "resource://testing-common/mozmill/FolderDisplayHelpers.jsm" +); +var { MailServices } = ChromeUtils.import( + "resource:///modules/MailServices.jsm" +); + +var about3Pane; +var rootFolder; +var inboxSubfolder; +var trashFolder; +var trashSubfolder; + +var smartInboxFolder; + +var inboxSet; + +add_setup(async function () { + about3Pane = get_about_3pane(); + rootFolder = inboxFolder.server.rootFolder; + // Create a folder as a subfolder of the inbox + inboxFolder.createSubfolder("SmartFoldersA", null); + inboxSubfolder = inboxFolder.getChildNamed("SmartFoldersA"); + + trashFolder = inboxFolder.server.rootFolder.getFolderWithFlags( + Ci.nsMsgFolderFlags.Trash + ); + trashFolder.createSubfolder("SmartFoldersB", null); + trashSubfolder = trashFolder.getChildNamed("SmartFoldersB"); + + // The message itself doesn't really matter, as long as there's at least one + // in the folder. + [inboxSet] = await make_message_sets_in_folders( + [inboxFolder], + [{ count: 1 }] + ); + await make_message_sets_in_folders([inboxSubfolder], [{ count: 1 }]); + + // Switch to the smart folder mode. + about3Pane.folderPane.activeModes = ["smart"]; + + // The smart inbox may not have been created at setup time, so get it now. + smartInboxFolder = get_smart_folder_named("Inbox"); +}); + +/** + * Test that smart folders are updated when the folders they should be + * searching over are added/removed or have the relevant flag set/cleared. + */ +add_task(async function test_folder_flag_changes() { + expand_folder(smartInboxFolder); + // Now attempt to select the folder. + about3Pane.displayFolder(inboxSubfolder); + // Need to archive two messages in two different accounts in order to + // create a smart Archives folder. + select_click_row(0); + archive_selected_messages(); + let pop3Server = MailServices.accounts.findServer( + "tinderbox", + FAKE_SERVER_HOSTNAME, + "pop3" + ); + let pop3Inbox = await get_special_folder( + Ci.nsMsgFolderFlags.Inbox, + false, + pop3Server + ); + await make_message_sets_in_folders([pop3Inbox], [{ count: 1 }]); + about3Pane.displayFolder(pop3Inbox); + select_click_row(0); + archive_selected_messages(); + + let smartArchiveFolder = get_smart_folder_named("Archives"); + let archiveScope = + "|" + + smartArchiveFolder.msgDatabase.dBFolderInfo.getCharProperty( + "searchFolderUri" + ) + + "|"; + // We should have both this account, and a folder corresponding + // to this year in the scope. + rootFolder = inboxFolder.server.rootFolder; + let archiveFolder = rootFolder.getChildNamed("Archives"); + assert_folder_and_children_in_scope(archiveFolder, archiveScope); + archiveFolder = pop3Server.rootFolder.getChildNamed("Archives"); + assert_folder_and_children_in_scope(archiveFolder, archiveScope); + + // Remove the archive flag, and make sure the archive folder and + // its children are no longer in the search scope. + archiveFolder.clearFlag(Ci.nsMsgFolderFlags.Archive); + + // Refresh the archive scope because clearing the flag should have + // changed it. + archiveScope = + "|" + + smartArchiveFolder.msgDatabase.dBFolderInfo.getCharProperty( + "searchFolderUri" + ) + + "|"; + + // figure out what we expect the archiveScope to now be. + rootFolder = inboxFolder.server.rootFolder; + let localArchiveFolder = rootFolder.getChildNamed("Archives"); + let desiredScope = "|" + localArchiveFolder.URI + "|"; + for (let folder of localArchiveFolder.descendants) { + desiredScope += folder.URI + "|"; + } + + Assert.equal( + archiveScope, + desiredScope, + "archive scope after removing folder" + ); + assert_folder_and_children_not_in_scope(archiveFolder, archiveScope); +}); + +function assert_folder_and_children_in_scope(folder, searchScope) { + let folderURI = "|" + folder.URI + "|"; + assert_uri_found(folderURI, searchScope); + for (let f of folder.descendants) { + assert_uri_found(f.URI, searchScope); + } +} + +function assert_folder_and_children_not_in_scope(folder, searchScope) { + let folderURI = "|" + folder.URI + "|"; + assert_uri_not_found(folderURI, searchScope); + for (let f of folder.descendants) { + assert_uri_not_found(f.URI, searchScope); + } +} + +function assert_uri_found(folderURI, scopeList) { + if (!scopeList.includes(folderURI)) { + throw new Error("scope " + scopeList + "doesn't contain " + folderURI); + } +} + +function assert_uri_not_found(folderURI, scopeList) { + if (scopeList.includes(folderURI)) { + throw new Error( + "scope " + scopeList + "contains " + folderURI + " but shouldn't" + ); + } +} + +registerCleanupFunction(async function () { + about3Pane.folderPane.activeModes = ["all"]; + inboxFolder.propagateDelete(inboxSubfolder, true); + inboxFolder.deleteMessages( + [...inboxFolder.messages], + top.msgWindow, + false, + false, + null, + false + ); + trashFolder.propagateDelete(trashSubfolder, true); +}); -- cgit v1.2.3