diff options
Diffstat (limited to 'comm/mail/test/browser/search-window/browser_searchWindow.js')
-rw-r--r-- | comm/mail/test/browser/search-window/browser_searchWindow.js | 358 |
1 files changed, 358 insertions, 0 deletions
diff --git a/comm/mail/test/browser/search-window/browser_searchWindow.js b/comm/mail/test/browser/search-window/browser_searchWindow.js new file mode 100644 index 0000000000..bf414bdf6f --- /dev/null +++ b/comm/mail/test/browser/search-window/browser_searchWindow.js @@ -0,0 +1,358 @@ +/* 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: + * - https://bugzilla.mozilla.org/show_bug.cgi?id=474701#c96 first para + */ + +"use strict"; + +var { + assert_messages_in_view, + assert_number_of_tabs_open, + assert_selected_and_displayed, + assert_tab_mode_name, + assert_tab_titled_from, + be_in_folder, + close_message_window, + close_tab, + create_folder, + make_message_sets_in_folders, + mc, + open_selected_message, + open_selected_messages, + plan_for_message_display, + reset_open_message_behavior, + set_open_message_behavior, + switch_tab, + wait_for_all_messages_to_load, + wait_for_message_display_completion, +} = ChromeUtils.import( + "resource://testing-common/mozmill/FolderDisplayHelpers.jsm" +); +var { + assert_search_window_folder_displayed, + open_search_window, + assert_messages_in_search_view, + select_click_search_row, + select_shift_click_search_row, +} = ChromeUtils.import( + "resource://testing-common/mozmill/SearchWindowHelpers.jsm" +); +var { + plan_for_modal_dialog, + async_plan_for_new_window, + plan_for_window_close, + wait_for_modal_dialog, + wait_for_window_close, +} = ChromeUtils.import("resource://testing-common/mozmill/WindowHelpers.jsm"); + +var folder, setFooBar; + +// Number of messages to open for multi-message tests +var NUM_MESSAGES_TO_OPEN = 5; + +/** + * Create some messages that our constraint below will satisfy + */ +add_task(async function test_create_messages() { + folder = await create_folder("SearchWindowA"); + [, , setFooBar] = await make_message_sets_in_folders( + [folder], + [{ subject: "foo" }, { subject: "bar" }, { subject: "foo bar" }] + ); +}); + +/** + * The search window controller. + */ +var swc = null; + +/** + * Bring up the search window. + */ +add_task(async function test_show_search_window() { + // put us in the folder we care about so it defaults to that + await be_in_folder(folder); + + swc = open_search_window(); + assert_search_window_folder_displayed(swc, folder); +}); + +/** + * Set up the search. + */ +add_task(function test_enter_some_stuff() { + // - turn off search subfolders + // (we're not testing the UI, direct access is fine) + swc.window.document + .getElementById("checkSearchSubFolders") + .removeAttribute("checked"); + + // - put "foo" in the subject contains box + // Each filter criterion is a listitem in the listbox with id=searchTermList. + // Each filter criterion has id "searchRowN", and the textbox has id + // "searchValN" exposing the value on attribute "value". + // XXX I am having real difficulty getting the click/type pair to actually + // get the text in there reliably. I am just going to poke things directly + // into the text widget. (We used to use .aid instead of .a with swc.click + // and swc.type.) + let searchVal0 = swc.window.document.getElementById("searchVal0"); + let index = 0; + + if (searchVal0.hasAttribute("selectedIndex")) { + index = parseInt(searchVal0.getAttribute("selectedIndex")); + } + + searchVal0 = searchVal0.children[index]; + searchVal0.value = "foo"; + + // - add another subject box + let plusButton = swc.window.document.querySelector( + "#searchRow0 button[label='+']" + ); + EventUtils.synthesizeMouseAtCenter(plusButton, {}, plusButton.ownerGlobal); + + // - put "bar" in it + let searchVal1 = swc.window.document.getElementById("searchVal1"); + index = 0; + + if (searchVal1.hasAttribute("selectedIndex")) { + index = parseInt(searchVal1.getAttribute("selectedIndex")); + } + + searchVal1 = searchVal1.children[index]; + searchVal1.value = "bar"; +}); + +/** + * Trigger the search, make sure the right results show up. + */ +add_task(function test_go_search() { + // - Trigger the search + // The "Search" button has id "search-button" + EventUtils.synthesizeMouseAtCenter( + swc.window.document.getElementById("search-button"), + {}, + swc.window.document.getElementById("search-button").ownerGlobal + ); + wait_for_all_messages_to_load(swc); + + // - Verify we got the right messages + assert_messages_in_search_view(setFooBar, swc); + + // - Click the "Save as Search Folder" button, id "saveAsVFButton" + // This will create a virtual folder properties dialog... + // (label: "New Saved Search Folder", source: virtualFolderProperties.xhtml + // no windowtype, id: "virtualFolderPropertiesDialog") + plan_for_modal_dialog( + "mailnews:virtualFolderProperties", + subtest_save_search + ); + EventUtils.synthesizeMouseAtCenter( + swc.window.document.getElementById("saveAsVFButton"), + {}, + swc.window.document.getElementById("saveAsVFButton").ownerGlobal + ); + wait_for_modal_dialog("mailnews:virtualFolderProperties"); +}); + +/** + * Test opening a single search result in a new tab. + */ +add_task(async function test_open_single_search_result_in_tab() { + swc.window.focus(); + set_open_message_behavior("NEW_TAB"); + let folderTab = mc.window.document.getElementById("tabmail").currentTabInfo; + let preCount = + mc.window.document.getElementById("tabmail").tabContainer.allTabs.length; + + // Select one message + swc.window.document.getElementById("threadTree").focus(); + let msgHdr = select_click_search_row(1, swc); + // Open the selected message + open_selected_message(swc); + // This is going to trigger a message display in the main 3pane window + wait_for_message_display_completion(mc); + // Check that the tab count has increased by 1 + assert_number_of_tabs_open(preCount + 1); + // Check that the currently displayed tab is a message tab (i.e. our newly + // opened tab is in the foreground) + assert_tab_mode_name(null, "mailMessageTab"); + // Check that the message header displayed is the right one + assert_selected_and_displayed(msgHdr); + // Clean up, close the tab + close_tab(mc.window.document.getElementById("tabmail").currentTabInfo); + await switch_tab(folderTab); + reset_open_message_behavior(); +}); + +/** + * Test opening multiple search results in new tabs. + */ +add_task(async function test_open_multiple_search_results_in_new_tabs() { + swc.window.focus(); + set_open_message_behavior("NEW_TAB"); + let folderTab = mc.window.document.getElementById("tabmail").currentTabInfo; + let preCount = + mc.window.document.getElementById("tabmail").tabContainer.allTabs.length; + + // Select a bunch of messages + swc.window.document.getElementById("threadTree").focus(); + select_click_search_row(1, swc); + let selectedMessages = select_shift_click_search_row( + NUM_MESSAGES_TO_OPEN, + swc + ); + // Open them + open_selected_messages(swc); + // This is going to trigger a message display in the main 3pane window + wait_for_message_display_completion(mc, true); + // Check that the tab count has increased by the correct number + assert_number_of_tabs_open(preCount + NUM_MESSAGES_TO_OPEN); + // Check that the currently displayed tab is a message tab (i.e. one of our + // newly opened tabs is in the foreground) + assert_tab_mode_name(null, "mailMessageTab"); + + // Now check whether each of the NUM_MESSAGES_TO_OPEN tabs has the correct + // title + for (let i = 0; i < NUM_MESSAGES_TO_OPEN; i++) { + assert_tab_titled_from( + mc.window.document.getElementById("tabmail").tabInfo[preCount + i], + selectedMessages[i] + ); + } + + // Check whether each tab has the correct message, then close it to load the + // previous tab. + for (let i = 0; i < NUM_MESSAGES_TO_OPEN; i++) { + assert_selected_and_displayed(selectedMessages.pop()); + close_tab(mc.window.document.getElementById("tabmail").currentTabInfo); + } + await switch_tab(folderTab); + reset_open_message_behavior(); +}); + +/** + * Test opening a search result in a new window. + */ +add_task(async function test_open_search_result_in_new_window() { + swc.window.focus(); + set_open_message_behavior("NEW_WINDOW"); + + // Select a message + swc.window.document.getElementById("threadTree").focus(); + let msgHdr = select_click_search_row(1, swc); + + let newWindowPromise = async_plan_for_new_window("mail:messageWindow"); + // Open it + open_selected_message(swc); + let msgc = await newWindowPromise; + wait_for_message_display_completion(msgc, true); + + assert_selected_and_displayed(msgc, msgHdr); + // Clean up, close the window + close_message_window(msgc); + reset_open_message_behavior(); +}); + +/** + * Test reusing an existing window to open another search result. + */ +add_task(async function test_open_search_result_in_existing_window() { + swc.window.focus(); + set_open_message_behavior("EXISTING_WINDOW"); + + // Open up a window + swc.window.document.getElementById("threadTree").focus(); + select_click_search_row(1, swc); + let newWindowPromise = async_plan_for_new_window("mail:messageWindow"); + open_selected_message(swc); + let msgc = await newWindowPromise; + wait_for_message_display_completion(msgc, true); + + // Select another message and open it + let msgHdr = select_click_search_row(2, swc); + plan_for_message_display(msgc); + open_selected_message(swc); + wait_for_message_display_completion(msgc, true); + + // Check if our old window displays the message + assert_selected_and_displayed(msgc, msgHdr); + // Clean up, close the window + close_message_window(msgc); + reset_open_message_behavior(); +}); + +/** + * Save the search, making sure the constraints propagated. + */ +function subtest_save_search(savc) { + // - make sure our constraint propagated + // The query constraints are displayed using the same widgets (and code) that + // we used to enter them, so it's very similar to check. + let searchVal0 = swc.window.document.getElementById("searchVal0"); + let index = 0; + + if (searchVal0.hasAttribute("selectedIndex")) { + index = parseInt(searchVal0.getAttribute("selectedIndex")); + } + + searchVal0 = searchVal0.children[index]; + + Assert.ok(searchVal0); + Assert.equal(searchVal0.value, "foo"); + + let searchVal1 = swc.window.document.getElementById("searchVal1"); + index = 0; + + if (searchVal1.hasAttribute("selectedIndex")) { + index = parseInt(searchVal1.getAttribute("selectedIndex")); + } + + searchVal1 = searchVal1.children[index]; + + Assert.ok(searchVal1); + Assert.equal(searchVal1.value, "bar"); + + // - name the search + savc.window.document.getElementById("name").focus(); + EventUtils.sendString("SearchSaved", savc.window); + + // - save it! + // this will close the dialog, which wait_for_modal_dialog is making sure + // happens. + savc.window.document.querySelector("dialog").acceptDialog(); +} + +add_task(function test_close_search_window() { + swc.window.focus(); + // now close the search window + plan_for_window_close(swc); + EventUtils.synthesizeKey("VK_ESCAPE", {}, swc.window); + wait_for_window_close(swc); + swc = null; +}); + +/** + * Make sure the folder showed up with the right name, and that displaying it + * has the right contents. + */ +add_task(async function test_verify_saved_search() { + let savedFolder = folder.getChildNamed("SearchSaved"); + if (savedFolder == null) { + throw new Error("Saved folder did not show up."); + } + + await be_in_folder(savedFolder); + assert_messages_in_view(setFooBar); + + Assert.report( + false, + undefined, + undefined, + "Test ran to completion successfully" + ); +}); |