rai.js 4.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*global mock, converse */
  2. const { Strophe } = converse.env;
  3. const u = converse.env.utils;
  4. // See: https://xmpp.org/rfcs/rfc3921.html
  5. fdescribe("XEP-0437 Room Activity Indicators", function () {
  6. it("will be activated for a MUC that becomes hidden",
  7. mock.initConverse(
  8. ['rosterGroupsFetched'], {'muc_subscribe_to_rai': true, 'view_mode': 'fullscreen'},
  9. async function (done, _converse) {
  10. expect(_converse.session.get('rai_enabled_domains')).toBe(undefined);
  11. const muc_jid = 'lounge@montague.lit';
  12. await mock.openAndEnterChatRoom(_converse, muc_jid, 'romeo');
  13. const view = _converse.api.chatviews.get(muc_jid);
  14. expect(view.model.get('hidden')).toBe(false);
  15. const sent_IQs = _converse.connection.IQ_stanzas;
  16. const iq_get = await u.waitUntil(() => sent_IQs.filter(iq => iq.querySelector(`iq query[xmlns="${Strophe.NS.MAM}"]`)).pop());
  17. const first_msg_id = _converse.connection.getUniqueId();
  18. const last_msg_id = _converse.connection.getUniqueId();
  19. let message = u.toStanza(
  20. `<message xmlns="jabber:client"
  21. to="romeo@montague.lit/orchard"
  22. from="${muc_jid}">
  23. <result xmlns="urn:xmpp:mam:2" queryid="${iq_get.querySelector('query').getAttribute('queryid')}" id="${first_msg_id}">
  24. <forwarded xmlns="urn:xmpp:forward:0">
  25. <delay xmlns="urn:xmpp:delay" stamp="2018-01-09T06:15:23Z"/>
  26. <message from="${muc_jid}/some1" type="groupchat">
  27. <body>1st MAM Message</body>
  28. </message>
  29. </forwarded>
  30. </result>
  31. </message>`);
  32. _converse.connection._dataRecv(mock.createRequest(message));
  33. message = u.toStanza(
  34. `<message xmlns="jabber:client"
  35. to="romeo@montague.lit/orchard"
  36. from="${muc_jid}">
  37. <result xmlns="urn:xmpp:mam:2" queryid="${iq_get.querySelector('query').getAttribute('queryid')}" id="${last_msg_id}">
  38. <forwarded xmlns="urn:xmpp:forward:0">
  39. <delay xmlns="urn:xmpp:delay" stamp="2018-01-09T06:16:23Z"/>
  40. <message from="${muc_jid}/some1" type="groupchat">
  41. <body>2nd MAM Message</body>
  42. </message>
  43. </forwarded>
  44. </result>
  45. </message>`);
  46. _converse.connection._dataRecv(mock.createRequest(message));
  47. const result = u.toStanza(
  48. `<iq type='result' id='${iq_get.getAttribute('id')}'>
  49. <fin xmlns='urn:xmpp:mam:2'>
  50. <set xmlns='http://jabber.org/protocol/rsm'>
  51. <first index='0'>${first_msg_id}</first>
  52. <last>${last_msg_id}</last>
  53. <count>2</count>
  54. </set>
  55. </fin>
  56. </iq>`);
  57. _converse.connection._dataRecv(mock.createRequest(result));
  58. await u.waitUntil(() => view.model.messages.length === 2);
  59. const sent_stanzas = [];
  60. spyOn(_converse.connection, 'send').and.callFake(s => sent_stanzas.push(s?.nodeTree ?? s));
  61. view.model.save({'hidden': true});
  62. await u.waitUntil(() => sent_stanzas.length === 3);
  63. expect(Strophe.serialize(sent_stanzas[0])).toBe(
  64. `<message from="${_converse.jid}" id="${sent_stanzas[0].getAttribute('id')}" to="lounge@montague.lit" type="groupchat" xmlns="jabber:client">`+
  65. `<received id="${last_msg_id}" xmlns="urn:xmpp:chat-markers:0"/>`+
  66. `</message>`
  67. );
  68. expect(Strophe.serialize(sent_stanzas[1])).toBe(
  69. `<presence to="${muc_jid}/romeo" type="unavailable" xmlns="jabber:client">`+
  70. `<priority>0</priority>`+
  71. `<c hash="sha-1" node="https://conversejs.org" ver="PxXfr6uz8ClMWIga0OB/MhKNH/M=" xmlns="http://jabber.org/protocol/caps"/>`+
  72. `</presence>`
  73. );
  74. expect(Strophe.serialize(sent_stanzas[2])).toBe(
  75. `<presence to="montague.lit" xmlns="jabber:client">`+
  76. `<priority>0</priority>`+
  77. `<c hash="sha-1" node="https://conversejs.org" ver="PxXfr6uz8ClMWIga0OB/MhKNH/M=" xmlns="http://jabber.org/protocol/caps"/>`+
  78. `<rai xmlns="urn:xmpp:rai:0"/>`+
  79. `</presence>`
  80. );
  81. view.model.save({'hidden': false});
  82. done();
  83. }));
  84. });