TopNav.js 30 KB

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