me-messages.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*global mock, converse */
  2. const { u, sizzle, $msg } = converse.env;
  3. describe("A Groupchat Message", function () {
  4. fit("supports the /me command",
  5. mock.initConverse(
  6. ['rosterGroupsFetched'], {},
  7. async function (done, _converse) {
  8. await mock.waitUntilDiscoConfirmed(_converse, 'montague.lit', [], ['vcard-temp']);
  9. await u.waitUntil(() => _converse.xmppstatus.vcard.get('fullname'));
  10. await mock.waitForRoster(_converse, 'current');
  11. await mock.openAndEnterChatRoom(_converse, 'lounge@montague.lit', 'romeo');
  12. const view = _converse.chatboxviews.get('lounge@montague.lit');
  13. if (!view.el.querySelectorAll('.chat-area').length) {
  14. view.renderChatArea();
  15. }
  16. let message = '/me is tired';
  17. const nick = mock.chatroom_names[0];
  18. let msg = $msg({
  19. 'from': 'lounge@montague.lit/'+nick,
  20. 'id': u.getUniqueId(),
  21. 'to': 'romeo@montague.lit',
  22. 'type': 'groupchat'
  23. }).c('body').t(message).tree();
  24. await view.model.handleMessageStanza(msg);
  25. await u.waitUntil(() => sizzle('.chat-msg:last .chat-msg__text', view.content).pop());
  26. expect(view.el.querySelector('.chat-msg__author').textContent.includes('**Dyon van de Wege')).toBeTruthy();
  27. expect(view.el.querySelector('.chat-msg__text').textContent.trim()).toBe('is tired');
  28. message = '/me is as well';
  29. msg = $msg({
  30. from: 'lounge@montague.lit/Romeo Montague',
  31. id: u.getUniqueId(),
  32. to: 'romeo@montague.lit',
  33. type: 'groupchat'
  34. }).c('body').t(message).tree();
  35. await view.model.handleMessageStanza(msg);
  36. await u.waitUntil(() => view.el.querySelectorAll('.chat-msg').length === 2);
  37. expect(sizzle('.chat-msg__author:last', view.el).pop().textContent.includes('**Romeo Montague')).toBeTruthy();
  38. expect(sizzle('.chat-msg__text:last', view.el).pop().textContent.trim()).toBe('is as well');
  39. // Check rendering of a mention inside a me message
  40. const msg_text = "/me mentions romeo";
  41. msg = $msg({
  42. from: 'lounge@montague.lit/gibson',
  43. id: u.getUniqueId(),
  44. to: 'romeo@montague.lit',
  45. type: 'groupchat'
  46. }).c('body').t(msg_text).up()
  47. .c('reference', {'xmlns':'urn:xmpp:reference:0', 'begin':'13', 'end':'19', 'type':'mention', 'uri':'xmpp:romeo@montague.lit'}).nodeTree;
  48. await view.model.handleMessageStanza(msg);
  49. await u.waitUntil(() => view.el.querySelectorAll('.chat-msg__text').length === 3);
  50. await u.waitUntil(() => sizzle('.chat-msg__text:last', view.el).pop().innerHTML.replace(/<!---->/g, '') ===
  51. 'mentions <span class="mention mention--self badge badge-info">romeo</span>');
  52. done();
  53. }));
  54. });
  55. describe("A Message", function () {
  56. it("supports the /me command", mock.initConverse(['rosterGroupsFetched'], {}, async function (done, _converse) {
  57. await mock.waitForRoster(_converse, 'current');
  58. await mock.waitUntilDiscoConfirmed(_converse, 'montague.lit', [], ['vcard-temp']);
  59. await u.waitUntil(() => _converse.xmppstatus.vcard.get('fullname'));
  60. await mock.openControlBox(_converse);
  61. expect(_converse.chatboxes.length).toEqual(1);
  62. const sender_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@montague.lit';
  63. let message = '/me is tired';
  64. const msg = $msg({
  65. from: sender_jid,
  66. to: _converse.connection.jid,
  67. type: 'chat',
  68. id: u.getUniqueId()
  69. }).c('body').t(message).up()
  70. .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
  71. await _converse.handleMessageStanza(msg);
  72. const view = _converse.chatboxviews.get(sender_jid);
  73. await u.waitUntil(() => view.el.querySelector('.chat-msg__text'));
  74. expect(view.el.querySelectorAll('.chat-msg--action').length).toBe(1);
  75. expect(view.el.querySelector('.chat-msg__author').textContent.includes('**Mercutio')).toBeTruthy();
  76. expect(view.el.querySelector('.chat-msg__text').textContent).toBe('is tired');
  77. message = '/me is as well';
  78. await mock.sendMessage(view, message);
  79. expect(view.el.querySelectorAll('.chat-msg--action').length).toBe(2);
  80. await u.waitUntil(() => sizzle('.chat-msg__author:last', view.el).pop().textContent.trim() === '**Romeo Montague');
  81. const last_el = sizzle('.chat-msg__text:last', view.el).pop();
  82. await u.waitUntil(() => last_el.textContent === 'is as well');
  83. expect(u.hasClass('chat-msg--followup', last_el)).toBe(false);
  84. // Check that /me messages after a normal message don't
  85. // get the 'chat-msg--followup' class.
  86. message = 'This a normal message';
  87. await mock.sendMessage(view, message);
  88. const msg_txt_sel = 'converse-chat-message:last-child .chat-msg__text';
  89. await u.waitUntil(() => view.el.querySelector(msg_txt_sel).textContent.trim() === message);
  90. let el = view.el.querySelector('converse-chat-message:last-child .chat-msg__body');
  91. expect(u.hasClass('chat-msg--followup', el)).toBeFalsy();
  92. message = '/me wrote a 3rd person message';
  93. await mock.sendMessage(view, message);
  94. await u.waitUntil(() => view.el.querySelector(msg_txt_sel).textContent.trim() === message.replace('/me ', ''));
  95. el = view.el.querySelector('converse-chat-message:last-child .chat-msg__body');
  96. expect(view.el.querySelectorAll('.chat-msg--action').length).toBe(3);
  97. expect(sizzle('.chat-msg__text:last', view.el).pop().textContent).toBe('wrote a 3rd person message');
  98. expect(u.isVisible(sizzle('.chat-msg__author:last', view.el).pop())).toBeTruthy();
  99. done();
  100. }));
  101. });