TopNav.js 32 KB

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