spoilers.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. (function (root, factory) {
  2. define([
  3. "jasmine",
  4. "utils",
  5. "mock",
  6. "converse-core",
  7. "test-utils"
  8. ], factory);
  9. } (this, function (jasmine, utils, mock, converse, test_utils) {
  10. var _ = converse.env._;
  11. var Strophe = converse.env.Strophe;
  12. var $msg = converse.env.$msg;
  13. var $pres = converse.env.$pres;
  14. var u = converse.env.utils;
  15. return describe("A spoiler message", function () {
  16. it("can be received with a hint",
  17. mock.initConverseWithPromises(
  18. null, ['rosterGroupsFetched'], {},
  19. function (done, _converse) {
  20. test_utils.createContacts(_converse, 'current');
  21. var sender_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost';
  22. /* <message to='romeo@montague.net/orchard' from='juliet@capulet.net/balcony' id='spoiler2'>
  23. * <body>And at the end of the story, both of them die! It is so tragic!</body>
  24. * <spoiler xmlns='urn:xmpp:spoiler:0'>Love story end</spoiler>
  25. * </message>
  26. */
  27. var spoiler_hint = "Love story end"
  28. var spoiler = "And at the end of the story, both of them die! It is so tragic!";
  29. var msg = $msg({
  30. 'xmlns': 'jabber:client',
  31. 'to': _converse.bare_jid,
  32. 'from': sender_jid,
  33. 'type': 'chat'
  34. }).c('body').t(spoiler).up()
  35. .c('spoiler', {
  36. 'xmlns': 'urn:xmpp:spoiler:0',
  37. }).t(spoiler_hint)
  38. .tree();
  39. _converse.chatboxes.onMessage(msg);
  40. var view = _converse.chatboxviews.get(sender_jid);
  41. return test_utils.waitUntil(() => view.model.vcard.get('fullname') === 'Max Frankfurter')
  42. .then(function () {
  43. expect(view.el.querySelector('.chat-msg-author').textContent).toBe('Max Frankfurter');
  44. var message_content = view.el.querySelector('.chat-msg-text');
  45. expect(message_content.textContent).toBe(spoiler);
  46. var spoiler_hint_el = view.el.querySelector('.spoiler-hint');
  47. expect(spoiler_hint_el.textContent).toBe(spoiler_hint);
  48. done();
  49. });
  50. }));
  51. it("can be received without a hint",
  52. mock.initConverseWithPromises(
  53. null, ['rosterGroupsFetched'], {},
  54. function (done, _converse) {
  55. test_utils.createContacts(_converse, 'current');
  56. var sender_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost';
  57. /* <message to='romeo@montague.net/orchard' from='juliet@capulet.net/balcony' id='spoiler2'>
  58. * <body>And at the end of the story, both of them die! It is so tragic!</body>
  59. * <spoiler xmlns='urn:xmpp:spoiler:0'>Love story end</spoiler>
  60. * </message>
  61. */
  62. var spoiler = "And at the end of the story, both of them die! It is so tragic!";
  63. var msg = $msg({
  64. 'xmlns': 'jabber:client',
  65. 'to': _converse.bare_jid,
  66. 'from': sender_jid,
  67. 'type': 'chat'
  68. }).c('body').t(spoiler).up()
  69. .c('spoiler', {
  70. 'xmlns': 'urn:xmpp:spoiler:0',
  71. }).tree();
  72. _converse.chatboxes.onMessage(msg);
  73. var view = _converse.chatboxviews.get(sender_jid);
  74. return test_utils.waitUntil(() => view.model.vcard.get('fullname') === 'Max Frankfurter')
  75. .then(function () {
  76. expect(_.includes(view.el.querySelector('.chat-msg-author').textContent, 'Max Frankfurter')).toBeTruthy();
  77. var message_content = view.el.querySelector('.chat-msg-text');
  78. expect(message_content.textContent).toBe(spoiler);
  79. var spoiler_hint_el = view.el.querySelector('.spoiler-hint');
  80. expect(spoiler_hint_el.textContent).toBe('');
  81. done();
  82. }).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
  83. }));
  84. it("can be sent without a hint",
  85. mock.initConverseWithPromises(
  86. null, ['rosterGroupsFetched'], {},
  87. function (done, _converse) {
  88. test_utils.createContacts(_converse, 'current');
  89. test_utils.openControlBox();
  90. var contact_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost';
  91. // XXX: We need to send a presence from the contact, so that we
  92. // have a resource, that resource is then queried to see
  93. // whether Strophe.NS.SPOILER is supported, in which case
  94. // the spoiler button will appear.
  95. var presence = $pres({
  96. 'from': contact_jid+'/phone',
  97. 'to': 'dummy@localhost'
  98. });
  99. _converse.connection._dataRecv(test_utils.createRequest(presence));
  100. test_utils.openChatBoxFor(_converse, contact_jid);
  101. test_utils.waitUntilDiscoConfirmed(_converse, contact_jid+'/phone', [], [Strophe.NS.SPOILER]).then(function () {
  102. var view = _converse.chatboxviews.get(contact_jid);
  103. spyOn(view, 'onMessageSubmitted').and.callThrough();
  104. spyOn(_converse.connection, 'send');
  105. var spoiler_toggle = view.el.querySelector('.toggle-compose-spoiler');
  106. spoiler_toggle.click();
  107. var textarea = view.el.querySelector('.chat-textarea');
  108. textarea.value = 'This is the spoiler';
  109. view.keyPressed({
  110. target: textarea,
  111. preventDefault: _.noop,
  112. keyCode: 13
  113. });
  114. expect(view.onMessageSubmitted).toHaveBeenCalled();
  115. /* Test the XML stanza
  116. *
  117. * <message from="dummy@localhost/resource"
  118. * to="max.frankfurter@localhost"
  119. * type="chat"
  120. * id="4547c38b-d98b-45a5-8f44-b4004dbc335e"
  121. * xmlns="jabber:client">
  122. * <body>This is the spoiler</body>
  123. * <active xmlns="http://jabber.org/protocol/chatstates"/>
  124. * <spoiler xmlns="urn:xmpp:spoiler:0"/>
  125. * </message>"
  126. */
  127. var stanza = _converse.connection.send.calls.argsFor(0)[0].tree();
  128. var spoiler_el = stanza.querySelector('spoiler[xmlns="urn:xmpp:spoiler:0"]');
  129. expect(_.isNull(spoiler_el)).toBeFalsy();
  130. expect(spoiler_el.textContent).toBe('');
  131. var body_el = stanza.querySelector('body');
  132. expect(body_el.textContent).toBe('This is the spoiler');
  133. /* Test the HTML spoiler message */
  134. expect(view.el.querySelector('.chat-msg-author').textContent).toBe('Max Mustermann');
  135. var spoiler_msg_el = view.el.querySelector('.chat-msg-text.spoiler');
  136. expect(spoiler_msg_el.textContent).toBe('This is the spoiler');
  137. expect(_.includes(spoiler_msg_el.classList, 'collapsed')).toBeTruthy();
  138. spoiler_toggle = view.el.querySelector('.spoiler-toggle');
  139. expect(spoiler_toggle.textContent).toBe('Show more');
  140. spoiler_toggle.click();
  141. expect(_.includes(spoiler_msg_el.classList, 'collapsed')).toBeFalsy();
  142. expect(spoiler_toggle.textContent).toBe('Show less');
  143. spoiler_toggle.click();
  144. expect(_.includes(spoiler_msg_el.classList, 'collapsed')).toBeTruthy();
  145. done();
  146. }).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
  147. }));
  148. it("can be sent with a hint",
  149. mock.initConverseWithPromises(
  150. null, ['rosterGroupsFetched'], {},
  151. function (done, _converse) {
  152. test_utils.createContacts(_converse, 'current');
  153. test_utils.openControlBox();
  154. var contact_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost';
  155. // XXX: We need to send a presence from the contact, so that we
  156. // have a resource, that resource is then queried to see
  157. // whether Strophe.NS.SPOILER is supported, in which case
  158. // the spoiler button will appear.
  159. var presence = $pres({
  160. 'from': contact_jid+'/phone',
  161. 'to': 'dummy@localhost'
  162. });
  163. _converse.connection._dataRecv(test_utils.createRequest(presence));
  164. test_utils.openChatBoxFor(_converse, contact_jid);
  165. test_utils.waitUntilDiscoConfirmed(_converse, contact_jid+'/phone', [], [Strophe.NS.SPOILER]).then(function () {
  166. var view = _converse.chatboxviews.get(contact_jid);
  167. var spoiler_toggle = view.el.querySelector('.toggle-compose-spoiler');
  168. spoiler_toggle.click();
  169. spyOn(view, 'onMessageSubmitted').and.callThrough();
  170. spyOn(_converse.connection, 'send');
  171. var textarea = view.el.querySelector('.chat-textarea');
  172. textarea.value = 'This is the spoiler';
  173. var hint_input = view.el.querySelector('.spoiler-hint');
  174. hint_input.value = 'This is the hint';
  175. view.keyPressed({
  176. target: textarea,
  177. preventDefault: _.noop,
  178. keyCode: 13
  179. });
  180. expect(view.onMessageSubmitted).toHaveBeenCalled();
  181. /* Test the XML stanza
  182. *
  183. * <message from="dummy@localhost/resource"
  184. * to="max.frankfurter@localhost"
  185. * type="chat"
  186. * id="4547c38b-d98b-45a5-8f44-b4004dbc335e"
  187. * xmlns="jabber:client">
  188. * <body>This is the spoiler</body>
  189. * <active xmlns="http://jabber.org/protocol/chatstates"/>
  190. * <spoiler xmlns="urn:xmpp:spoiler:0">This is the hint</spoiler>
  191. * </message>"
  192. */
  193. var stanza = _converse.connection.send.calls.argsFor(0)[0].tree();
  194. var spoiler_el = stanza.querySelector('spoiler[xmlns="urn:xmpp:spoiler:0"]');
  195. expect(_.isNull(spoiler_el)).toBeFalsy();
  196. expect(spoiler_el.textContent).toBe('This is the hint');
  197. var body_el = stanza.querySelector('body');
  198. expect(body_el.textContent).toBe('This is the spoiler');
  199. /* Test the HTML spoiler message */
  200. expect(view.el.querySelector('.chat-msg-author').textContent).toBe('Max Mustermann');
  201. var spoiler_msg_el = view.el.querySelector('.chat-msg-text.spoiler');
  202. expect(spoiler_msg_el.textContent).toBe('This is the spoiler');
  203. expect(_.includes(spoiler_msg_el.classList, 'collapsed')).toBeTruthy();
  204. spoiler_toggle = view.el.querySelector('.spoiler-toggle');
  205. expect(spoiler_toggle.textContent).toBe('Show more');
  206. spoiler_toggle.click();
  207. expect(_.includes(spoiler_msg_el.classList, 'collapsed')).toBeFalsy();
  208. expect(spoiler_toggle.textContent).toBe('Show less');
  209. spoiler_toggle.click();
  210. expect(_.includes(spoiler_msg_el.classList, 'collapsed')).toBeTruthy();
  211. done();
  212. });
  213. }));
  214. });
  215. }));