Alert.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. 'use strict';
  2. var common = require('../common');
  3. describe('Alert', function () {
  4. describe('showStatus', function () {
  5. jsc.property(
  6. 'shows a status message (basic)',
  7. jsc.array(common.jscAlnumString()),
  8. jsc.array(common.jscAlnumString()),
  9. function (icon, message) {
  10. icon = icon.join('');
  11. message = message.join('');
  12. const expected = '<div id="status">' + message + '</div>';
  13. document.body.innerHTML =
  14. '<div id="status"></div>';
  15. PrivateBin.Alert.init();
  16. PrivateBin.Alert.showStatus(message, icon);
  17. const result = document.body.innerHTML;
  18. return expected === result;
  19. }
  20. );
  21. jsc.property(
  22. 'shows a status message (bootstrap)',
  23. jsc.array(common.jscAlnumString()),
  24. function (message) {
  25. message = message.join('');
  26. const expected = '<div id="status" role="alert" ' +
  27. 'class="statusmessage alert alert-info"><span ' +
  28. 'class="glyphicon glyphicon-info-sign" ' +
  29. 'aria-hidden="true"></span> <span>' + message + '</span></div>';
  30. document.body.innerHTML =
  31. '<div id="status" role="alert" class="statusmessage ' +
  32. 'alert alert-info hidden"><span class="glyphicon ' +
  33. 'glyphicon-info-sign" aria-hidden="true"></span> </div>';
  34. PrivateBin.Alert.init();
  35. PrivateBin.Alert.showStatus(message);
  36. const result = document.body.innerHTML;
  37. return expected === result;
  38. }
  39. );
  40. jsc.property(
  41. 'shows a status message (bootstrap, custom icon)',
  42. jsc.array(common.jscAlnumString()),
  43. jsc.array(common.jscAlnumString()),
  44. function (icon, message) {
  45. icon = icon.join('');
  46. message = message.join('');
  47. const expected = '<div id="status" role="alert" ' +
  48. 'class="statusmessage alert alert-info"><span ' +
  49. 'class="glyphicon glyphicon-' + icon +
  50. '" aria-hidden="true"></span> <span>' + message + '</span></div>';
  51. document.body.innerHTML =
  52. '<div id="status" role="alert" class="statusmessage ' +
  53. 'alert alert-info hidden"><span class="glyphicon ' +
  54. 'glyphicon-info-sign" aria-hidden="true"></span> </div>';
  55. PrivateBin.Alert.init();
  56. PrivateBin.Alert.showStatus(message, icon);
  57. const result = document.body.innerHTML;
  58. return expected === result;
  59. }
  60. );
  61. });
  62. describe('showWarning', function () {
  63. jsc.property(
  64. 'shows a warning message (basic)',
  65. jsc.array(common.jscAlnumString()),
  66. jsc.array(common.jscAlnumString()),
  67. function (icon, message) {
  68. icon = icon.join('');
  69. message = message.join('');
  70. const expected = '<div id="errormessage">' + message + '</div>';
  71. document.body.innerHTML =
  72. '<div id="errormessage"></div>';
  73. PrivateBin.Alert.init();
  74. PrivateBin.Alert.showWarning(message, icon);
  75. const result = document.body.innerHTML;
  76. return expected === result;
  77. }
  78. );
  79. jsc.property(
  80. 'shows a warning message (bootstrap)',
  81. jsc.array(common.jscAlnumString()),
  82. jsc.array(common.jscAlnumString()),
  83. function (message) {
  84. message = message.join('');
  85. const expected = '<div id="errormessage" role="alert" ' +
  86. 'class="statusmessage alert alert-danger"><span ' +
  87. 'class="glyphicon glyphicon-warning-sign" ' +
  88. 'aria-hidden="true"></span> <span>' + message + '</span></div>';
  89. document.body.innerHTML =
  90. '<div id="errormessage" role="alert" class="statusmessage ' +
  91. 'alert alert-danger hidden"><span class="glyphicon ' +
  92. 'glyphicon-alert" aria-hidden="true"></span> </div>';
  93. PrivateBin.Alert.init();
  94. PrivateBin.Alert.showWarning(message);
  95. const result = document.body.innerHTML;
  96. return expected === result;
  97. }
  98. );
  99. jsc.property(
  100. 'shows a warning message (bootstrap, custom icon)',
  101. jsc.array(common.jscAlnumString()),
  102. jsc.array(common.jscAlnumString()),
  103. function (icon, message) {
  104. icon = icon.join('');
  105. message = message.join('');
  106. const expected = '<div id="errormessage" role="alert" ' +
  107. 'class="statusmessage alert alert-danger"><span ' +
  108. 'class="glyphicon glyphicon-' + icon +
  109. '" aria-hidden="true"></span> <span>' + message + '</span></div>';
  110. document.body.innerHTML =
  111. '<div id="errormessage" role="alert" class="statusmessage ' +
  112. 'alert alert-danger hidden"><span class="glyphicon ' +
  113. 'glyphicon-alert" aria-hidden="true"></span> </div>';
  114. PrivateBin.Alert.init();
  115. PrivateBin.Alert.showWarning(message, icon);
  116. const result = document.body.innerHTML;
  117. return expected === result;
  118. }
  119. );
  120. });
  121. describe('showError', function () {
  122. jsc.property(
  123. 'shows an error message (basic)',
  124. jsc.array(common.jscAlnumString()),
  125. jsc.array(common.jscAlnumString()),
  126. function (icon, message) {
  127. icon = icon.join('');
  128. message = message.join('');
  129. const expected = '<div id="errormessage">' + message + '</div>';
  130. document.body.innerHTML =
  131. '<div id="errormessage"></div>';
  132. PrivateBin.Alert.init();
  133. PrivateBin.Alert.showError(message, icon);
  134. const result = document.body.innerHTML;
  135. return expected === result;
  136. }
  137. );
  138. jsc.property(
  139. 'shows an error message (bootstrap)',
  140. jsc.array(common.jscAlnumString()),
  141. jsc.array(common.jscAlnumString()),
  142. function (icon, message) {
  143. message = message.join('');
  144. const expected = '<div id="errormessage" role="alert" ' +
  145. 'class="statusmessage alert alert-danger"><span ' +
  146. 'class="glyphicon glyphicon-alert" ' +
  147. 'aria-hidden="true"></span> <span>' + message + '</span></div>';
  148. document.body.innerHTML =
  149. '<div id="errormessage" role="alert" class="statusmessage ' +
  150. 'alert alert-danger hidden"><span class="glyphicon ' +
  151. 'glyphicon-alert" aria-hidden="true"></span> </div>';
  152. PrivateBin.Alert.init();
  153. PrivateBin.Alert.showError(message);
  154. const result = document.body.innerHTML;
  155. return expected === result;
  156. }
  157. );
  158. jsc.property(
  159. 'shows an error message (bootstrap, custom icon)',
  160. jsc.array(common.jscAlnumString()),
  161. jsc.array(common.jscAlnumString()),
  162. function (icon, message) {
  163. icon = icon.join('');
  164. message = message.join('');
  165. const expected = '<div id="errormessage" role="alert" ' +
  166. 'class="statusmessage alert alert-danger"><span ' +
  167. 'class="glyphicon glyphicon-' + icon +
  168. '" aria-hidden="true"></span> <span>' + message + '</span></div>';
  169. document.body.innerHTML =
  170. '<div id="errormessage" role="alert" class="statusmessage ' +
  171. 'alert alert-danger hidden"><span class="glyphicon ' +
  172. 'glyphicon-alert" aria-hidden="true"></span> </div>';
  173. PrivateBin.Alert.init();
  174. PrivateBin.Alert.showError(message, icon);
  175. const result = document.body.innerHTML;
  176. return expected === result;
  177. }
  178. );
  179. });
  180. describe('showRemaining', function () {
  181. jsc.property(
  182. 'shows remaining time (basic)',
  183. jsc.array(common.jscAlnumString()),
  184. jsc.array(common.jscAlnumString()),
  185. 'integer',
  186. function (message, string, number) {
  187. message = message.join('');
  188. string = string.join('');
  189. const expected = '<div id="remainingtime" class="">' + string + message + number + '</div>';
  190. document.body.innerHTML =
  191. '<div id="remainingtime" class="hidden"></div>';
  192. PrivateBin.Alert.init();
  193. PrivateBin.Alert.showRemaining(['%s' + message + '%d', string, number]);
  194. const result = document.body.innerHTML;
  195. return expected === result;
  196. }
  197. );
  198. jsc.property(
  199. 'shows remaining time (bootstrap)',
  200. jsc.array(common.jscAlnumString()),
  201. jsc.array(common.jscAlnumString()),
  202. 'integer',
  203. function (message, string, number) {
  204. message = message.join('');
  205. string = string.join('');
  206. const expected = '<div id="remainingtime" role="alert" ' +
  207. 'class="alert alert-info"><span ' +
  208. 'class="glyphicon glyphicon-fire" aria-hidden="true">' +
  209. '</span> <span>' + string + message + number + '</span></div>';
  210. document.body.innerHTML =
  211. '<div id="remainingtime" role="alert" class="hidden ' +
  212. 'alert alert-info"><span class="glyphicon ' +
  213. 'glyphicon-fire" aria-hidden="true"></span> </div>';
  214. PrivateBin.Alert.init();
  215. PrivateBin.Alert.showRemaining(['%s' + message + '%d', string, number]);
  216. const result = document.body.innerHTML;
  217. return expected === result;
  218. }
  219. );
  220. });
  221. describe('showLoading', function () {
  222. jsc.property(
  223. 'shows a loading message (basic)',
  224. jsc.array(common.jscAlnumString()),
  225. jsc.array(common.jscAlnumString()),
  226. function (message, icon) {
  227. message = message.join('');
  228. icon = icon.join('');
  229. const defaultMessage = 'Loading…';
  230. if (message.length === 0) {
  231. message = defaultMessage;
  232. }
  233. const expected = '<div id="loadingindicator" class="">' + message + '</div>';
  234. document.body.innerHTML =
  235. '<div id="loadingindicator" class="hidden">' + defaultMessage + '</div>';
  236. PrivateBin.Alert.init();
  237. PrivateBin.Alert.showLoading(message, icon);
  238. const result = document.body.innerHTML;
  239. return expected === result;
  240. }
  241. );
  242. jsc.property(
  243. 'shows a loading message (bootstrap)',
  244. jsc.array(common.jscAlnumString()),
  245. jsc.array(common.jscAlnumString()),
  246. function (message, icon) {
  247. message = message.join('');
  248. icon = icon.join('');
  249. const defaultMessage = 'Loading…';
  250. if (message.length === 0) {
  251. message = defaultMessage;
  252. }
  253. const expected = '<ul class="nav navbar-nav"><li ' +
  254. 'id="loadingindicator" class="navbar-text"><span ' +
  255. 'class="glyphicon glyphicon-' + icon +
  256. '" aria-hidden="true"></span> <span>' + message + '</span></li></ul>';
  257. document.body.innerHTML =
  258. '<ul class="nav navbar-nav"><li id="loadingindicator" ' +
  259. 'class="navbar-text hidden"><span class="glyphicon ' +
  260. 'glyphicon-time" aria-hidden="true"></span> ' +
  261. defaultMessage + '</li></ul>';
  262. PrivateBin.Alert.init();
  263. PrivateBin.Alert.showLoading(message, icon);
  264. const result = document.body.innerHTML;
  265. return expected === result;
  266. }
  267. );
  268. });
  269. describe('hideLoading', function () {
  270. it(
  271. 'hides the loading message',
  272. function() {
  273. document.body.innerHTML =
  274. '<ul class="nav navbar-nav"><li id="loadingindicator" ' +
  275. 'class="navbar-text"><span class="glyphicon ' +
  276. 'glyphicon-time" aria-hidden="true"></span> ' +
  277. 'Loading…</li></ul>';
  278. document.body.classList.add('loading');
  279. PrivateBin.Alert.init();
  280. PrivateBin.Alert.hideLoading();
  281. assert.ok(!document.body.classList.contains('loading'));
  282. assert.ok(document.getElementById('loadingindicator').classList.contains('hidden'));
  283. }
  284. );
  285. });
  286. describe('hideMessages', function () {
  287. it(
  288. 'hides all messages',
  289. function() {
  290. document.body.innerHTML =
  291. '<div id="status" role="alert" class="statusmessage ' +
  292. 'alert alert-info"><span class="glyphicon ' +
  293. 'glyphicon-info-sign" aria-hidden="true"></span> </div>' +
  294. '<div id="errormessage" role="alert" class="statusmessage ' +
  295. 'alert alert-danger"><span class="glyphicon ' +
  296. 'glyphicon-alert" aria-hidden="true"></span> </div>';
  297. PrivateBin.Alert.init();
  298. PrivateBin.Alert.hideMessages();
  299. assert.ok(document.getElementById('status').classList.contains('hidden'));
  300. assert.ok(document.getElementById('errormessage').classList.contains('hidden'));
  301. }
  302. );
  303. });
  304. describe('setCustomHandler', function () {
  305. jsc.property(
  306. 'calls a given handler function',
  307. 'nat 3',
  308. jsc.array(common.jscAlnumString()),
  309. function (trigger, message) {
  310. message = message.join('');
  311. let handlerCalled = false,
  312. defaultMessage = 'Loading…',
  313. functions = [
  314. PrivateBin.Alert.showStatus,
  315. PrivateBin.Alert.showError,
  316. PrivateBin.Alert.showRemaining,
  317. PrivateBin.Alert.showLoading
  318. ];
  319. if (message.length === 0) {
  320. message = defaultMessage;
  321. }
  322. document.body.innerHTML =
  323. '<ul class="nav navbar-nav"><li id="loadingindicator" ' +
  324. 'class="navbar-text hidden"><span class="glyphicon ' +
  325. 'glyphicon-time" aria-hidden="true"></span> ' +
  326. defaultMessage + '</li></ul>' +
  327. '<div id="remainingtime" role="alert" class="hidden ' +
  328. 'alert alert-info"><span class="glyphicon ' +
  329. 'glyphicon-fire" aria-hidden="true"></span> </div>' +
  330. '<div id="status" role="alert" class="statusmessage ' +
  331. 'alert alert-info"><span class="glyphicon ' +
  332. 'glyphicon-info-sign" aria-hidden="true"></span> </div>' +
  333. '<div id="errormessage" role="alert" class="statusmessage ' +
  334. 'alert alert-danger"><span class="glyphicon ' +
  335. 'glyphicon-alert" aria-hidden="true"></span> </div>';
  336. PrivateBin.Alert.init();
  337. PrivateBin.Alert.setCustomHandler(function(id, element) {
  338. handlerCalled = true;
  339. return jsc.random(0, 1) ? true : element;
  340. });
  341. functions[trigger](message);
  342. PrivateBin.Alert.setCustomHandler(null);
  343. return handlerCalled;
  344. }
  345. );
  346. });
  347. });