TopNav.js 32 KB

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