TopNav.js 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803
  1. 'use strict';
  2. require('../common');
  3. describe('TopNav', function () {
  4. describe('showViewButtons & hideViewButtons', function () {
  5. before(function () {
  6. cleanup();
  7. });
  8. it(
  9. 'displays & hides navigation elements for viewing an existing document',
  10. function () {
  11. let results = [];
  12. $('body').html(
  13. `<nav class="navbar navbar-inverse navbar-static-top">
  14. <div id="navbar" class="navbar-collapse collapse">
  15. <ul class="nav navbar-nav"><li><button id="newbutton" type="button" class="hidden btn btn-warning navbar-btn">
  16. <span class="glyphicon glyphicon-file" aria-hidden="true">
  17. </span> New</button><button id="clonebutton" type="button" class="hidden btn btn-warning navbar-btn">
  18. <span class="glyphicon glyphicon-duplicate" aria-hidden="true"></span> Clone</button>
  19. <button id="rawtextbutton" type="button" class="hidden btn btn-warning navbar-btn">
  20. <span class="glyphicon glyphicon-text-background" aria-hidden="true"></span> Raw text</button>
  21. <button id="downloadtextbutton" type="button" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> navbar-btn"></button>
  22. <button id="qrcodelink" type="button" data-toggle="modal" data-target="#qrcodemodal" class="hidden btn btn-warning navbar-btn"/>
  23. <span class="glyphicon glyphicon-qrcode" aria-hidden="true"></span> QR code</button></li></ul></div>
  24. </nav>`
  25. );
  26. PrivateBin.TopNav.init();
  27. results.push(
  28. $('#newbutton').hasClass('hidden') &&
  29. $('#clonebutton').hasClass('hidden') &&
  30. $('#rawtextbutton').hasClass('hidden') &&
  31. $('#qrcodelink').hasClass('hidden')
  32. );
  33. PrivateBin.TopNav.showViewButtons();
  34. results.push(
  35. !$('#newbutton').hasClass('hidden') &&
  36. !$('#clonebutton').hasClass('hidden') &&
  37. !$('#rawtextbutton').hasClass('hidden') &&
  38. !$('#qrcodelink').hasClass('hidden')
  39. );
  40. PrivateBin.TopNav.hideViewButtons();
  41. results.push(
  42. $('#newbutton').hasClass('hidden') &&
  43. $('#clonebutton').hasClass('hidden') &&
  44. $('#rawtextbutton').hasClass('hidden') &&
  45. $('#qrcodelink').hasClass('hidden')
  46. );
  47. cleanup();
  48. const result = results.every(element => element);
  49. if (!result) {
  50. console.log(results);
  51. }
  52. assert.ok(result);
  53. }
  54. );
  55. });
  56. describe('showCreateButtons & hideCreateButtons', function () {
  57. before(function () {
  58. cleanup();
  59. });
  60. it(
  61. 'displays & hides navigation elements for creating a document',
  62. function () { // eslint-disable-line complexity
  63. let results = [];
  64. $('body').html(
  65. '<nav><div id="navbar"><ul><li><button id="newbutton" ' +
  66. 'type="button" class="hidden">New</button></li><li><a ' +
  67. 'id="expiration" href="#" class="hidden">Expiration</a>' +
  68. '</li><li><div id="burnafterreadingoption" class="hidden">' +
  69. 'Burn after reading</div></li><li><div id="opendiscussion' +
  70. 'option" class="hidden">Open discussion</div></li><li>' +
  71. '<div id="password" class="hidden">Password</div></li>' +
  72. '<li id="attach" class="hidden">Attach a file</li><li>' +
  73. '<a id="formatter" href="#" class="hidden">Format</a>' +
  74. '</li><li><button id="sendbutton" type="button" ' +
  75. 'class="hidden">Create</button></li></ul></div></nav>'
  76. );
  77. PrivateBin.TopNav.init();
  78. results.push(
  79. $('#sendbutton').hasClass('hidden') &&
  80. $('#expiration').hasClass('hidden') &&
  81. $('#formatter').hasClass('hidden') &&
  82. $('#burnafterreadingoption').hasClass('hidden') &&
  83. $('#opendiscussionoption').hasClass('hidden') &&
  84. $('#newbutton').hasClass('hidden') &&
  85. $('#password').hasClass('hidden') &&
  86. $('#attach').hasClass('hidden')
  87. );
  88. PrivateBin.TopNav.showCreateButtons();
  89. results.push(
  90. !$('#sendbutton').hasClass('hidden') &&
  91. !$('#expiration').hasClass('hidden') &&
  92. !$('#formatter').hasClass('hidden') &&
  93. !$('#burnafterreadingoption').hasClass('hidden') &&
  94. !$('#opendiscussionoption').hasClass('hidden') &&
  95. !$('#newbutton').hasClass('hidden') &&
  96. !$('#password').hasClass('hidden') &&
  97. !$('#attach').hasClass('hidden')
  98. );
  99. PrivateBin.TopNav.hideCreateButtons();
  100. results.push(
  101. $('#sendbutton').hasClass('hidden') &&
  102. $('#expiration').hasClass('hidden') &&
  103. $('#formatter').hasClass('hidden') &&
  104. $('#burnafterreadingoption').hasClass('hidden') &&
  105. $('#opendiscussionoption').hasClass('hidden') &&
  106. $('#newbutton').hasClass('hidden') &&
  107. $('#password').hasClass('hidden') &&
  108. $('#attach').hasClass('hidden')
  109. );
  110. cleanup();
  111. const result = results.every(element => element);
  112. if (!result) {
  113. console.log(results);
  114. }
  115. assert.ok(result);
  116. }
  117. );
  118. });
  119. describe('showNewPasteButton', function () {
  120. before(function () {
  121. cleanup();
  122. });
  123. it(
  124. 'displays the button for creating a document',
  125. function () {
  126. let results = [];
  127. $('body').html(
  128. '<nav><div id="navbar"><ul><li><button id="newbutton" type=' +
  129. '"button" class="hidden">New</button></li></ul></div></nav>'
  130. );
  131. PrivateBin.TopNav.init();
  132. results.push(
  133. $('#newbutton').hasClass('hidden')
  134. );
  135. PrivateBin.TopNav.showNewPasteButton();
  136. results.push(
  137. !$('#newbutton').hasClass('hidden')
  138. );
  139. cleanup();
  140. const result = results.every(element => element);
  141. if (!result) {
  142. console.log(results);
  143. }
  144. assert.ok(result);
  145. }
  146. );
  147. });
  148. describe('hideCloneButton', function () {
  149. before(function () {
  150. cleanup();
  151. });
  152. it(
  153. 'hides the button for cloning a document',
  154. function () {
  155. let results = [];
  156. $('body').html(
  157. '<nav><div id="navbar"><ul><li><button id="clonebutton" ' +
  158. 'type="button" class="btn btn-warning navbar-btn">' +
  159. '<span class="glyphicon glyphicon-duplicate" aria-hidden=' +
  160. '"true"></span> Clone</button></li></ul></div></nav>'
  161. );
  162. PrivateBin.TopNav.init();
  163. results.push(
  164. !$('#clonebutton').hasClass('hidden')
  165. );
  166. PrivateBin.TopNav.hideCloneButton();
  167. results.push(
  168. $('#clonebutton').hasClass('hidden')
  169. );
  170. cleanup();
  171. const result = results.every(element => element);
  172. if (!result) {
  173. console.log(results);
  174. }
  175. assert.ok(result);
  176. }
  177. );
  178. });
  179. describe('hideRawButton', function () {
  180. before(function () {
  181. cleanup();
  182. });
  183. it(
  184. 'hides the raw text button',
  185. function () {
  186. let results = [];
  187. $('body').html(
  188. '<nav><div id="navbar"><ul><li><button ' +
  189. 'id="rawtextbutton" type="button" class="btn ' +
  190. 'btn-warning navbar-btn"><span class="glyphicon ' +
  191. 'glyphicon-text-background" aria-hidden="true"></span> ' +
  192. 'Raw text</button></li></ul></div></nav>'
  193. );
  194. PrivateBin.TopNav.init();
  195. results.push(
  196. !$('#rawtextbutton').hasClass('hidden')
  197. );
  198. PrivateBin.TopNav.hideRawButton();
  199. results.push(
  200. $('#rawtextbutton').hasClass('hidden')
  201. );
  202. cleanup();
  203. const result = results.every(element => element);
  204. if (!result) {
  205. console.log(results);
  206. }
  207. assert.ok(result);
  208. }
  209. );
  210. });
  211. describe('hideFileSelector', function () {
  212. before(function () {
  213. cleanup();
  214. });
  215. it(
  216. 'hides the file attachment selection button',
  217. function () {
  218. let results = [];
  219. $('body').html(
  220. '<nav><div id="navbar"><ul><li id="attach" class="hidden ' +
  221. 'dropdown"><a href="#" class="dropdown-toggle" data-' +
  222. 'toggle="dropdown" role="button" aria-haspopup="true" ' +
  223. 'aria-expanded="false">Attach a file <span class="caret">' +
  224. '</span></a><ul class="dropdown-menu"><li id="filewrap">' +
  225. '<div><input type="file" id="file" name="file" /></div>' +
  226. '</li><li id="customattachment" class="hidden"></li><li>' +
  227. '<a id="fileremovebutton" href="#">Remove attachment</a>' +
  228. '</li></ul></li></ul></div></nav>'
  229. );
  230. PrivateBin.TopNav.init();
  231. results.push(
  232. !$('#filewrap').hasClass('hidden')
  233. );
  234. PrivateBin.TopNav.hideFileSelector();
  235. results.push(
  236. $('#filewrap').hasClass('hidden')
  237. );
  238. cleanup();
  239. const result = results.every(element => element);
  240. if (!result) {
  241. console.log(results);
  242. }
  243. assert.ok(result);
  244. }
  245. );
  246. });
  247. describe('showCustomAttachment', function () {
  248. before(function () {
  249. cleanup();
  250. });
  251. it(
  252. 'display the custom file attachment',
  253. function () {
  254. let results = [];
  255. $('body').html(
  256. '<nav><div id="navbar"><ul><li id="attach" class="hidden ' +
  257. 'dropdown"><a href="#" class="dropdown-toggle" data-' +
  258. 'toggle="dropdown" role="button" aria-haspopup="true" ' +
  259. 'aria-expanded="false">Attach a file <span class="caret">' +
  260. '</span></a><ul class="dropdown-menu"><li id="filewrap">' +
  261. '<div><input type="file" id="file" name="file" /></div>' +
  262. '</li><li id="customattachment" class="hidden"></li><li>' +
  263. '<a id="fileremovebutton" href="#">Remove attachment</a>' +
  264. '</li></ul></li></ul></div></nav>'
  265. );
  266. PrivateBin.TopNav.init();
  267. results.push(
  268. $('#customattachment').hasClass('hidden')
  269. );
  270. PrivateBin.TopNav.showCustomAttachment();
  271. results.push(
  272. !$('#customattachment').hasClass('hidden')
  273. );
  274. cleanup();
  275. const result = results.every(element => element);
  276. if (!result) {
  277. console.log(results);
  278. }
  279. assert.ok(result);
  280. }
  281. );
  282. });
  283. describe('collapseBar', function () {
  284. before(function () {
  285. cleanup();
  286. });
  287. it(
  288. 'collapses the navigation when displayed on a small screen',
  289. function () {
  290. const clean = globalThis.cleanup();
  291. let results = [];
  292. $('body').html(
  293. '<nav><div class="navbar-header"><button type="button" ' +
  294. 'class="navbar-toggle collapsed" data-toggle="collapse" ' +
  295. 'data-target="#navbar" aria-expanded="false" aria-controls' +
  296. '="navbar">Toggle navigation</button><a class="reloadlink ' +
  297. 'navbar-brand" href=""><img alt="PrivateBin" ' +
  298. 'src="img/icon.svg" width="38" /></a></div><div ' +
  299. 'id="navbar"><ul><li><button id="newbutton" type=' +
  300. '"button" class="hidden">New</button></li></ul></div></nav>'
  301. );
  302. PrivateBin.TopNav.init();
  303. results.push(
  304. $('.navbar-toggle').hasClass('collapsed') &&
  305. $('#navbar').attr('aria-expanded') !== 'true'
  306. );
  307. PrivateBin.TopNav.collapseBar();
  308. results.push(
  309. $('.navbar-toggle').hasClass('collapsed') &&
  310. $('#navbar').attr('aria-expanded') !== 'true'
  311. );
  312. /*
  313. with the upgrade for bootstrap-3.3.7.js to bootstrap-3.4.1.js
  314. the mobile interface detection changed to check if the
  315. ontouchstart event exists, which broke this section of the test
  316. $('.navbar-toggle').trigger('click');
  317. results.push(
  318. !$('.navbar-toggle').hasClass('collapsed') &&
  319. $('#navbar').attr('aria-expanded') == 'true'
  320. );
  321. PrivateBin.TopNav.collapseBar();
  322. results.push(
  323. $('.navbar-toggle').hasClass('collapsed') &&
  324. $('#navbar').attr('aria-expanded') == 'false'
  325. );
  326. */
  327. clean();
  328. const result = results.every(element => element);
  329. if (!result) {
  330. console.log(results);
  331. }
  332. assert.ok(result);
  333. }
  334. );
  335. });
  336. describe('resetInput', function () {
  337. before(function () {
  338. cleanup();
  339. });
  340. it(
  341. 'reset inputs to defaults (options off)',
  342. function () {
  343. let results = [];
  344. $('body').html(
  345. '<nav><div id="navbar"><ul><li id="burnafterreadingoption" ' +
  346. 'class="hidden"><label><input type="checkbox" ' +
  347. 'id="burnafterreading" name="burnafterreading" /> ' +
  348. 'Burn after reading</label></li><li id="opendiscussionoption" ' +
  349. 'class="hidden"><label><input type="checkbox" ' +
  350. 'id="opendiscussion" name="opendiscussion" /> ' +
  351. 'Open discussion</label></li></ul></div></nav>'
  352. );
  353. PrivateBin.TopNav.init();
  354. results.push(
  355. !PrivateBin.TopNav.getBurnAfterReading()
  356. );
  357. results.push(
  358. !PrivateBin.TopNav.getOpenDiscussion()
  359. );
  360. $('#burnafterreading').attr('checked', 'checked');
  361. $('#opendiscussion').attr('checked', 'checked');
  362. results.push(
  363. PrivateBin.TopNav.getBurnAfterReading()
  364. );
  365. results.push(
  366. PrivateBin.TopNav.getOpenDiscussion()
  367. );
  368. PrivateBin.TopNav.resetInput();
  369. results.push(
  370. !PrivateBin.TopNav.getBurnAfterReading()
  371. );
  372. results.push(
  373. !PrivateBin.TopNav.getOpenDiscussion()
  374. );
  375. cleanup();
  376. const result = results.every(element => element);
  377. if (!result) {
  378. console.log(results);
  379. }
  380. assert.ok(result);
  381. }
  382. );
  383. it(
  384. 'reset inputs to defaults (burnafterreading on)',
  385. function () {
  386. let results = [];
  387. $('body').html(
  388. '<nav><div id="navbar"><ul><li id="burnafterreadingoption" ' +
  389. 'class="hidden"><label><input type="checkbox" ' +
  390. 'id="burnafterreading" name="burnafterreading" checked="checked" /> ' +
  391. 'Burn after reading</label></li><li id="opendiscussionoption" ' +
  392. 'class="hidden"><label><input type="checkbox" ' +
  393. 'id="opendiscussion" name="opendiscussion" checked="checked" /> ' +
  394. 'Open discussion</label></li></ul></div></nav>'
  395. );
  396. PrivateBin.TopNav.init();
  397. results.push(
  398. PrivateBin.TopNav.getBurnAfterReading()
  399. );
  400. results.push(
  401. !PrivateBin.TopNav.getOpenDiscussion()
  402. );
  403. $('#burnafterreading').removeAttr('checked');
  404. results.push(
  405. !PrivateBin.TopNav.getBurnAfterReading()
  406. );
  407. results.push(
  408. !PrivateBin.TopNav.getOpenDiscussion()
  409. );
  410. PrivateBin.TopNav.resetInput();
  411. results.push(
  412. PrivateBin.TopNav.getBurnAfterReading()
  413. );
  414. results.push(
  415. !PrivateBin.TopNav.getOpenDiscussion()
  416. );
  417. cleanup();
  418. const result = results.every(element => element);
  419. if (!result) {
  420. console.log(results);
  421. }
  422. assert.ok(result);
  423. }
  424. );
  425. it(
  426. 'reset inputs to defaults (opendiscussion on)',
  427. function () {
  428. let results = [];
  429. $('body').html(
  430. '<nav><div id="navbar"><ul><li id="burnafterreadingoption" ' +
  431. 'class="hidden"><label><input type="checkbox" ' +
  432. 'id="burnafterreading" name="burnafterreading" /> ' +
  433. 'Burn after reading</label></li><li id="opendiscussionoption" ' +
  434. 'class="hidden"><label><input type="checkbox" ' +
  435. 'id="opendiscussion" name="opendiscussion" checked="checked" /> ' +
  436. 'Open discussion</label></li></ul></div></nav>'
  437. );
  438. PrivateBin.TopNav.init();
  439. results.push(
  440. !PrivateBin.TopNav.getBurnAfterReading()
  441. );
  442. results.push(
  443. PrivateBin.TopNav.getOpenDiscussion()
  444. );
  445. $('#opendiscussion').removeAttr('checked');
  446. $('#burnafterreading').prop('checked', true);
  447. results.push(
  448. PrivateBin.TopNav.getBurnAfterReading()
  449. );
  450. results.push(
  451. !PrivateBin.TopNav.getOpenDiscussion()
  452. );
  453. PrivateBin.TopNav.resetInput();
  454. results.push(
  455. !PrivateBin.TopNav.getBurnAfterReading()
  456. );
  457. results.push(
  458. PrivateBin.TopNav.getOpenDiscussion()
  459. );
  460. cleanup();
  461. const result = results.every(element => element);
  462. if (!result) {
  463. console.log(results);
  464. }
  465. assert.ok(result);
  466. }
  467. );
  468. });
  469. describe('getExpiration', function () {
  470. before(function () {
  471. cleanup();
  472. });
  473. it(
  474. 'returns the currently selected expiration date',
  475. function () {
  476. $('body').html(
  477. '<select id="pasteExpiration" name="pasteExpiration">' +
  478. '<option value="1day">1 day</option>' +
  479. '<option value="never">Never</option></select>'
  480. );
  481. PrivateBin.TopNav.init();
  482. assert.strictEqual(PrivateBin.TopNav.getExpiration(), '1day');
  483. cleanup();
  484. }
  485. );
  486. });
  487. describe('getFileList', function () {
  488. before(function () {
  489. cleanup();
  490. });
  491. const File = window.File,
  492. FileList = window.FileList,
  493. path = require('path'), // eslint-disable-line global-require
  494. mime = require('mime-types'); // eslint-disable-line global-require
  495. // mocking file input as per https://github.com/jsdom/jsdom/issues/1272
  496. function createFile(file_path) {
  497. const lastModified = fs.statSync(file_path).mtimeMs;
  498. return new File(
  499. [new fs.readFileSync(file_path)],
  500. path.basename(file_path),
  501. {
  502. lastModified,
  503. type: mime.lookup(file_path) || ''
  504. }
  505. );
  506. }
  507. function addFileList(input, file_paths) {
  508. if (typeof file_paths === 'string') {
  509. file_paths = [file_paths];
  510. } else if (!Array.isArray(file_paths)) {
  511. throw new Error('file_paths needs to be a file path string or an Array of file path strings');
  512. }
  513. const file_list = file_paths.map(fp => createFile(fp));
  514. Object.setPrototypeOf(file_list, Object.create(FileList.prototype));
  515. Object.defineProperty(input, 'files', {
  516. value: file_list,
  517. writeable: false
  518. });
  519. return input;
  520. }
  521. it(
  522. 'returns the selected files',
  523. function () {
  524. let results = [];
  525. $('body').html(
  526. '<nav><div id="navbar"><ul><li id="attach" class="hidden ' +
  527. 'dropdown"><a href="#" class="dropdown-toggle" data-' +
  528. 'toggle="dropdown" role="button" aria-haspopup="true" ' +
  529. 'aria-expanded="false">Attach a file <span class="caret">' +
  530. '</span></a><ul class="dropdown-menu"><li id="filewrap">' +
  531. '<div><input type="file" id="file" name="file" /></div>' +
  532. '</li><li id="customattachment" class="hidden"></li><li>' +
  533. '<a id="fileremovebutton" href="#">Remove attachment</a>' +
  534. '</li></ul></li></ul></div></nav>'
  535. );
  536. PrivateBin.TopNav.init();
  537. results.push(
  538. PrivateBin.TopNav.getFileList() === null
  539. );
  540. addFileList($('#file')[0], [
  541. '../img/logo.svg',
  542. '../img/busy.gif'
  543. ]);
  544. const files = PrivateBin.TopNav.getFileList();
  545. results.push(
  546. files[0].name === 'logo.svg' &&
  547. files[1].name === 'busy.gif'
  548. );
  549. cleanup();
  550. const result = results.every(element => element);
  551. if (!result) {
  552. console.log(results);
  553. }
  554. assert.ok(result);
  555. }
  556. );
  557. });
  558. describe('getBurnAfterReading', function () {
  559. before(function () {
  560. cleanup();
  561. });
  562. it(
  563. 'returns if the burn-after-reading checkbox was ticked',
  564. function () {
  565. let results = [];
  566. $('body').html(
  567. '<nav><div id="navbar"><ul><li id="burnafterreadingoption" ' +
  568. 'class="hidden"><label><input type="checkbox" ' +
  569. 'id="burnafterreading" name="burnafterreading" /> ' +
  570. 'Burn after reading</label></li></ul></div></nav>'
  571. );
  572. PrivateBin.TopNav.init();
  573. results.push(
  574. !PrivateBin.TopNav.getBurnAfterReading()
  575. );
  576. $('#burnafterreading').attr('checked', 'checked');
  577. results.push(
  578. PrivateBin.TopNav.getBurnAfterReading()
  579. );
  580. $('#burnafterreading').removeAttr('checked');
  581. results.push(
  582. !PrivateBin.TopNav.getBurnAfterReading()
  583. );
  584. cleanup();
  585. const result = results.every(element => element);
  586. if (!result) {
  587. console.log(results);
  588. }
  589. assert.ok(result);
  590. }
  591. );
  592. });
  593. describe('getOpenDiscussion', function () {
  594. before(function () {
  595. cleanup();
  596. });
  597. it(
  598. 'returns if the open-discussion checkbox was ticked',
  599. function () {
  600. let results = [];
  601. $('body').html(
  602. '<nav><div id="navbar"><ul><li id="opendiscussionoption" ' +
  603. 'class="hidden"><label><input type="checkbox" ' +
  604. 'id="opendiscussion" name="opendiscussion" /> ' +
  605. 'Open discussion</label></li></ul></div></nav>'
  606. );
  607. PrivateBin.TopNav.init();
  608. results.push(
  609. !PrivateBin.TopNav.getOpenDiscussion()
  610. );
  611. $('#opendiscussion').attr('checked', 'checked');
  612. results.push(
  613. PrivateBin.TopNav.getOpenDiscussion()
  614. );
  615. $('#opendiscussion').removeAttr('checked');
  616. results.push(
  617. !PrivateBin.TopNav.getOpenDiscussion()
  618. );
  619. cleanup();
  620. const result = results.every(element => element);
  621. if (!result) {
  622. console.log(results);
  623. }
  624. assert.ok(result);
  625. }
  626. );
  627. });
  628. describe('getPassword', function () {
  629. before(function () {
  630. cleanup();
  631. });
  632. jsc.property(
  633. 'returns the contents of the password input',
  634. 'string',
  635. function (password) {
  636. password = password.replace(/\r+|\n+/g, '');
  637. let results = [];
  638. $('body').html(
  639. '<nav><div id="navbar"><ul><li><div id="password" ' +
  640. 'class="navbar-form hidden"><input type="password" ' +
  641. 'id="passwordinput" placeholder="Password (recommended)" ' +
  642. 'class="form-control" size="23" /></div></li></ul></div></nav>'
  643. );
  644. PrivateBin.TopNav.init();
  645. results.push(
  646. PrivateBin.TopNav.getPassword() === ''
  647. );
  648. $('#passwordinput').val(password);
  649. results.push(
  650. PrivateBin.TopNav.getPassword() === password
  651. );
  652. $('#passwordinput').val('');
  653. results.push(
  654. PrivateBin.TopNav.getPassword() === ''
  655. );
  656. cleanup();
  657. const result = results.every(element => element);
  658. if (!result) {
  659. console.log(results);
  660. }
  661. return result;
  662. }
  663. );
  664. });
  665. describe('getCustomAttachment', function () {
  666. before(function () {
  667. cleanup();
  668. });
  669. it(
  670. 'returns the custom attachment element',
  671. function () {
  672. let results = [];
  673. $('body').html(
  674. '<nav><div id="navbar"><ul><li id="attach" class="hidden ' +
  675. 'dropdown"><a href="#" class="dropdown-toggle" data-' +
  676. 'toggle="dropdown" role="button" aria-haspopup="true" ' +
  677. 'aria-expanded="false">Attach a file <span class="caret">' +
  678. '</span></a><ul class="dropdown-menu"><li id="filewrap">' +
  679. '<div><input type="file" id="file" name="file" /></div>' +
  680. '</li><li id="customattachment" class="hidden"></li><li>' +
  681. '<a id="fileremovebutton" href="#">Remove attachment</a>' +
  682. '</li></ul></li></ul></div></nav>'
  683. );
  684. PrivateBin.TopNav.init();
  685. results.push(
  686. !PrivateBin.TopNav.getCustomAttachment().hasClass('test')
  687. );
  688. $('#customattachment').addClass('test');
  689. results.push(
  690. PrivateBin.TopNav.getCustomAttachment().hasClass('test')
  691. );
  692. cleanup();
  693. const result = results.every(element => element);
  694. if (!result) {
  695. console.log(results);
  696. }
  697. assert.ok(result);
  698. }
  699. );
  700. });
  701. describe('hideAllButtons', function () {
  702. before(function () {
  703. cleanup();
  704. });
  705. it(
  706. 'hides all buttons correctly',
  707. function () {
  708. // Insert any setup code needed for the hideAllButtons function
  709. // Example: Initialize the DOM elements required for testing
  710. $('body').html(
  711. '<nav class="navbar navbar-inverse navbar-static-top">' +
  712. '<div id="navbar" class="navbar-collapse collapse"><ul ' +
  713. 'class="nav navbar-nav"><li><button id="newbutton" ' +
  714. 'type="button" class="hidden btn btn-warning navbar-btn">' +
  715. '<span class="glyphicon glyphicon-file" aria-hidden="true">' +
  716. '</span> New</button><button id="clonebutton" type="button"' +
  717. ' class="hidden btn btn-warning navbar-btn">' +
  718. '<span class="glyphicon glyphicon-duplicate" ' +
  719. 'aria-hidden="true"></span> Clone</button><button ' +
  720. 'id="rawtextbutton" type="button" class="hidden btn ' +
  721. 'btn-warning navbar-btn"><span class="glyphicon ' +
  722. 'glyphicon-text-background" aria-hidden="true"></span> ' +
  723. 'Raw text</button><button id="qrcodelink" type="button" ' +
  724. 'data-toggle="modal" data-target="#qrcodemodal" ' +
  725. 'class="hidden btn btn-warning navbar-btn"><span ' +
  726. 'class="glyphicon glyphicon-qrcode" aria-hidden="true">' +
  727. '</span> QR code</button></li></ul></div></nav>'
  728. );
  729. PrivateBin.TopNav.init();
  730. PrivateBin.TopNav.hideAllButtons();
  731. assert.ok($('#newbutton').hasClass('hidden'));
  732. assert.ok($('#clonebutton').hasClass('hidden'));
  733. assert.ok($('#rawtextbutton').hasClass('hidden'));
  734. assert.ok($('#qrcodelink').hasClass('hidden'));
  735. cleanup();
  736. }
  737. );
  738. });
  739. describe('rawText', function () {
  740. before(function () {
  741. cleanup();
  742. });
  743. // TODO triggers error messages in jsDOM since version 12, but passes
  744. it(
  745. 'displays raw text view correctly',
  746. function () {
  747. const clean = globalThis.cleanup('', {url: 'https://privatebin.net/?0123456789abcdef#1'});
  748. $('body').html('<button id="rawtextbutton"></button>');
  749. const sample = 'example';
  750. PrivateBin.PasteViewer.setText(sample);
  751. PrivateBin.Helper.reset();
  752. PrivateBin.TopNav.init();
  753. $('#rawtextbutton').click();
  754. assert.strictEqual($('pre').text(), sample);
  755. clean();
  756. }
  757. );
  758. });
  759. });