TopNav.js 32 KB

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