Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: chrome/content/tests/notification.js

Issue 5499340072157184: Issue 2420 - Update notification tests (Closed)
Patch Set: Rebased, addressed comments Created June 8, 2015, 7:35 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 (function() 1 (function()
2 { 2 {
3 let testRunner = null; 3 let testRunner = null;
4 let randomResult = 0.5; 4 let randomResult = 0.5;
5 5
6 let originalInfo; 6 let originalInfo;
7 let info = require("info"); 7 let info = require("info");
8 8
9 function showNotifications(url)
10 {
11 let shownNotifications = [];
12 function showListener(notification)
13 {
14 shownNotifications.push(notification);
15 Notification.markAsShown(notification.id);
16 }
17 Notification.addShowListener(showListener);
18 Notification.showNext(url);
19 Notification.removeShowListener(showListener);
20 return shownNotifications;
21 }
22
9 module("Notification handling", 23 module("Notification handling",
10 { 24 {
11 setup: function() 25 setup: function()
12 { 26 {
13 testRunner = this; 27 testRunner = this;
14 28
15 preparePrefs.call(this); 29 preparePrefs.call(this);
16 setupVirtualTime.call(this, function(wrapTimer) 30 setupVirtualTime.call(this, function(wrapTimer)
17 { 31 {
18 let NotificationModule = getModuleGlobal("notification"); 32 let NotificationModule = getModuleGlobal("notification");
(...skipping 14 matching lines...) Expand all
33 47
34 Prefs.notificationurl = "http://example.com/notification.json"; 48 Prefs.notificationurl = "http://example.com/notification.json";
35 Prefs.notificationdata = {}; 49 Prefs.notificationdata = {};
36 Prefs.notifications_ignoredcategories = []; 50 Prefs.notifications_ignoredcategories = [];
37 51
38 // Replace Math.random() function 52 // Replace Math.random() function
39 let DownloaderGlobal = Cu.getGlobalForObject(getModuleGlobal("downloader") ); 53 let DownloaderGlobal = Cu.getGlobalForObject(getModuleGlobal("downloader") );
40 this._origRandom = DownloaderGlobal.Math.random; 54 this._origRandom = DownloaderGlobal.Math.random;
41 DownloaderGlobal.Math.random = () => randomResult; 55 DownloaderGlobal.Math.random = () => randomResult;
42 randomResult = 0.5; 56 randomResult = 0.5;
57
58 let NotificationGlobal = getModuleGlobal("notification");
59 this._origShowListeners = NotificationGlobal.showListeners;
60 NotificationGlobal.showListeners = [];
43 }, 61 },
44 62
45 teardown: function() 63 teardown: function()
46 { 64 {
47 restorePrefs.call(this); 65 restorePrefs.call(this);
48 restoreVirtualTime.call(this); 66 restoreVirtualTime.call(this);
49 restoreVirtualXMLHttp.call(this); 67 restoreVirtualXMLHttp.call(this);
50 68
51 for (let key in originalInfo) 69 for (let key in originalInfo)
52 info[key] = originalInfo[key]; 70 info[key] = originalInfo[key];
53 71
54 if (this._origRandom) 72 if (this._origRandom)
55 { 73 {
56 let DownloaderGlobal = Cu.getGlobalForObject(getModuleGlobal("downloader ")); 74 let DownloaderGlobal = Cu.getGlobalForObject(getModuleGlobal("downloader "));
57 DownloaderGlobal.Math.random = this._origRandom; 75 DownloaderGlobal.Math.random = this._origRandom;
58 delete this._origRandom; 76 delete this._origRandom;
59 } 77 }
60 78
79 if (this._origShowListeners)
80 {
81 let NotificationGlobal = getModuleGlobal("notification");
82 NotificationGlobal.showListeners = this._origShowListeners;
83 delete this._origShowListeners;
84 }
85
61 Notification.init(); 86 Notification.init();
62 } 87 }
63 }); 88 });
64 89
65 function registerHandler(notifications, checkCallback) 90 function registerHandler(notifications, checkCallback)
66 { 91 {
67 testRunner.registerHandler("/notification.json", function(metadata) 92 testRunner.registerHandler("/notification.json", function(metadata)
68 { 93 {
69 if (checkCallback) 94 if (checkCallback)
70 checkCallback(metadata); 95 checkCallback(metadata);
(...skipping 11 matching lines...) Expand all
82 { 107 {
83 // deepEqual() expects that the constructors used in expected objects and 108 // deepEqual() expects that the constructors used in expected objects and
84 // the ones in the actual results are the same. That means that we actually 109 // the ones in the actual results are the same. That means that we actually
85 // have to construct our objects in the context of the notification module. 110 // have to construct our objects in the context of the notification module.
86 let JSON = Cu.getGlobalForObject(Notification).JSON; 111 let JSON = Cu.getGlobalForObject(Notification).JSON;
87 return JSON.parse(JSON.stringify(object)); 112 return JSON.parse(JSON.stringify(object));
88 } 113 }
89 114
90 test("No data", function() 115 test("No data", function()
91 { 116 {
92 equal(Notification.getNextToShow(), null, "null should be returned if there is no data"); 117 deepEqual(showNotifications(), [], "No notifications should be returned if t here is no data");
93 }); 118 });
94 119
95 test("Single notification", function() 120 test("Single notification", function()
96 { 121 {
97 let information = fixConstructors({ 122 let information = fixConstructors({
98 id: 1, 123 id: 1,
99 type: "information", 124 type: "information",
100 message: {"en-US": "Information"} 125 message: {"en-US": "Information"}
101 }); 126 });
102 127
103 registerHandler([information]); 128 registerHandler([information]);
104 testRunner.runScheduledTasks(1); 129 testRunner.runScheduledTasks(1);
105 130
106 deepEqual(Notification.getNextToShow(), information, "The notification is sh own"); 131 deepEqual(showNotifications(), [information], "The notification is shown");
107 equal(Notification.getNextToShow(), null, "Informational notifications aren' t shown more than once"); 132 deepEqual(showNotifications(), [], "Informational notifications aren't shown more than once");
108 }); 133 });
109 134
110 test("Information and critical", function() 135 test("Information and critical", function()
111 { 136 {
112 let information = fixConstructors({ 137 let information = fixConstructors({
113 id: 1, 138 id: 1,
114 type: "information", 139 type: "information",
115 message: {"en-US": "Information"} 140 message: {"en-US": "Information"}
116 }); 141 });
117 let critical = fixConstructors({ 142 let critical = fixConstructors({
118 id: 2, 143 id: 2,
119 type: "critical", 144 type: "critical",
120 message: {"en-US": "Critical"} 145 message: {"en-US": "Critical"}
121 }); 146 });
122 147
123 registerHandler([information, critical]); 148 registerHandler([information, critical]);
124 testRunner.runScheduledTasks(1); 149 testRunner.runScheduledTasks(1);
125 150
126 deepEqual(Notification.getNextToShow(), critical, "The critical notification is given priority"); 151 deepEqual(showNotifications(), [critical], "The critical notification is giv en priority");
127 deepEqual(Notification.getNextToShow(), critical, "Critical notifications ca n be shown multiple times"); 152 deepEqual(showNotifications(), [critical], "Critical notifications can be sh own multiple times");
128 }); 153 });
129 154
130 test("No type", function() 155 test("No type", function()
131 { 156 {
132 let information = fixConstructors({ 157 let information = fixConstructors({
133 id: 1, 158 id: 1,
134 message: {"en-US": "Information"} 159 message: {"en-US": "Information"}
135 }); 160 });
136 161
137 registerHandler([information]); 162 registerHandler([information]);
138 testRunner.runScheduledTasks(1); 163 testRunner.runScheduledTasks(1);
139 164
140 deepEqual(Notification.getNextToShow(), information, "The notification is sh own"); 165 deepEqual(showNotifications(), [information], "The notification is shown");
141 equal(Notification.getNextToShow(), null, "Notification is treated as type i nformation"); 166 deepEqual(showNotifications(), [], "Notification is treated as type informat ion");
142 }); 167 });
143 168
144 test("Target selection", function() 169 test("Target selection", function()
145 { 170 {
146 let targets = [ 171 let targets = [
147 ["extension", "adblockpluschrome", true], 172 ["extension", "adblockpluschrome", true],
148 ["extension", "adblockplus", false], 173 ["extension", "adblockplus", false],
149 ["extension", "adblockpluschrome2", false], 174 ["extension", "adblockpluschrome2", false],
150 ["extensionMinVersion", "1.4", true], 175 ["extensionMinVersion", "1.4", true],
151 ["extensionMinVersion", "1.4.1", true], 176 ["extensionMinVersion", "1.4.1", true],
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 id: 1, 212 id: 1,
188 type: "information", 213 type: "information",
189 message: {"en-US": "Information"}, 214 message: {"en-US": "Information"},
190 targets: [targetInfo] 215 targets: [targetInfo]
191 }); 216 });
192 217
193 Prefs.notificationdata = {}; 218 Prefs.notificationdata = {};
194 registerHandler([information]); 219 registerHandler([information]);
195 testRunner.runScheduledTasks(1); 220 testRunner.runScheduledTasks(1);
196 221
197 let expected = (result ? information : null); 222 let expected = (result ? [information] : []);
198 deepEqual(Notification.getNextToShow(), expected, "Selected notification f or " + JSON.stringify(information.targets)); 223 deepEqual(showNotifications(), expected, "Selected notification for " + JS ON.stringify(information.targets));
199 deepEqual(Notification.getNextToShow(), null, "No notification on second c all"); 224 deepEqual(showNotifications(), [], "No notification on second call");
200 } 225 }
201 226
202 function pairs(array) 227 function pairs(array)
203 { 228 {
204 for (let element1 of array) 229 for (let element1 of array)
205 for (let element2 of array) 230 for (let element2 of array)
206 yield [element1, element2]; 231 yield [element1, element2];
207 } 232 }
208 for (let [[propName1, value1, result1], [propName2, value2, result2]] in pai rs(targets)) 233 for (let [[propName1, value1, result1], [propName2, value2, result2]] in pai rs(targets))
209 { 234 {
210 let targetInfo1 = {}; 235 let targetInfo1 = {};
211 targetInfo1[propName1] = value1; 236 targetInfo1[propName1] = value1;
212 let targetInfo2 = {}; 237 let targetInfo2 = {};
213 targetInfo2[propName2] = value2; 238 targetInfo2[propName2] = value2;
214 239
215 let information = fixConstructors({ 240 let information = fixConstructors({
216 id: 1, 241 id: 1,
217 type: "information", 242 type: "information",
218 message: {"en-US": "Information"}, 243 message: {"en-US": "Information"},
219 targets: [targetInfo1, targetInfo2] 244 targets: [targetInfo1, targetInfo2]
220 }); 245 });
221 246
222 Prefs.notificationdata = {}; 247 Prefs.notificationdata = {};
223 registerHandler([information]); 248 registerHandler([information]);
224 testRunner.runScheduledTasks(1); 249 testRunner.runScheduledTasks(1);
225 250
226 let expected = (result1 || result2 ? information : null) 251 let expected = (result1 || result2 ? [information] : [])
227 deepEqual(Notification.getNextToShow(), expected, "Selected notification f or " + JSON.stringify(information.targets)); 252 deepEqual(showNotifications(), expected, "Selected notification for " + JS ON.stringify(information.targets));
228 deepEqual(Notification.getNextToShow(), null, "No notification on second c all"); 253 deepEqual(showNotifications(), [], "No notification on second call");
229 254
230 information = fixConstructors({ 255 information = fixConstructors({
231 id: 1, 256 id: 1,
232 type: "information", 257 type: "information",
233 message: {"en-US": "Information"}, 258 message: {"en-US": "Information"},
234 targets: [targetInfo1] 259 targets: [targetInfo1]
235 }); 260 });
236 let critical = fixConstructors({ 261 let critical = fixConstructors({
237 id: 2, 262 id: 2,
238 type: "critical", 263 type: "critical",
239 message: {"en-US": "Critical"}, 264 message: {"en-US": "Critical"},
240 targets: [targetInfo2] 265 targets: [targetInfo2]
241 }); 266 });
242 267
243 Prefs.notificationdata = {}; 268 Prefs.notificationdata = {};
244 registerHandler([information, critical]); 269 registerHandler([information, critical]);
245 testRunner.runScheduledTasks(1); 270 testRunner.runScheduledTasks(1);
246 271
247 expected = (result2 ? critical : (result1 ? information : null)); 272 expected = (result2 ? [critical] : (result1 ? [information] : []));
248 deepEqual(Notification.getNextToShow(), expected, "Selected notification f or information with " + JSON.stringify(information.targets) + " and critical wit h " + JSON.stringify(critical.targets)); 273 deepEqual(showNotifications(), expected, "Selected notification for inform ation with " + JSON.stringify(information.targets) + " and critical with " + JSO N.stringify(critical.targets));
249 } 274 }
250 }); 275 });
251 276
252 test("Parameters sent", function() 277 test("Parameters sent", function()
253 { 278 {
254 Prefs.notificationdata = { 279 Prefs.notificationdata = {
255 data: { 280 data: {
256 version: "3" 281 version: "3"
257 }, 282 },
258 }; 283 };
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 }); 389 });
365 390
366 registerHandler([ 391 registerHandler([
367 withURLFilterFoo, 392 withURLFilterFoo,
368 withoutURLFilter, 393 withoutURLFilter,
369 withURLFilterBar, 394 withURLFilterBar,
370 subdomainURLFilter 395 subdomainURLFilter
371 ]); 396 ]);
372 testRunner.runScheduledTasks(1); 397 testRunner.runScheduledTasks(1);
373 398
374 deepEqual(Notification.getNextToShow(), withoutURLFilter, "URL-specific noti fications are skipped"); 399 deepEqual(showNotifications(), [withoutURLFilter], "URL-specific notificatio ns are skipped");
375 deepEqual(Notification.getNextToShow("http://foo.com"), withURLFilterFoo, "U RL-specific notification is retrieved"); 400 deepEqual(showNotifications("http://foo.com"), [withURLFilterFoo], "URL-spec ific notification is retrieved");
376 deepEqual(Notification.getNextToShow("http://foo.com"), null, "URL-specific notification is not retrieved"); 401 deepEqual(showNotifications("http://foo.com"), [], "URL-specific notificatio n is not retrieved");
377 deepEqual(Notification.getNextToShow("http://www.example.com"), subdomainURL Filter, "URL-specific notification matches subdomain"); 402 deepEqual(showNotifications("http://www.example.com"), [subdomainURLFilter], "URL-specific notification matches subdomain");
378 }); 403 });
379 404
380 test("Global opt-out", function() 405 test("Global opt-out", function()
381 { 406 {
382 Notification.toggleIgnoreCategory("*", true); 407 Notification.toggleIgnoreCategory("*", true);
383 ok(Prefs.notifications_ignoredcategories.indexOf("*") != -1, "Force enable g lobal opt-out"); 408 ok(Prefs.notifications_ignoredcategories.indexOf("*") != -1, "Force enable g lobal opt-out");
384 Notification.toggleIgnoreCategory("*", true); 409 Notification.toggleIgnoreCategory("*", true);
385 ok(Prefs.notifications_ignoredcategories.indexOf("*") != -1, "Force enable g lobal opt-out (again)"); 410 ok(Prefs.notifications_ignoredcategories.indexOf("*") != -1, "Force enable g lobal opt-out (again)");
386 Notification.toggleIgnoreCategory("*", false); 411 Notification.toggleIgnoreCategory("*", false);
387 ok(Prefs.notifications_ignoredcategories.indexOf("*") == -1, "Force disable global opt-out"); 412 ok(Prefs.notifications_ignoredcategories.indexOf("*") == -1, "Force disable global opt-out");
(...skipping 18 matching lines...) Expand all
406 }); 431 });
407 let critical = fixConstructors({ 432 let critical = fixConstructors({
408 id: 2, 433 id: 2,
409 type: "critical" 434 type: "critical"
410 }); 435 });
411 436
412 Notification.toggleIgnoreCategory("*", true); 437 Notification.toggleIgnoreCategory("*", true);
413 registerHandler([information]); 438 registerHandler([information]);
414 testRunner.runScheduledTasks(1); 439 testRunner.runScheduledTasks(1);
415 440
416 deepEqual(Notification.getNextToShow(), null, "Information notifications are ignored after enabling global opt-out"); 441 deepEqual(showNotifications(), [], "Information notifications are ignored af ter enabling global opt-out");
Felix Dahlke 2015/06/08 19:36:53 This and the following changes are the result of r
417 Notification.toggleIgnoreCategory("*", false); 442 Notification.toggleIgnoreCategory("*", false);
418 deepEqual(Notification.getNextToShow(), information, "Information notificati ons are shown after disabling global opt-out"); 443 deepEqual(showNotifications(), [information], "Information notifications are shown after disabling global opt-out");
419 444
420 Notification.toggleIgnoreCategory("*", true); 445 Notification.toggleIgnoreCategory("*", true);
421 Prefs.notificationdata = {}; 446 Prefs.notificationdata = {};
422 registerHandler([critical]); 447 registerHandler([critical]);
423 testRunner.runScheduledTasks(1); 448 testRunner.runScheduledTasks(1);
424 449
425 deepEqual(Notification.getNextToShow(), critical, "Critical notifications ar e not ignored"); 450 deepEqual(showNotifications(), [critical], "Critical notifications are not i gnored");
426 }); 451 });
427 452
428 module("Notification localization"); 453 module("Notification localization");
429 454
430 test("Message without localization", function() 455 test("Message without localization", function()
431 { 456 {
432 let notification = {message: "non-localized"}; 457 let notification = {message: "non-localized"};
433 let texts = Notification.getLocalizedTexts(notification, "en-US"); 458 let texts = Notification.getLocalizedTexts(notification, "en-US");
434 equal(texts.message, "non-localized"); 459 equal(texts.message, "non-localized");
435 }); 460 });
(...skipping 16 matching lines...) Expand all
452 equal(texts.message, "fr"); 477 equal(texts.message, "fr");
453 }); 478 });
454 479
455 test("Missing translation", function() 480 test("Missing translation", function()
456 { 481 {
457 let notification = {message: {"en-US": "en-US"}}; 482 let notification = {message: {"en-US": "en-US"}};
458 let texts = Notification.getLocalizedTexts(notification, "fr"); 483 let texts = Notification.getLocalizedTexts(notification, "fr");
459 equal(texts.message, "en-US"); 484 equal(texts.message, "en-US");
460 }); 485 });
461 })(); 486 })();
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld