summaryrefslogtreecommitdiffstats
path: root/comm/mail/test/browser/folder-pane/browser_displayMessageWithFolderModes.js
blob: 71d448a06832c020ca145f5beca0fda53aa1e57a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
/* 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 displaying messages in folder tabs works correctly with folder
 * modes. This includes:
 * - switching to the default folder mode if the folder isn't present in the
 *   current folder mode
 * - not switching otherwise
 * - making sure that we're able to expand the right folders in the smart folder
 *   mode
 */

"use strict";

var {
  assert_folder_child_in_view,
  assert_folder_collapsed,
  assert_folder_expanded,
  assert_folder_mode,
  assert_folder_not_visible,
  assert_folder_selected_and_displayed,
  assert_folder_tree_view_row_count,
  assert_folder_visible,
  assert_message_not_in_view,
  assert_selected_and_displayed,
  be_in_folder,
  collapse_folder,
  display_message_in_folder_tab,
  get_smart_folder_named,
  inboxFolder,
  make_message_sets_in_folders,
  mc,
  select_none,
} = ChromeUtils.import(
  "resource://testing-common/mozmill/FolderDisplayHelpers.jsm"
);

var folder;
var dummyFolder;
var inbox2Folder;
var smartInboxFolder;

var msgHdr;

add_setup(async function () {
  assert_folder_mode("all");
  assert_folder_tree_view_row_count(7);

  // This is a subfolder of the inbox so that
  // test_display_message_in_smart_folder_mode_works is able to test that we
  // don't attempt to expand any inboxes.
  inboxFolder.createSubfolder("DisplayMessageWithFolderModesA", null);
  folder = inboxFolder.getChildNamed("DisplayMessageWithFolderModesA");
  // This second folder is meant to act as a dummy folder to switch to when we
  // want to not be in folder.
  inboxFolder.createSubfolder("DisplayMessageWithFolderModesB", null);
  dummyFolder = inboxFolder.getChildNamed("DisplayMessageWithFolderModesB");
  await make_message_sets_in_folders([folder], [{ count: 5 }]);
  // The message itself doesn't really matter, as long as there's at least one
  // in the inbox.  We will delete this in teardownModule because the inbox
  // is a shared resource and it's not okay to leave stuff in there.
  await make_message_sets_in_folders([inboxFolder], [{ count: 1 }]);

  // Create another subfolder on the top level that is not a parent of the
  // 2 folders so that it is not visible in Favorite mode.
  inboxFolder.server.rootFolder.createSubfolder("Inbox2", null);
  inbox2Folder = inboxFolder.server.rootFolder.getChildNamed("Inbox2");

  await be_in_folder(folder);
  msgHdr = mc.window.gFolderDisplay.view.dbView.getMsgHdrAt(0);
});

/**
 * Test that displaying a message causes a switch to the default folder mode if
 * the folder isn't present in the current folder mode.
 */
add_task(
  async function test_display_message_with_folder_not_present_in_current_folder_mode() {
    // Make sure the folder doesn't appear in the favorite folder mode just
    // because it was selected last before switching
    await be_in_folder(inboxFolder);

    // Enable the favorite folders view. This folder isn't currently a favorite
    // folder.
    mc.folderTreeView.activeModes = "favorite";
    // Hide the all folders view. The activeModes setter takes care of removing
    // the mode is is already visible.
    mc.folderTreeView.activeModes = "all";

    assert_folder_not_visible(folder);
    assert_folder_not_visible(inboxFolder);
    assert_folder_not_visible(inbox2Folder);

    // Try displaying a message
    display_message_in_folder_tab(msgHdr);

    assert_folder_mode("favorite");
    assert_folder_selected_and_displayed(folder);
    assert_selected_and_displayed(msgHdr);
  }
);

/**
 * Test that displaying a message _does not_ cause a switch to the default
 * folder mode if the folder is present in the current folder mode.
 */
add_task(
  async function test_display_message_with_folder_present_in_current_folder_mode() {
    // Mark the folder as a favorite
    folder.setFlag(Ci.nsMsgFolderFlags.Favorite);
    // Also mark the dummy folder as a favorite, in preparation for
    // test_display_message_in_smart_folder_mode_works
    dummyFolder.setFlag(Ci.nsMsgFolderFlags.Favorite);

    // Make sure the folder doesn't appear in the favorite folder mode just
    // because it was selected last before switching
    await be_in_folder(inboxFolder);

    // Hide the all folders view. The activeModes setter takes care of removing
    // the mode if is already visible.
    mc.folderTreeView.activeModes = "all";

    // Select the folder to open the parent row.
    await be_in_folder(folder);

    assert_folder_visible(folder);
    assert_folder_visible(dummyFolder);
    // Also their parent folder should be visible.
    assert_folder_visible(inboxFolder);
    // But not a sibling of their parent, which is not Favorite.
    assert_folder_not_visible(inbox2Folder);

    // Try displaying a message
    display_message_in_folder_tab(msgHdr);

    assert_folder_mode("favorite");
    assert_folder_selected_and_displayed(folder);
    assert_selected_and_displayed(msgHdr);

    // Now unset the flags so that we don't affect later tests.
    folder.clearFlag(Ci.nsMsgFolderFlags.Favorite);
    dummyFolder.clearFlag(Ci.nsMsgFolderFlags.Favorite);
  }
);

/**
 * Test that displaying a message in smart folders mode causes the parent in the
 * view to expand.
 */
add_task(async function test_display_message_in_smart_folder_mode_works() {
  // Clear the message selection, otherwise msgHdr will still be displayed and
  // display_message_in_folder_tab(msgHdr) will be a no-op.
  select_none();
  // Show the smart folder view before removing the favorite view.
  mc.folderTreeView.activeModes = "smart";
  // Hide the favorite view. The activeModes setter takes care of removing a
  // view if is currently active.
  mc.folderTreeView.activeModes = "favorite";

  // Switch to the dummy folder, otherwise msgHdr will be in the view and the
  // display message in folder tab logic will simply select the message without
  // bothering to expand any folders.
  await be_in_folder(dummyFolder);

  let rootFolder = folder.server.rootFolder;
  // Check that the folder is actually the child of the account root
  assert_folder_child_in_view(folder, rootFolder);

  // Collapse everything
  smartInboxFolder = get_smart_folder_named("Inbox");
  collapse_folder(smartInboxFolder);
  assert_folder_collapsed(smartInboxFolder);
  collapse_folder(rootFolder);
  assert_folder_collapsed(rootFolder);
  assert_folder_not_visible(folder);

  // Try displaying the message
  display_message_in_folder_tab(msgHdr);

  // Check that the right folders have expanded
  assert_folder_mode("smart");
  assert_folder_collapsed(smartInboxFolder);
  assert_folder_expanded(rootFolder);
  assert_folder_selected_and_displayed(folder);
  assert_selected_and_displayed(msgHdr);
});

/**
 * Test that displaying a message in an inbox in smart folders mode causes the
 * message to be displayed in the smart inbox.
 */
add_task(
  async function test_display_inbox_message_in_smart_folder_mode_works() {
    await be_in_folder(inboxFolder);
    let inboxMsgHdr = mc.window.gFolderDisplay.view.dbView.getMsgHdrAt(0);

    // Collapse everything
    collapse_folder(smartInboxFolder);
    assert_folder_collapsed(smartInboxFolder);
    assert_folder_not_visible(inboxFolder);
    let rootFolder = folder.server.rootFolder;
    collapse_folder(rootFolder);
    assert_folder_collapsed(rootFolder);

    // Move to a different folder
    await be_in_folder(get_smart_folder_named("Trash"));
    assert_message_not_in_view(inboxMsgHdr);

    // Try displaying the message
    display_message_in_folder_tab(inboxMsgHdr);

    // Check that nothing has expanded, and that the right folder is selected
    assert_folder_mode("smart");
    assert_folder_collapsed(smartInboxFolder);
    assert_folder_collapsed(rootFolder);
    assert_folder_selected_and_displayed(smartInboxFolder);
    assert_selected_and_displayed(inboxMsgHdr);
  }
);

/**
 * Move back to the all folders mode.
 */
add_task(function test_switch_to_all_folders() {
  // Hide the smart folders view enabled in the previous test. The activeModes
  // setter should take care of restoring the "all" view and prevent and empty
  // Folder pane.
  mc.folderTreeView.activeModes = "smart";
  assert_folder_mode("all");
  assert_folder_tree_view_row_count(10);
});

registerCleanupFunction(function () {
  // Remove our folders
  inboxFolder.propagateDelete(folder, true);
  inboxFolder.propagateDelete(dummyFolder, true);
  inboxFolder.server.rootFolder.propagateDelete(inbox2Folder, true);
  assert_folder_tree_view_row_count(7);

  document.getElementById("folderTree").focus();

  Assert.report(
    false,
    undefined,
    undefined,
    "Test ran to completion successfully"
  );
});