DiscussionViewer.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. 'use strict';
  2. var common = require('../common');
  3. describe('DiscussionViewer', function () {
  4. describe('handleNotification, prepareNewDiscussion, addComment, finishDiscussion, getReplyMessage, getReplyNickname, getReplyCommentId & highlightComment', function () {
  5. this.timeout(30000);
  6. before(function () {
  7. cleanup();
  8. });
  9. jsc.property(
  10. 'displays & hides comments as requested',
  11. jsc.array(
  12. jsc.record({
  13. idArray: jsc.nearray(common.jscAlnumString()),
  14. parentidArray: jsc.nearray(common.jscAlnumString()),
  15. data: jsc.string,
  16. meta: jsc.record({
  17. nickname: jsc.string,
  18. postdate: jsc.nat,
  19. vizhash: jsc.string
  20. })
  21. })
  22. ),
  23. 'nat',
  24. 'bool',
  25. 'string',
  26. 'string',
  27. jsc.elements(['loading', 'danger', 'other']),
  28. 'nestring',
  29. function (comments, commentKey, fadeOut, nickname, message, alertType, alert) {
  30. var clean = jsdom(),
  31. results = [];
  32. $('body').html(
  33. '<div id="discussion"><h4>Discussion</h4>' +
  34. '<div id="commentcontainer"></div></div><div id="templates">' +
  35. '<article id="commenttemplate" class="comment">' +
  36. '<div class="commentmeta"><span class="nickname">name</span>' +
  37. '<span class="commentdate">0000-00-00</span></div>' +
  38. '<div class="commentdata">c</div>' +
  39. '<button class="btn btn-default btn-sm">Reply</button>' +
  40. '</article><p id="commenttailtemplate" class="comment">' +
  41. '<button class="btn btn-default btn-sm">Add comment</button>' +
  42. '</p><div id="replytemplate" class="reply hidden">' +
  43. '<input type="text" id="nickname" class="form-control" ' +
  44. 'title="Optional nickname…" placeholder="Optional ' +
  45. 'nickname…" /><textarea id="replymessage" ' +
  46. 'class="replymessage form-control" cols="80" rows="7">' +
  47. '</textarea><br /><div id="replystatus" role="alert" ' +
  48. 'class="statusmessage hidden alert"><span class="glyphicon" ' +
  49. 'aria-hidden="true"></span> </div><button id="replybutton" ' +
  50. 'class="btn btn-default btn-sm">Post comment</button></div></div>'
  51. );
  52. $.PrivateBin.Model.init();
  53. $.PrivateBin.DiscussionViewer.init();
  54. results.push(
  55. !$('#discussion').hasClass('hidden')
  56. );
  57. $.PrivateBin.DiscussionViewer.prepareNewDiscussion();
  58. results.push(
  59. $('#discussion').hasClass('hidden')
  60. );
  61. comments.forEach(function (comment) {
  62. comment.id = comment.idArray.join('');
  63. comment.parentid = comment.parentidArray.join('');
  64. $.PrivateBin.DiscussionViewer.addComment($.PrivateBin.Helper.CommentFactory(comment), comment.data, comment.meta.nickname);
  65. });
  66. results.push(
  67. $('#discussion').hasClass('hidden')
  68. );
  69. $.PrivateBin.DiscussionViewer.finishDiscussion();
  70. results.push(
  71. !$('#discussion').hasClass('hidden') &&
  72. comments.length + 1 >= $('#commentcontainer').children().length
  73. );
  74. if (comments.length > 0) {
  75. if (commentKey >= comments.length) {
  76. commentKey = commentKey % comments.length;
  77. }
  78. $.PrivateBin.DiscussionViewer.highlightComment(comments[commentKey].id, fadeOut);
  79. results.push(
  80. $('#comment_' + comments[commentKey].id).hasClass('highlight')
  81. );
  82. }
  83. $('#commentcontainer').find('button')[0].click();
  84. results.push(
  85. !$('#reply').hasClass('hidden')
  86. );
  87. $('#reply #nickname').val(nickname);
  88. $('#reply #replymessage').val(message);
  89. $.PrivateBin.DiscussionViewer.getReplyCommentId();
  90. results.push(
  91. $.PrivateBin.DiscussionViewer.getReplyNickname() === $('#reply #nickname').val() &&
  92. $.PrivateBin.DiscussionViewer.getReplyMessage() === $('#reply #replymessage').val()
  93. );
  94. var notificationResult = $.PrivateBin.DiscussionViewer.handleNotification(alertType === 'other' ? alert : alertType);
  95. if (alertType === 'loading') {
  96. results.push(notificationResult === false);
  97. } else {
  98. results.push(
  99. alertType === 'danger' ? (
  100. notificationResult.hasClass('alert-danger') &&
  101. !notificationResult.hasClass('alert-info')
  102. ) : (
  103. !notificationResult.hasClass('alert-danger') &&
  104. notificationResult.hasClass('alert-info')
  105. )
  106. );
  107. }
  108. clean();
  109. return results.every(element => element);
  110. }
  111. );
  112. });
  113. });