PasteStatus.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. 'use strict';
  2. var common = require('../common');
  3. describe('PasteStatus', function () {
  4. describe('createPasteNotification', function () {
  5. this.timeout(30000);
  6. jsc.property(
  7. 'creates a notification after a successfull paste upload',
  8. common.jscSchemas(),
  9. jsc.nearray(common.jscA2zString()),
  10. jsc.array(common.jscQueryString()),
  11. 'string',
  12. common.jscSchemas(),
  13. jsc.nearray(common.jscA2zString()),
  14. jsc.array(common.jscQueryString()),
  15. function (
  16. schema1, address1, query1, fragment1,
  17. schema2, address2, query2
  18. ) {
  19. var expected1 = schema1 + '://' + address1.join('') + '/?' +
  20. encodeURI(query1.join('').replace(/^&+|&+$/gm,'') + '#' + fragment1),
  21. expected2 = schema2 + '://' + address2.join('') + '/?' +
  22. encodeURI(query2.join('').replace(/^&+|&+$/gm,'')),
  23. clean = jsdom();
  24. $('body').html('<div><div id="deletelink"></div><div id="pastelink"></div></div>');
  25. $.PrivateBin.PasteStatus.init();
  26. $.PrivateBin.PasteStatus.createPasteNotification(expected1, expected2);
  27. var result1 = $('#pasteurl')[0].href,
  28. result2 = $('#deletelink a')[0].href;
  29. clean();
  30. return result1 === expected1 && result2 === expected2;
  31. }
  32. );
  33. });
  34. describe('extractUrl', function () {
  35. this.timeout(30000);
  36. jsc.property(
  37. 'extracts and updates URLs found in given response',
  38. jsc.elements(['http','https']),
  39. 'nestring',
  40. jsc.nearray(common.jscA2zString()),
  41. jsc.array(common.jscQueryString()),
  42. jsc.array(common.jscAlnumString()),
  43. 'string',
  44. function (schema, domain, tld, query, shortid, fragment) {
  45. domain = domain.replace(/\P{Letter}|[\u00AA-\u00BA]/gu,'').toLowerCase();
  46. if (domain.length === 0) {
  47. domain = 'a';
  48. }
  49. const expected = '.' + tld.join('') + '/' + (query.length > 0 ?
  50. ('?' + encodeURI(query.join('').replace(/^&+|&+$/gm,'')) +
  51. shortid.join('')) : '') + (fragment.length > 0 ?
  52. ('#' + encodeURI(fragment)) : ''),
  53. clean = jsdom();
  54. $('body').html('<div><div id="pastelink"></div></div>');
  55. $.PrivateBin.PasteStatus.init();
  56. $.PrivateBin.PasteStatus.createPasteNotification('', '');
  57. $.PrivateBin.PasteStatus.extractUrl(schema + '://' + domain + expected);
  58. const result = $('#pasteurl')[0].href;
  59. clean();
  60. return result.endsWith(expected) && (
  61. result.startsWith(schema + '://xn--') ||
  62. result.startsWith(schema + '://' + domain)
  63. );
  64. }
  65. );
  66. });
  67. describe('showRemainingTime', function () {
  68. this.timeout(30000);
  69. jsc.property(
  70. 'shows burn after reading message or remaining time v1',
  71. 'bool',
  72. 'nat',
  73. jsc.nearray(common.jscA2zString()),
  74. jsc.nearray(common.jscA2zString()),
  75. jsc.nearray(common.jscQueryString()),
  76. 'string',
  77. function (
  78. burnafterreading, remainingTime,
  79. schema, address, query, fragment
  80. ) {
  81. var clean = jsdom('', {
  82. url: schema.join('') + '://' + address.join('') +
  83. '/?' + query.join('') + '#' + fragment
  84. }),
  85. result;
  86. $('body').html('<div id="remainingtime" class="hidden"></div>');
  87. $.PrivateBin.PasteStatus.init();
  88. $.PrivateBin.PasteStatus.showRemainingTime($.PrivateBin.Helper.PasteFactory({'meta': {
  89. 'burnafterreading': burnafterreading,
  90. 'remaining_time': remainingTime
  91. }}));
  92. if (burnafterreading) {
  93. result = $('#remainingtime').hasClass('foryoureyesonly') &&
  94. !$('#remainingtime').hasClass('hidden');
  95. } else if (remainingTime) {
  96. result =!$('#remainingtime').hasClass('foryoureyesonly') &&
  97. !$('#remainingtime').hasClass('hidden');
  98. } else {
  99. result = $('#remainingtime').hasClass('hidden') &&
  100. !$('#remainingtime').hasClass('foryoureyesonly');
  101. }
  102. clean();
  103. return result;
  104. }
  105. );
  106. jsc.property(
  107. 'shows burn after reading message or remaining time v2',
  108. 'bool',
  109. 'nat',
  110. jsc.nearray(common.jscA2zString()),
  111. jsc.nearray(common.jscA2zString()),
  112. jsc.nearray(common.jscQueryString()),
  113. 'string',
  114. function (
  115. burnafterreading, remainingTime,
  116. schema, address, query, fragment
  117. ) {
  118. var clean = jsdom('', {
  119. url: schema.join('') + '://' + address.join('') +
  120. '/?' + query.join('') + '#' + fragment
  121. }),
  122. result;
  123. $('body').html('<div id="remainingtime" class="hidden"></div>');
  124. $.PrivateBin.PasteStatus.init();
  125. $.PrivateBin.PasteStatus.showRemainingTime($.PrivateBin.Helper.PasteFactory({
  126. 'adata': [null, null, null, burnafterreading],
  127. 'v': 2,
  128. 'meta': {
  129. 'time_to_live': remainingTime
  130. }
  131. }));
  132. if (burnafterreading) {
  133. result = $('#remainingtime').hasClass('foryoureyesonly') &&
  134. !$('#remainingtime').hasClass('hidden');
  135. } else if (remainingTime) {
  136. result =!$('#remainingtime').hasClass('foryoureyesonly') &&
  137. !$('#remainingtime').hasClass('hidden');
  138. } else {
  139. result = $('#remainingtime').hasClass('hidden') &&
  140. !$('#remainingtime').hasClass('foryoureyesonly');
  141. }
  142. clean();
  143. return result;
  144. }
  145. );
  146. });
  147. describe('hideMessages', function () {
  148. it(
  149. 'hides all messages',
  150. function() {
  151. $('body').html(
  152. '<div id="remainingtime"></div><div id="pastesuccess"></div>'
  153. );
  154. $.PrivateBin.PasteStatus.init();
  155. $.PrivateBin.PasteStatus.hideMessages();
  156. assert.ok(
  157. $('#remainingtime').hasClass('hidden') &&
  158. $('#pastesuccess').hasClass('hidden')
  159. );
  160. }
  161. );
  162. });
  163. });