1
0

TopNav.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673
  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">Send</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. $('.navbar-toggle').trigger('click');
  290. results.push(
  291. !$('.navbar-toggle').hasClass('collapsed') &&
  292. $('#navbar').attr('aria-expanded') == 'true'
  293. );
  294. $.PrivateBin.TopNav.collapseBar();
  295. results.push(
  296. $('.navbar-toggle').hasClass('collapsed') &&
  297. $('#navbar').attr('aria-expanded') == 'false'
  298. );
  299. clean();
  300. assert.ok(results.every(element => element));
  301. }
  302. );
  303. });
  304. describe('resetInput', function () {
  305. before(function () {
  306. cleanup();
  307. });
  308. it(
  309. 'reset inputs to defaults (options off)',
  310. function () {
  311. var results = [];
  312. $('body').html(
  313. '<nav><div id="navbar"><ul><li id="burnafterreadingoption" ' +
  314. 'class="hidden"><label><input type="checkbox" ' +
  315. 'id="burnafterreading" name="burnafterreading" /> ' +
  316. 'Burn after reading</label></li><li id="opendiscussionoption" ' +
  317. 'class="hidden"><label><input type="checkbox" ' +
  318. 'id="opendiscussion" name="opendiscussion" /> ' +
  319. 'Open discussion</label></li></ul></div></nav>'
  320. );
  321. $.PrivateBin.TopNav.init();
  322. results.push(
  323. !$.PrivateBin.TopNav.getBurnAfterReading()
  324. );
  325. results.push(
  326. !$.PrivateBin.TopNav.getOpenDiscussion()
  327. );
  328. $('#burnafterreading').attr('checked', 'checked');
  329. $('#opendiscussion').attr('checked', 'checked');
  330. results.push(
  331. $.PrivateBin.TopNav.getBurnAfterReading()
  332. );
  333. results.push(
  334. $.PrivateBin.TopNav.getOpenDiscussion()
  335. );
  336. $.PrivateBin.TopNav.resetInput();
  337. results.push(
  338. !$.PrivateBin.TopNav.getBurnAfterReading()
  339. );
  340. results.push(
  341. !$.PrivateBin.TopNav.getOpenDiscussion()
  342. );
  343. cleanup();
  344. assert.ok(results.every(element => element));
  345. }
  346. );
  347. it(
  348. 'reset inputs to defaults (burnafterreading on)',
  349. function () {
  350. var results = [];
  351. $('body').html(
  352. '<nav><div id="navbar"><ul><li id="burnafterreadingoption" ' +
  353. 'class="hidden"><label><input type="checkbox" ' +
  354. 'id="burnafterreading" name="burnafterreading" checked="checked" /> ' +
  355. 'Burn after reading</label></li><li id="opendiscussionoption" ' +
  356. 'class="hidden"><label><input type="checkbox" ' +
  357. 'id="opendiscussion" name="opendiscussion" checked="checked" /> ' +
  358. 'Open discussion</label></li></ul></div></nav>'
  359. );
  360. $.PrivateBin.TopNav.init();
  361. results.push(
  362. $.PrivateBin.TopNav.getBurnAfterReading()
  363. );
  364. results.push(
  365. !$.PrivateBin.TopNav.getOpenDiscussion()
  366. );
  367. $('#burnafterreading').removeAttr('checked');
  368. results.push(
  369. !$.PrivateBin.TopNav.getBurnAfterReading()
  370. );
  371. results.push(
  372. !$.PrivateBin.TopNav.getOpenDiscussion()
  373. );
  374. $.PrivateBin.TopNav.resetInput();
  375. results.push(
  376. $.PrivateBin.TopNav.getBurnAfterReading()
  377. );
  378. results.push(
  379. !$.PrivateBin.TopNav.getOpenDiscussion()
  380. );
  381. cleanup();
  382. assert.ok(results.every(element => element));
  383. }
  384. );
  385. it(
  386. 'reset inputs to defaults (opendiscussion on)',
  387. function () {
  388. var results = [];
  389. $('body').html(
  390. '<nav><div id="navbar"><ul><li id="burnafterreadingoption" ' +
  391. 'class="hidden"><label><input type="checkbox" ' +
  392. 'id="burnafterreading" name="burnafterreading" /> ' +
  393. 'Burn after reading</label></li><li id="opendiscussionoption" ' +
  394. 'class="hidden"><label><input type="checkbox" ' +
  395. 'id="opendiscussion" name="opendiscussion" checked="checked" /> ' +
  396. 'Open discussion</label></li></ul></div></nav>'
  397. );
  398. $.PrivateBin.TopNav.init();
  399. results.push(
  400. !$.PrivateBin.TopNav.getBurnAfterReading()
  401. );
  402. results.push(
  403. $.PrivateBin.TopNav.getOpenDiscussion()
  404. );
  405. $('#opendiscussion').removeAttr('checked');
  406. $('#burnafterreading').prop('checked', true);
  407. results.push(
  408. $.PrivateBin.TopNav.getBurnAfterReading()
  409. );
  410. results.push(
  411. !$.PrivateBin.TopNav.getOpenDiscussion()
  412. );
  413. $.PrivateBin.TopNav.resetInput();
  414. results.push(
  415. !$.PrivateBin.TopNav.getBurnAfterReading()
  416. );
  417. results.push(
  418. $.PrivateBin.TopNav.getOpenDiscussion()
  419. );
  420. cleanup();
  421. assert.ok(results.every(element => element));
  422. }
  423. );
  424. });
  425. describe('getExpiration', function () {
  426. before(function () {
  427. cleanup();
  428. });
  429. it(
  430. 'returns the currently selected expiration date',
  431. function () {
  432. $.PrivateBin.TopNav.init();
  433. assert.ok($.PrivateBin.TopNav.getExpiration() === null);
  434. }
  435. );
  436. });
  437. describe('getFileList', function () {
  438. before(function () {
  439. cleanup();
  440. });
  441. var File = window.File,
  442. FileList = window.FileList,
  443. path = require('path'),
  444. mime = require('mime-types');
  445. // mocking file input as per https://github.com/jsdom/jsdom/issues/1272
  446. function createFile(file_path) {
  447. var file = fs.statSync(file_path),
  448. lastModified = file.mtimeMs,
  449. size = file.size;
  450. return new File(
  451. [new fs.readFileSync(file_path)],
  452. path.basename(file_path),
  453. {
  454. lastModified,
  455. type: mime.lookup(file_path) || '',
  456. }
  457. )
  458. }
  459. function addFileList(input, file_paths) {
  460. if (typeof file_paths === 'string')
  461. file_paths = [file_paths]
  462. else if (!Array.isArray(file_paths)) {
  463. throw new Error('file_paths needs to be a file path string or an Array of file path strings')
  464. }
  465. const file_list = file_paths.map(fp => createFile(fp))
  466. file_list.__proto__ = Object.create(FileList.prototype)
  467. Object.defineProperty(input, 'files', {
  468. value: file_list,
  469. writeable: false,
  470. })
  471. return input
  472. }
  473. it(
  474. 'returns the selected files',
  475. function () {
  476. var results = [];
  477. $('body').html(
  478. '<nav><div id="navbar"><ul><li id="attach" class="hidden ' +
  479. 'dropdown"><a href="#" class="dropdown-toggle" data-' +
  480. 'toggle="dropdown" role="button" aria-haspopup="true" ' +
  481. 'aria-expanded="false">Attach a file <span class="caret">' +
  482. '</span></a><ul class="dropdown-menu"><li id="filewrap">' +
  483. '<div><input type="file" id="file" name="file" /></div>' +
  484. '</li><li id="customattachment" class="hidden"></li><li>' +
  485. '<a id="fileremovebutton" href="#">Remove attachment</a>' +
  486. '</li></ul></li></ul></div></nav>'
  487. );
  488. $.PrivateBin.TopNav.init();
  489. results.push(
  490. $.PrivateBin.TopNav.getFileList() === null
  491. );
  492. addFileList($('#file')[0], [
  493. '../img/logo.svg',
  494. '../img/busy.gif'
  495. ]);
  496. var files = $.PrivateBin.TopNav.getFileList();
  497. results.push(
  498. files[0].name === 'logo.svg' &&
  499. files[1].name === 'busy.gif'
  500. );
  501. cleanup();
  502. assert.ok(results.every(element => element));
  503. }
  504. );
  505. });
  506. describe('getBurnAfterReading', function () {
  507. before(function () {
  508. cleanup();
  509. });
  510. it(
  511. 'returns if the burn-after-reading checkbox was ticked',
  512. function () {
  513. var results = [];
  514. $('body').html(
  515. '<nav><div id="navbar"><ul><li id="burnafterreadingoption" ' +
  516. 'class="hidden"><label><input type="checkbox" ' +
  517. 'id="burnafterreading" name="burnafterreading" /> ' +
  518. 'Burn after reading</label></li></ul></div></nav>'
  519. );
  520. $.PrivateBin.TopNav.init();
  521. results.push(
  522. !$.PrivateBin.TopNav.getBurnAfterReading()
  523. );
  524. $('#burnafterreading').attr('checked', 'checked');
  525. results.push(
  526. $.PrivateBin.TopNav.getBurnAfterReading()
  527. );
  528. $('#burnafterreading').removeAttr('checked');
  529. results.push(
  530. !$.PrivateBin.TopNav.getBurnAfterReading()
  531. );
  532. cleanup();
  533. assert.ok(results.every(element => element));
  534. }
  535. );
  536. });
  537. describe('getOpenDiscussion', function () {
  538. before(function () {
  539. cleanup();
  540. });
  541. it(
  542. 'returns if the open-discussion checkbox was ticked',
  543. function () {
  544. var results = [];
  545. $('body').html(
  546. '<nav><div id="navbar"><ul><li id="opendiscussionoption" ' +
  547. 'class="hidden"><label><input type="checkbox" ' +
  548. 'id="opendiscussion" name="opendiscussion" /> ' +
  549. 'Open discussion</label></li></ul></div></nav>'
  550. );
  551. $.PrivateBin.TopNav.init();
  552. results.push(
  553. !$.PrivateBin.TopNav.getOpenDiscussion()
  554. );
  555. $('#opendiscussion').attr('checked', 'checked');
  556. results.push(
  557. $.PrivateBin.TopNav.getOpenDiscussion()
  558. );
  559. $('#opendiscussion').removeAttr('checked');
  560. results.push(
  561. !$.PrivateBin.TopNav.getOpenDiscussion()
  562. );
  563. cleanup();
  564. assert.ok(results.every(element => element));
  565. }
  566. );
  567. });
  568. describe('getPassword', function () {
  569. before(function () {
  570. cleanup();
  571. });
  572. jsc.property(
  573. 'returns the contents of the password input',
  574. 'string',
  575. function (password) {
  576. password = password.replace(/\r+/g, '');
  577. var results = [];
  578. $('body').html(
  579. '<nav><div id="navbar"><ul><li><div id="password" ' +
  580. 'class="navbar-form hidden"><input type="password" ' +
  581. 'id="passwordinput" placeholder="Password (recommended)" ' +
  582. 'class="form-control" size="23" /></div></li></ul></div></nav>'
  583. );
  584. $.PrivateBin.TopNav.init();
  585. results.push(
  586. $.PrivateBin.TopNav.getPassword() === ''
  587. );
  588. $('#passwordinput').val(password);
  589. results.push(
  590. $.PrivateBin.TopNav.getPassword() === password
  591. );
  592. $('#passwordinput').val('');
  593. results.push(
  594. $.PrivateBin.TopNav.getPassword() === ''
  595. );
  596. cleanup();
  597. return results.every(element => element);
  598. }
  599. );
  600. });
  601. describe('getCustomAttachment', function () {
  602. before(function () {
  603. cleanup();
  604. });
  605. it(
  606. 'returns the custom attachment element',
  607. function () {
  608. var results = [];
  609. $('body').html(
  610. '<nav><div id="navbar"><ul><li id="attach" class="hidden ' +
  611. 'dropdown"><a href="#" class="dropdown-toggle" data-' +
  612. 'toggle="dropdown" role="button" aria-haspopup="true" ' +
  613. 'aria-expanded="false">Attach a file <span class="caret">' +
  614. '</span></a><ul class="dropdown-menu"><li id="filewrap">' +
  615. '<div><input type="file" id="file" name="file" /></div>' +
  616. '</li><li id="customattachment" class="hidden"></li><li>' +
  617. '<a id="fileremovebutton" href="#">Remove attachment</a>' +
  618. '</li></ul></li></ul></div></nav>'
  619. );
  620. $.PrivateBin.TopNav.init();
  621. results.push(
  622. !$.PrivateBin.TopNav.getCustomAttachment().hasClass('test')
  623. );
  624. $('#customattachment').addClass('test');
  625. results.push(
  626. $.PrivateBin.TopNav.getCustomAttachment().hasClass('test')
  627. );
  628. cleanup();
  629. assert.ok(results.every(element => element));
  630. }
  631. );
  632. });
  633. });