Index: chrome/content/tests/notification.js |
=================================================================== |
new file mode 100644 |
--- /dev/null |
+++ b/chrome/content/tests/notification.js |
@@ -0,0 +1,213 @@ |
+(function() |
+{ |
+ let testRunner = null; |
+ let server = null; |
+ let randomResult = 0.5; |
+ |
+ let originalApplication; |
+ let originalAddonVersion; |
+ let info = require("info"); |
+ |
+ module("Notification", |
+ { |
+ setup: function() |
+ { |
+ testRunner = this; |
+ |
+ preparePrefs.call(this); |
+ setupVirtualTime.call(this, function(wrapTimer) |
+ { |
+ let NotificationModule = getModuleGlobal("notification"); |
+ NotificationModule.downloader._timer = wrapTimer(NotificationModule.downloader._timer); |
+ }, "notification", "downloader"); |
+ |
+ server = new nsHttpServer(); |
+ server.start(1234); |
+ |
+ originalApplication = info.application; |
+ info.application = "chrome"; |
+ originalAddonVersion = info.addonVersion; |
+ info.addonVersion = "1.4.1"; |
+ |
+ Prefs.notificationurl = "http://127.0.0.1:1234/notification.json"; |
+ Prefs.notificationdata = {}; |
+ |
+ // Replace Math.random() function |
+ let DownloaderGlobal = Cu.getGlobalForObject(getModuleGlobal("downloader")); |
+ this._origRandom = DownloaderGlobal.Math.random; |
+ DownloaderGlobal.Math.random = function() randomResult; |
+ randomResult = 0.5; |
Felix Dahlke
2013/07/19 14:30:41
This seems redundant, looks like randomResult is a
Wladimir Palant
2013/07/19 14:58:49
Actually, the point here is to reset randomResult
|
+ }, |
+ |
+ teardown: function() |
+ { |
+ restorePrefs.call(this); |
+ restoreVirtualTime.call(this); |
+ |
+ stop(); |
+ server.stop(function() |
+ { |
+ server = null; |
+ start(); |
+ }); |
+ |
+ info.application = originalApplication; |
+ info.addonVersion = originalAddonVersion; |
+ |
+ if (this._origRandom) |
+ { |
+ let DownloaderGlobal = Cu.getGlobalForObject(getModuleGlobal("downloader")); |
+ DownloaderGlobal.Math.random = this._origRandom; |
+ delete this._origRandom; |
+ } |
+ |
+ Notification.init(); |
+ } |
+ }); |
+ |
+ function registerHandler(notifications) |
+ { |
+ server.registerPathHandler("/notification.json", function(metadata, response) |
+ { |
+ response.setStatusLine("1.1", "200", "OK"); |
+ response.setHeader("Content-Type", "application/json"); |
+ |
+ let notification = { |
+ version: 55, |
+ notifications: notifications |
+ }; |
+ |
+ let result = JSON.stringify(notification); |
+ response.bodyOutputStream.write(result, result.length); |
+ }); |
+ } |
+ |
+ function fixConstructors(object) |
+ { |
+ // deepEqual() expects that the constructors used in expected objects and |
+ // the ones in the actual results are the same. That means that we actually |
+ // have to construct our objects in the context of the notification module. |
+ let JSON = Cu.getGlobalForObject(Notification).JSON; |
+ return JSON.parse(JSON.stringify(object)); |
+ } |
+ |
+ test("No data", 1, function() |
+ { |
+ equal(Notification.getNextToShow(), null, "null should be returned if there is no data"); |
+ }); |
+ |
+ test("Single notification", 2, function() |
+ { |
+ let information = fixConstructors({ |
+ timestamp: 1, |
+ severity: "information", |
+ message: {en: "Information"} |
+ }); |
+ |
+ registerHandler([information]); |
+ testRunner.runScheduledTasks(1); |
+ |
+ deepEqual(Notification.getNextToShow(), information, "The notification is shown"); |
+ equal(Notification.getNextToShow(), null, "Informational notifications aren't shown more than once"); |
+ }); |
+ |
+ test("Information and critical", 2, function() |
+ { |
+ let information = fixConstructors({ |
+ timestamp: 1, |
+ severity: "information", |
+ message: {en: "Information"} |
+ }); |
+ let critical = fixConstructors({ |
+ timestamp: 2, |
+ severity: "critical", |
+ message: {en: "Critical"} |
+ }); |
+ |
+ registerHandler([information, critical]); |
+ testRunner.runScheduledTasks(1); |
+ |
+ deepEqual(Notification.getNextToShow(), critical, "The critical notification is given priority"); |
+ deepEqual(Notification.getNextToShow(), critical, "Critical notifications can be shown multiple times"); |
+ }); |
+ |
+ test("No severity", 2, function() |
+ { |
+ let information = fixConstructors({ |
+ timestamp: 1, |
+ message: {en: "Information"} |
+ }); |
+ |
+ registerHandler([information]); |
+ testRunner.runScheduledTasks(1); |
+ |
+ deepEqual(Notification.getNextToShow(), information, "The notification is shown"); |
+ equal(Notification.getNextToShow(), null, "Notification is treated as severity information"); |
+ }); |
+ |
+ test("Different platforms", 2, function() |
+ { |
+ let information = fixConstructors({ |
+ timestamp: 1, |
+ severity: "information", |
+ message: {en: "Information"}, |
+ platforms: ["chrome", "firefox"] |
+ }); |
+ let critical = fixConstructors({ |
+ timestamp: 2, |
+ severity: "critical", |
+ message: {en: "Critical"}, |
+ platforms: ["firefox"] |
+ }); |
+ |
+ registerHandler([information, critical]); |
+ testRunner.runScheduledTasks(1); |
+ |
+ deepEqual(Notification.getNextToShow(), information, "Critical notification is ignored if platform doesn't match"); |
+ deepEqual(Notification.getNextToShow(), null, "Critical notification still ignored even if no other notifications available"); |
+ }); |
+ |
+ test("Min version", 2, function() |
+ { |
+ let information = fixConstructors({ |
+ timestamp: 1, |
+ severity: "information", |
+ message: {en: "Information"}, |
+ minVersion: "1.4" |
+ }); |
+ let critical = fixConstructors({ |
+ timestamp: 2, |
+ severity: "critical", |
+ message: {en: "Critical"}, |
+ minVersion: "1.5" |
+ }); |
+ |
+ registerHandler([information, critical]); |
+ testRunner.runScheduledTasks(1); |
+ |
+ deepEqual(Notification.getNextToShow(), information, "Critical notification is ignored if minVersion doesn't match"); |
+ deepEqual(Notification.getNextToShow(), null, "Critical notification still ignored even if no other notifications available"); |
+ }); |
+ |
+ test("Max version", 2, function() |
+ { |
+ let information = fixConstructors({ |
+ timestamp: 1, |
+ severity: "information", |
+ message: {en: "Information"}, |
+ maxVersion: "1.5" |
+ }); |
+ let critical = fixConstructors({ |
+ timestamp: 2, |
+ severity: "critical", |
+ message: {en: "Critical"}, |
+ maxVersion: "1.4" |
+ }); |
+ |
+ registerHandler([information, critical]); |
+ testRunner.runScheduledTasks(1); |
+ |
+ deepEqual(Notification.getNextToShow(), information, "Critical notification is ignored if maxVersion doesn't match"); |
+ deepEqual(Notification.getNextToShow(), null, "Critical notification still ignored even if no other notifications available"); |
+ }); |
+})(); |