1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ui/message_center/message_center_tray.h"
6
7 #include "base/strings/utf_string_conversions.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 #include "ui/base/models/menu_model.h"
10 #include "ui/message_center/message_center.h"
11 #include "ui/message_center/notification.h"
12 #include "ui/message_center/notification_types.h"
13
14 using base::ASCIIToUTF16;
15
16 namespace message_center {
17 namespace {
18
19 class MockDelegate : public MessageCenterTrayDelegate {
20 public:
MockDelegate()21 MockDelegate()
22 : show_popups_success_(true),
23 show_message_center_success_(true),
24 enable_context_menu_(true) {}
~MockDelegate()25 virtual ~MockDelegate() {}
OnMessageCenterTrayChanged()26 virtual void OnMessageCenterTrayChanged() OVERRIDE {}
ShowPopups()27 virtual bool ShowPopups() OVERRIDE {
28 return show_message_center_success_;
29 }
HidePopups()30 virtual void HidePopups() OVERRIDE {}
ShowMessageCenter()31 virtual bool ShowMessageCenter() OVERRIDE {
32 return show_popups_success_;
33 }
HideMessageCenter()34 virtual void HideMessageCenter() OVERRIDE {}
ShowNotifierSettings()35 virtual bool ShowNotifierSettings() OVERRIDE {
36 return true;
37 }
IsContextMenuEnabled() const38 virtual bool IsContextMenuEnabled() const OVERRIDE {
39 return enable_context_menu_;
40 }
41
GetMessageCenterTray()42 virtual MessageCenterTray* GetMessageCenterTray() OVERRIDE {
43 return NULL;
44 }
45
46 bool show_popups_success_;
47 bool show_message_center_success_;
48 bool enable_context_menu_;
49
50 private:
51 DISALLOW_COPY_AND_ASSIGN(MockDelegate);
52 };
53
54 } // namespace
55
56 class MessageCenterTrayTest : public testing::Test {
57 public:
MessageCenterTrayTest()58 MessageCenterTrayTest() {}
~MessageCenterTrayTest()59 virtual ~MessageCenterTrayTest() {}
60
SetUp()61 virtual void SetUp() {
62 MessageCenter::Initialize();
63 delegate_.reset(new MockDelegate);
64 message_center_ = MessageCenter::Get();
65 message_center_tray_.reset(
66 new MessageCenterTray(delegate_.get(), message_center_));
67 }
68
TearDown()69 virtual void TearDown() {
70 message_center_tray_.reset();
71 delegate_.reset();
72 message_center_ = NULL;
73 MessageCenter::Shutdown();
74 }
75
76 protected:
DummyNotifierId()77 NotifierId DummyNotifierId() {
78 return NotifierId();
79 }
80
AddNotification(const std::string & id)81 void AddNotification(const std::string& id) {
82 scoped_ptr<Notification> notification(
83 new Notification(message_center::NOTIFICATION_TYPE_SIMPLE,
84 id,
85 ASCIIToUTF16("Test Web Notification"),
86 ASCIIToUTF16("Notification message body."),
87 gfx::Image(),
88 ASCIIToUTF16("www.test.org"),
89 DummyNotifierId(),
90 message_center::RichNotificationData(),
91 NULL /* delegate */));
92 message_center_->AddNotification(notification.Pass());
93 }
94 scoped_ptr<MockDelegate> delegate_;
95 scoped_ptr<MessageCenterTray> message_center_tray_;
96 MessageCenter* message_center_;
97
98 private:
99 DISALLOW_COPY_AND_ASSIGN(MessageCenterTrayTest);
100 };
101
TEST_F(MessageCenterTrayTest,BasicMessageCenter)102 TEST_F(MessageCenterTrayTest, BasicMessageCenter) {
103 ASSERT_FALSE(message_center_tray_->popups_visible());
104 ASSERT_FALSE(message_center_tray_->message_center_visible());
105
106 bool shown = message_center_tray_->ShowMessageCenterBubble();
107 EXPECT_TRUE(shown);
108
109 ASSERT_FALSE(message_center_tray_->popups_visible());
110 ASSERT_TRUE(message_center_tray_->message_center_visible());
111
112 message_center_tray_->HideMessageCenterBubble();
113
114 ASSERT_FALSE(message_center_tray_->popups_visible());
115 ASSERT_FALSE(message_center_tray_->message_center_visible());
116
117 message_center_tray_->ToggleMessageCenterBubble();
118
119 ASSERT_FALSE(message_center_tray_->popups_visible());
120 ASSERT_TRUE(message_center_tray_->message_center_visible());
121
122 message_center_tray_->ToggleMessageCenterBubble();
123
124 ASSERT_FALSE(message_center_tray_->popups_visible());
125 ASSERT_FALSE(message_center_tray_->message_center_visible());
126 }
127
TEST_F(MessageCenterTrayTest,BasicPopup)128 TEST_F(MessageCenterTrayTest, BasicPopup) {
129 ASSERT_FALSE(message_center_tray_->popups_visible());
130 ASSERT_FALSE(message_center_tray_->message_center_visible());
131
132 message_center_tray_->ShowPopupBubble();
133
134 ASSERT_FALSE(message_center_tray_->popups_visible());
135 ASSERT_FALSE(message_center_tray_->message_center_visible());
136
137 AddNotification("BasicPopup");
138
139 ASSERT_TRUE(message_center_tray_->popups_visible());
140 ASSERT_FALSE(message_center_tray_->message_center_visible());
141
142 message_center_tray_->HidePopupBubble();
143
144 ASSERT_FALSE(message_center_tray_->popups_visible());
145 ASSERT_FALSE(message_center_tray_->message_center_visible());
146 }
147
TEST_F(MessageCenterTrayTest,MessageCenterClosesPopups)148 TEST_F(MessageCenterTrayTest, MessageCenterClosesPopups) {
149 ASSERT_FALSE(message_center_tray_->popups_visible());
150 ASSERT_FALSE(message_center_tray_->message_center_visible());
151
152 AddNotification("MessageCenterClosesPopups");
153
154 ASSERT_TRUE(message_center_tray_->popups_visible());
155 ASSERT_FALSE(message_center_tray_->message_center_visible());
156
157 bool shown = message_center_tray_->ShowMessageCenterBubble();
158 EXPECT_TRUE(shown);
159
160 ASSERT_FALSE(message_center_tray_->popups_visible());
161 ASSERT_TRUE(message_center_tray_->message_center_visible());
162
163 // The notification is queued if it's added when message center is visible.
164 AddNotification("MessageCenterClosesPopups2");
165
166 message_center_tray_->ShowPopupBubble();
167
168 ASSERT_FALSE(message_center_tray_->popups_visible());
169 ASSERT_TRUE(message_center_tray_->message_center_visible());
170
171 message_center_tray_->HideMessageCenterBubble();
172
173 // The queued notification appears as a popup.
174 ASSERT_TRUE(message_center_tray_->popups_visible());
175 ASSERT_FALSE(message_center_tray_->message_center_visible());
176
177 message_center_tray_->ShowMessageCenterBubble();
178 message_center_tray_->HideMessageCenterBubble();
179 ASSERT_FALSE(message_center_tray_->popups_visible());
180 ASSERT_FALSE(message_center_tray_->message_center_visible());
181 }
182
TEST_F(MessageCenterTrayTest,MessageCenterReopenPopupsForSystemPriority)183 TEST_F(MessageCenterTrayTest, MessageCenterReopenPopupsForSystemPriority) {
184 ASSERT_FALSE(message_center_tray_->popups_visible());
185 ASSERT_FALSE(message_center_tray_->message_center_visible());
186
187 scoped_ptr<Notification> notification(
188 new Notification(message_center::NOTIFICATION_TYPE_SIMPLE,
189 "MessageCenterReopnPopupsForSystemPriority",
190 ASCIIToUTF16("Test Web Notification"),
191 ASCIIToUTF16("Notification message body."),
192 gfx::Image(),
193 ASCIIToUTF16("www.test.org"),
194 DummyNotifierId(),
195 message_center::RichNotificationData(),
196 NULL /* delegate */));
197 notification->SetSystemPriority();
198 message_center_->AddNotification(notification.Pass());
199
200 ASSERT_TRUE(message_center_tray_->popups_visible());
201 ASSERT_FALSE(message_center_tray_->message_center_visible());
202
203 bool shown = message_center_tray_->ShowMessageCenterBubble();
204 EXPECT_TRUE(shown);
205
206 ASSERT_FALSE(message_center_tray_->popups_visible());
207 ASSERT_TRUE(message_center_tray_->message_center_visible());
208
209 message_center_tray_->HideMessageCenterBubble();
210
211 ASSERT_TRUE(message_center_tray_->popups_visible());
212 ASSERT_FALSE(message_center_tray_->message_center_visible());
213 }
214
TEST_F(MessageCenterTrayTest,ShowBubbleFails)215 TEST_F(MessageCenterTrayTest, ShowBubbleFails) {
216 // Now the delegate will signal that it was unable to show a bubble.
217 delegate_->show_popups_success_ = false;
218 delegate_->show_message_center_success_ = false;
219
220 ASSERT_FALSE(message_center_tray_->popups_visible());
221 ASSERT_FALSE(message_center_tray_->message_center_visible());
222
223 AddNotification("ShowBubbleFails");
224
225 message_center_tray_->ShowPopupBubble();
226
227 ASSERT_FALSE(message_center_tray_->popups_visible());
228 ASSERT_FALSE(message_center_tray_->message_center_visible());
229
230 bool shown = message_center_tray_->ShowMessageCenterBubble();
231 EXPECT_FALSE(shown);
232
233 ASSERT_FALSE(message_center_tray_->popups_visible());
234 ASSERT_FALSE(message_center_tray_->message_center_visible());
235
236 message_center_tray_->HideMessageCenterBubble();
237
238 ASSERT_FALSE(message_center_tray_->popups_visible());
239 ASSERT_FALSE(message_center_tray_->message_center_visible());
240
241 message_center_tray_->ToggleMessageCenterBubble();
242
243 ASSERT_FALSE(message_center_tray_->popups_visible());
244 ASSERT_FALSE(message_center_tray_->message_center_visible());
245
246 message_center_tray_->HidePopupBubble();
247
248 ASSERT_FALSE(message_center_tray_->popups_visible());
249 ASSERT_FALSE(message_center_tray_->message_center_visible());
250 }
251
TEST_F(MessageCenterTrayTest,ContextMenuTest)252 TEST_F(MessageCenterTrayTest, ContextMenuTest) {
253 const std::string id1 = "id1";
254 const std::string id2 = "id2";
255 const std::string id3 = "id3";
256 AddNotification(id1);
257
258 base::string16 display_source = ASCIIToUTF16("www.test.org");
259 NotifierId notifier_id = DummyNotifierId();
260
261 NotifierId notifier_id2(NotifierId::APPLICATION, "sample-app");
262 scoped_ptr<Notification> notification(
263 new Notification(message_center::NOTIFICATION_TYPE_SIMPLE,
264 id2,
265 ASCIIToUTF16("Test Web Notification"),
266 ASCIIToUTF16("Notification message body."),
267 gfx::Image(),
268 base::string16() /* empty display source */,
269 notifier_id2,
270 message_center::RichNotificationData(),
271 NULL /* delegate */));
272 message_center_->AddNotification(notification.Pass());
273
274 AddNotification(id3);
275
276 scoped_ptr<ui::MenuModel> model(
277 message_center_tray_->CreateNotificationMenuModel(
278 notifier_id, display_source));
279 EXPECT_EQ(2, model->GetItemCount());
280 const int second_command = model->GetCommandIdAt(1);
281
282 // The second item is to open the settings.
283 EXPECT_TRUE(model->IsEnabledAt(0));
284 EXPECT_TRUE(model->IsEnabledAt(1));
285 model->ActivatedAt(1);
286 EXPECT_TRUE(message_center_tray_->message_center_visible());
287
288 message_center_tray_->HideMessageCenterBubble();
289
290 // The first item is to disable notifications from the notifier id. It also
291 // removes all notifications from the same notifier, i.e. id1 and id3.
292 model->ActivatedAt(0);
293 NotificationList::Notifications notifications =
294 message_center_->GetVisibleNotifications();
295 EXPECT_EQ(1u, notifications.size());
296 EXPECT_EQ(id2, (*notifications.begin())->id());
297
298 // Disables the context menu.
299 delegate_->enable_context_menu_ = false;
300
301 // id2 doesn't have the display source, so it don't have the menu item for
302 // disabling notifications.
303 model = message_center_tray_->CreateNotificationMenuModel(
304 notifier_id2, base::string16());
305 EXPECT_EQ(1, model->GetItemCount());
306 EXPECT_EQ(second_command, model->GetCommandIdAt(0));
307
308 // The command itself is disabled because delegate disables context menu.
309 EXPECT_FALSE(model->IsEnabledAt(0));
310 }
311
312 } // namespace message_center
313