PasteStatus.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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. // not available in node before v19.9.0, v18.17.0
  55. if (typeof URL.canParse !== 'function') {
  56. URL.canParse = function(a) {
  57. return true;
  58. }
  59. }
  60. $('body').html('<div><div id="pastelink"></div></div>');
  61. $.PrivateBin.PasteStatus.init();
  62. $.PrivateBin.PasteStatus.createPasteNotification('', '');
  63. $.PrivateBin.PasteStatus.extractUrl(schema + '://' + domain + expected);
  64. const result = $('#pasteurl')[0].href;
  65. clean();
  66. return result.endsWith(expected) && (
  67. result.startsWith(schema + '://xn--') ||
  68. result.startsWith(schema + '://' + domain)
  69. );
  70. }
  71. );
  72. });
  73. describe('showRemainingTime', function () {
  74. this.timeout(30000);
  75. jsc.property(
  76. 'shows burn after reading message or remaining time v1',
  77. 'bool',
  78. 'nat',
  79. jsc.nearray(common.jscA2zString()),
  80. jsc.nearray(common.jscA2zString()),
  81. jsc.nearray(common.jscQueryString()),
  82. 'string',
  83. function (
  84. burnafterreading, remainingTime,
  85. schema, address, query, fragment
  86. ) {
  87. var clean = jsdom('', {
  88. url: schema.join('') + '://' + address.join('') +
  89. '/?' + query.join('') + '#' + fragment
  90. }),
  91. result;
  92. $('body').html('<div id="remainingtime" class="hidden"></div>');
  93. $.PrivateBin.PasteStatus.init();
  94. $.PrivateBin.PasteStatus.showRemainingTime($.PrivateBin.Helper.PasteFactory({'meta': {
  95. 'burnafterreading': burnafterreading,
  96. 'remaining_time': remainingTime
  97. }}));
  98. if (burnafterreading) {
  99. result = $('#remainingtime').hasClass('foryoureyesonly') &&
  100. !$('#remainingtime').hasClass('hidden');
  101. } else if (remainingTime) {
  102. result =!$('#remainingtime').hasClass('foryoureyesonly') &&
  103. !$('#remainingtime').hasClass('hidden');
  104. } else {
  105. result = $('#remainingtime').hasClass('hidden') &&
  106. !$('#remainingtime').hasClass('foryoureyesonly');
  107. }
  108. clean();
  109. return result;
  110. }
  111. );
  112. jsc.property(
  113. 'shows burn after reading message or remaining time v2',
  114. 'bool',
  115. 'nat',
  116. jsc.nearray(common.jscA2zString()),
  117. jsc.nearray(common.jscA2zString()),
  118. jsc.nearray(common.jscQueryString()),
  119. 'string',
  120. function (
  121. burnafterreading, remainingTime,
  122. schema, address, query, fragment
  123. ) {
  124. var clean = jsdom('', {
  125. url: schema.join('') + '://' + address.join('') +
  126. '/?' + query.join('') + '#' + fragment
  127. }),
  128. result;
  129. $('body').html('<div id="remainingtime" class="hidden"></div>');
  130. $.PrivateBin.PasteStatus.init();
  131. $.PrivateBin.PasteStatus.showRemainingTime($.PrivateBin.Helper.PasteFactory({
  132. 'adata': [null, null, null, burnafterreading],
  133. 'v': 2,
  134. 'meta': {
  135. 'time_to_live': remainingTime
  136. }
  137. }));
  138. if (burnafterreading) {
  139. result = $('#remainingtime').hasClass('foryoureyesonly') &&
  140. !$('#remainingtime').hasClass('hidden');
  141. } else if (remainingTime) {
  142. result =!$('#remainingtime').hasClass('foryoureyesonly') &&
  143. !$('#remainingtime').hasClass('hidden');
  144. } else {
  145. result = $('#remainingtime').hasClass('hidden') &&
  146. !$('#remainingtime').hasClass('foryoureyesonly');
  147. }
  148. clean();
  149. return result;
  150. }
  151. );
  152. });
  153. describe('hideMessages', function () {
  154. it(
  155. 'hides all messages',
  156. function() {
  157. $('body').html(
  158. '<div id="remainingtime"></div><div id="pastesuccess"></div>'
  159. );
  160. $.PrivateBin.PasteStatus.init();
  161. $.PrivateBin.PasteStatus.hideMessages();
  162. assert.ok(
  163. $('#remainingtime').hasClass('hidden') &&
  164. $('#pastesuccess').hasClass('hidden')
  165. );
  166. }
  167. );
  168. });
  169. });