headline.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. (function (root, factory) {
  2. define([
  3. "jasmine",
  4. "mock",
  5. "test-utils"
  6. ], factory);
  7. } (this, function (jasmine, mock, test_utils) {
  8. "use strict";
  9. const $msg = converse.env.$msg,
  10. _ = converse.env._,
  11. u = converse.env.utils;
  12. describe("A headlines box", function () {
  13. it("will not open nor display non-headline messages",
  14. mock.initConverse(
  15. ['rosterGroupsFetched', 'chatBoxesFetched'], {}, function (done, _converse) {
  16. /* XMPP spam message:
  17. *
  18. * <message xmlns="jabber:client"
  19. * to="romeo@montague.lit"
  20. * type="chat"
  21. * from="gapowa20102106@rds-rostov.ru/Adium">
  22. * <nick xmlns="http://jabber.org/protocol/nick">-wwdmz</nick>
  23. * <body>SORRY FOR THIS ADVERT</body
  24. * </message
  25. */
  26. sinon.spy(u, 'isHeadlineMessage');
  27. const stanza = $msg({
  28. 'xmlns': 'jabber:client',
  29. 'to': 'romeo@montague.lit',
  30. 'type': 'chat',
  31. 'from': 'gapowa20102106@rds-rostov.ru/Adium',
  32. })
  33. .c('nick', {'xmlns': "http://jabber.org/protocol/nick"}).t("-wwdmz").up()
  34. .c('body').t('SORRY FOR THIS ADVERT');
  35. _converse.connection._dataRecv(test_utils.createRequest(stanza));
  36. expect(u.isHeadlineMessage.called).toBeTruthy();
  37. expect(u.isHeadlineMessage.returned(false)).toBeTruthy();
  38. expect(_converse.api.headlines.get().length === 0);
  39. u.isHeadlineMessage.restore();
  40. done();
  41. }));
  42. it("will open and display headline messages", mock.initConverse(
  43. ['rosterGroupsFetched'], {}, async function (done, _converse) {
  44. /* <message from='notify.example.com'
  45. * to='romeo@im.example.com'
  46. * type='headline'
  47. * xml:lang='en'>
  48. * <subject>SIEVE</subject>
  49. * <body>&lt;juliet@example.com&gt; You got mail.</body>
  50. * <x xmlns='jabber:x:oob'>
  51. * <url>
  52. * imap://romeo@example.com/INBOX;UIDVALIDITY=385759043/;UID=18
  53. * </url>
  54. * </x>
  55. * </message>
  56. */
  57. sinon.spy(u, 'isHeadlineMessage');
  58. const stanza = $msg({
  59. 'type': 'headline',
  60. 'from': 'notify.example.com',
  61. 'to': 'romeo@montague.lit',
  62. 'xml:lang': 'en'
  63. })
  64. .c('subject').t('SIEVE').up()
  65. .c('body').t('&lt;juliet@example.com&gt; You got mail.').up()
  66. .c('x', {'xmlns': 'jabber:x:oob'})
  67. .c('url').t('imap://romeo@example.com/INBOX;UIDVALIDITY=385759043/;UID=18');
  68. _converse.connection._dataRecv(test_utils.createRequest(stanza));
  69. await u.waitUntil(() => _converse.chatboxviews.keys().includes('notify.example.com'));
  70. expect(u.isHeadlineMessage.called).toBeTruthy();
  71. expect(u.isHeadlineMessage.returned(true)).toBeTruthy();
  72. u.isHeadlineMessage.restore(); // unwraps
  73. const view = _converse.chatboxviews.get('notify.example.com');
  74. expect(view.model.get('show_avatar')).toBeFalsy();
  75. expect(view.el.querySelector('img.avatar')).toBe(null);
  76. done();
  77. }));
  78. it("will show headline messages in the controlbox", mock.initConverse(
  79. ['rosterGroupsFetched'], {}, async function (done, _converse) {
  80. /* <message from='notify.example.com'
  81. * to='romeo@im.example.com'
  82. * type='headline'
  83. * xml:lang='en'>
  84. * <subject>SIEVE</subject>
  85. * <body>&lt;juliet@example.com&gt; You got mail.</body>
  86. * <x xmlns='jabber:x:oob'>
  87. * <url>
  88. * imap://romeo@example.com/INBOX;UIDVALIDITY=385759043/;UID=18
  89. * </url>
  90. * </x>
  91. * </message>
  92. */
  93. const stanza = $msg({
  94. 'type': 'headline',
  95. 'from': 'notify.example.com',
  96. 'to': 'romeo@montague.lit',
  97. 'xml:lang': 'en'
  98. })
  99. .c('subject').t('SIEVE').up()
  100. .c('body').t('&lt;juliet@example.com&gt; You got mail.').up()
  101. .c('x', {'xmlns': 'jabber:x:oob'})
  102. .c('url').t('imap://romeo@example.com/INBOX;UIDVALIDITY=385759043/;UID=18');
  103. _converse.connection._dataRecv(test_utils.createRequest(stanza));
  104. const view = _converse.chatboxviews.get('controlbox');
  105. await u.waitUntil(() => view.el.querySelectorAll(".open-headline").length);
  106. expect(view.el.querySelectorAll('.open-headline').length).toBe(1);
  107. expect(view.el.querySelector('.open-headline').text).toBe('notify.example.com');
  108. done();
  109. }));
  110. it("will remove headline messages from the controlbox if closed", mock.initConverse(
  111. ['rosterGroupsFetched'], {}, async function (done, _converse) {
  112. await test_utils.openControlBox(_converse);
  113. /* <message from='notify.example.com'
  114. * to='romeo@im.example.com'
  115. * type='headline'
  116. * xml:lang='en'>
  117. * <subject>SIEVE</subject>
  118. * <body>&lt;juliet@example.com&gt; You got mail.</body>
  119. * <x xmlns='jabber:x:oob'>
  120. * <url>
  121. * imap://romeo@example.com/INBOX;UIDVALIDITY=385759043/;UID=18
  122. * </url>
  123. * </x>
  124. * </message>
  125. */
  126. const stanza = $msg({
  127. 'type': 'headline',
  128. 'from': 'notify.example.com',
  129. 'to': 'romeo@montague.lit',
  130. 'xml:lang': 'en'
  131. })
  132. .c('subject').t('SIEVE').up()
  133. .c('body').t('&lt;juliet@example.com&gt; You got mail.').up()
  134. .c('x', {'xmlns': 'jabber:x:oob'})
  135. .c('url').t('imap://romeo@example.com/INBOX;UIDVALIDITY=385759043/;UID=18');
  136. _converse.connection._dataRecv(test_utils.createRequest(stanza));
  137. const cbview = _converse.chatboxviews.get('controlbox');
  138. await u.waitUntil(() => cbview.el.querySelectorAll(".open-headline").length);
  139. const hlview = _converse.chatboxviews.get('notify.example.com');
  140. await u.isVisible(hlview.el);
  141. const close_el = hlview.el.querySelector('.close-chatbox-button');
  142. close_el.click();
  143. await u.waitUntil(() => cbview.el.querySelectorAll(".open-headline").length === 0);
  144. expect(cbview.el.querySelectorAll('.open-headline').length).toBe(0);
  145. done();
  146. }));
  147. it("will not show a headline messages from a full JID if allow_non_roster_messaging is false",
  148. mock.initConverse(
  149. ['rosterGroupsFetched', 'chatBoxesFetched'], {}, function (done, _converse) {
  150. _converse.allow_non_roster_messaging = false;
  151. sinon.spy(u, 'isHeadlineMessage');
  152. const stanza = $msg({
  153. 'type': 'headline',
  154. 'from': 'andre5114@jabber.snc.ru/Spark',
  155. 'to': 'romeo@montague.lit',
  156. 'xml:lang': 'en'
  157. })
  158. .c('nick').t('gpocy').up()
  159. .c('body').t('Здравствуйте друзья');
  160. _converse.connection._dataRecv(test_utils.createRequest(stanza));
  161. expect(_.without('controlbox', _converse.chatboxviews.keys()).length).toBe(0);
  162. expect(u.isHeadlineMessage.called).toBeTruthy();
  163. expect(u.isHeadlineMessage.returned(true)).toBeTruthy();
  164. u.isHeadlineMessage.restore(); // unwraps
  165. done();
  166. }));
  167. });
  168. }));