room_registration.js 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. (function (root, factory) {
  2. define(["jasmine", "mock", "test-utils" ], factory);
  3. } (this, function (jasmine, mock, test_utils) {
  4. const _ = converse.env._,
  5. $iq = converse.env.$iq,
  6. $pres = converse.env.$pres,
  7. Strophe = converse.env.Strophe,
  8. sizzle = converse.env.sizzle,
  9. u = converse.env.utils;
  10. describe("Chatrooms", function () {
  11. describe("The /register commmand", function () {
  12. it("allows you to register your nickname in a room",
  13. mock.initConverseWithPromises(
  14. null, ['rosterGroupsFetched', 'chatBoxesFetched'], {'auto_register_muc_nickname': true},
  15. function (done, _converse) {
  16. let view;
  17. const room_jid = 'coven@chat.shakespeare.lit';
  18. test_utils.openAndEnterChatRoom(_converse, 'coven', 'chat.shakespeare.lit', 'romeo')
  19. .then(() => {
  20. view = _converse.chatboxviews.get(room_jid);
  21. const textarea = view.el.querySelector('.chat-textarea')
  22. textarea.value = '/register';
  23. view.keyPressed({
  24. target: textarea,
  25. preventDefault: _.noop,
  26. keyCode: 13
  27. });
  28. return test_utils.waitUntil(() => _.filter(
  29. _converse.connection.IQ_stanzas,
  30. iq => sizzle(`iq[to="coven@chat.shakespeare.lit"][type="get"] query[xmlns="jabber:iq:register"]`, iq.nodeTree).length
  31. ).pop());
  32. }).then(node => {
  33. const stanza = node.nodeTree;
  34. expect(node.toLocaleString())
  35. .toBe(`<iq from="dummy@localhost/resource" id="${stanza.getAttribute('id')}" to="coven@chat.shakespeare.lit" `+
  36. `type="get" xmlns="jabber:client">`+
  37. `<query xmlns="jabber:iq:register"/></iq>`);
  38. view = _converse.chatboxviews.get(room_jid);
  39. const result = $iq({
  40. 'from': view.model.get('jid'),
  41. 'id': stanza.getAttribute('id'),
  42. 'to': _converse.bare_jid,
  43. 'type': 'result',
  44. }).c('query', {'type': 'jabber:iq:register'})
  45. .c('x', {'xmlns': 'jabber:x:data', 'type': 'form'})
  46. .c('field', {
  47. 'label': 'Desired Nickname',
  48. 'type': 'text-single',
  49. 'var': 'muc#register_roomnick'
  50. }).c('required');
  51. _converse.connection._dataRecv(test_utils.createRequest(result));
  52. return test_utils.waitUntil(() => _.filter(
  53. _converse.connection.IQ_stanzas,
  54. iq => sizzle(`iq[to="coven@chat.shakespeare.lit"][type="set"] query[xmlns="jabber:iq:register"]`, iq.nodeTree).length
  55. ).pop());
  56. }).then(node => {
  57. const stanza = node.nodeTree;
  58. expect(node.toLocaleString()).toBe(
  59. `<iq from="dummy@localhost/resource" id="${stanza.getAttribute('id')}" to="coven@chat.shakespeare.lit" type="set" xmlns="jabber:client">`+
  60. `<query xmlns="jabber:iq:register">`+
  61. `<x type="submit" xmlns="jabber:x:data">`+
  62. `<field var="FORM_TYPE"><value>http://jabber.org/protocol/muc#register</value></field>`+
  63. `<field var="muc#register_roomnick"><value>romeo</value></field>`+
  64. `</x>`+
  65. `</query>`+
  66. `</iq>`);
  67. done();
  68. }).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
  69. }));
  70. });
  71. describe("The auto_register_muc_nickname option", function () {
  72. it("allows you to automatically register your nickname when joining a room",
  73. mock.initConverseWithPromises(
  74. null, ['rosterGroupsFetched', 'chatBoxesFetched'], {'auto_register_muc_nickname': true},
  75. function (done, _converse) {
  76. let view;
  77. const IQ_stanzas = _converse.connection.IQ_stanzas;
  78. const room_jid = 'coven@chat.shakespeare.lit';
  79. _converse.api.rooms.open(room_jid, {'nick': 'romeo'})
  80. .then(() => {
  81. return test_utils.waitUntil(() => _.get(_.filter(
  82. IQ_stanzas,
  83. iq => iq.nodeTree.querySelector(
  84. `iq[to="${room_jid}"] query[xmlns="http://jabber.org/protocol/disco#info"]`
  85. )).pop(), 'nodeTree'));
  86. }).then(stanza => {
  87. const features_stanza = $iq({
  88. 'from': room_jid,
  89. 'id': stanza.getAttribute('id'),
  90. 'to': 'dummy@localhost/desktop',
  91. 'type': 'result'
  92. }).c('query', { 'xmlns': 'http://jabber.org/protocol/disco#info'})
  93. .c('identity', {
  94. 'category': 'conference',
  95. 'name': 'A Dark Cave',
  96. 'type': 'text'
  97. }).up()
  98. .c('feature', {'var': 'http://jabber.org/protocol/muc'}).up()
  99. .c('feature', {'var': 'jabber:iq:register'});
  100. _converse.connection._dataRecv(test_utils.createRequest(features_stanza));
  101. view = _converse.chatboxviews.get('coven@chat.shakespeare.lit');
  102. return test_utils.waitUntil(() => (view.model.get('connection_status') === converse.ROOMSTATUS.CONNECTING));
  103. }).then(stanza => {
  104. // The user has just entered the room (because join was called)
  105. // and receives their own presence from the server.
  106. // See example 24: http://xmpp.org/extensions/xep-0045.html#enter-pres
  107. const presence = $pres({
  108. to: _converse.connection.jid,
  109. from: room_jid,
  110. id: u.getUniqueId()
  111. }).c('x').attrs({xmlns:'http://jabber.org/protocol/muc#user'})
  112. .c('item').attrs({
  113. affiliation: 'owner',
  114. jid: _converse.bare_jid,
  115. role: 'moderator'
  116. }).up()
  117. .c('status').attrs({code:'110'});
  118. _converse.connection._dataRecv(test_utils.createRequest(presence));
  119. return test_utils.waitUntil(() => _.filter(
  120. _converse.connection.IQ_stanzas,
  121. iq => sizzle(`iq[to="coven@chat.shakespeare.lit"][type="get"] query[xmlns="jabber:iq:register"]`, iq.nodeTree).length
  122. ).pop());
  123. }).then(node => {
  124. const stanza = node.nodeTree;
  125. expect(node.toLocaleString())
  126. .toBe(`<iq from="dummy@localhost/resource" id="${stanza.getAttribute('id')}" to="coven@chat.shakespeare.lit" `+
  127. `type="get" xmlns="jabber:client">`+
  128. `<query xmlns="jabber:iq:register"/></iq>`);
  129. view = _converse.chatboxviews.get(room_jid);
  130. const result = $iq({
  131. 'from': view.model.get('jid'),
  132. 'id': stanza.getAttribute('id'),
  133. 'to': _converse.bare_jid,
  134. 'type': 'result',
  135. }).c('query', {'type': 'jabber:iq:register'})
  136. .c('x', {'xmlns': 'jabber:x:data', 'type': 'form'})
  137. .c('field', {
  138. 'label': 'Desired Nickname',
  139. 'type': 'text-single',
  140. 'var': 'muc#register_roomnick'
  141. }).c('required');
  142. _converse.connection._dataRecv(test_utils.createRequest(result));
  143. return test_utils.waitUntil(() => _.filter(
  144. _converse.connection.IQ_stanzas,
  145. iq => sizzle(`iq[to="coven@chat.shakespeare.lit"][type="set"] query[xmlns="jabber:iq:register"]`, iq.nodeTree).length
  146. ).pop());
  147. }).then(node => {
  148. const stanza = node.nodeTree;
  149. expect(node.toLocaleString()).toBe(
  150. `<iq from="dummy@localhost/resource" id="${stanza.getAttribute('id')}" to="coven@chat.shakespeare.lit" type="set" xmlns="jabber:client">`+
  151. `<query xmlns="jabber:iq:register">`+
  152. `<x type="submit" xmlns="jabber:x:data">`+
  153. `<field var="FORM_TYPE"><value>http://jabber.org/protocol/muc#register</value></field>`+
  154. `<field var="muc#register_roomnick"><value>romeo</value></field>`+
  155. `</x>`+
  156. `</query>`+
  157. `</iq>`);
  158. done();
  159. }).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
  160. }));
  161. });
  162. });
  163. }));