Alert.js 18 KB

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