register.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. (function (root, factory) {
  2. define(["jquery", "jasmine", "mock", "test-utils"], factory);
  3. } (this, function ($, jasmine, mock, test_utils) {
  4. var Strophe = converse.env.Strophe;
  5. var $iq = converse.env.$iq;
  6. var _ = converse.env._;
  7. describe("The Registration Panel", function () {
  8. it("is not available unless allow_registration=true",
  9. mock.initConverseWithPromises(
  10. null, ['connectionInitialized', 'chatBoxesInitialized'],
  11. { auto_login: false,
  12. allow_registration: false },
  13. function (done, _converse) {
  14. test_utils.waitUntil(() => _converse.chatboxviews.get('controlbox'))
  15. .then(function () {
  16. test_utils.openControlBox();
  17. var cbview = _converse.chatboxviews.get('controlbox');
  18. expect($(cbview.el.querySelector('a.register-account')).length).toBe(0);
  19. done();
  20. });
  21. }));
  22. it("can be opened by clicking on the registration tab",
  23. mock.initConverseWithPromises(
  24. null, ['connectionInitialized', 'chatBoxesInitialized'],
  25. { auto_login: false,
  26. allow_registration: true },
  27. function (done, _converse) {
  28. test_utils.waitUntil(() => _.get(_converse.chatboxviews.get('controlbox'), 'registerpanel'), 300)
  29. .then(function () {
  30. var cbview = _converse.chatboxviews.get('controlbox');
  31. test_utils.openControlBox();
  32. var $panels = $(cbview.el.querySelector('.controlbox-panes'));
  33. var $login = $panels.children().first();
  34. var $registration = $panels.children().last();
  35. var register_link = cbview.el.querySelector('a.register-account');
  36. expect(register_link.textContent).toBe("Create an account");
  37. register_link.click();
  38. test_utils.waitUntil(function () {
  39. return $registration.is(':visible');
  40. }, 300).then(function () {
  41. expect($login.is(':visible')).toBe(false);
  42. done();
  43. });
  44. });
  45. }));
  46. it("allows the user to choose an XMPP provider's domain",
  47. mock.initConverseWithPromises(
  48. null, ['connectionInitialized', 'chatBoxesInitialized'],
  49. { auto_login: false,
  50. allow_registration: true },
  51. function (done, _converse) {
  52. test_utils.waitUntil(function () {
  53. return _.get(_converse.chatboxviews.get('controlbox'), 'registerpanel');
  54. }, 300)
  55. .then(function () {
  56. test_utils.openControlBox();
  57. var cbview = _converse.chatboxviews.get('controlbox');
  58. var registerview = cbview.registerpanel;
  59. spyOn(registerview, 'onProviderChosen').and.callThrough();
  60. registerview.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
  61. spyOn(_converse.connection, 'connect');
  62. // Open the register panel
  63. cbview.el.querySelector('.toggle-register-login').click();
  64. // Check the form layout
  65. var $form = $(cbview.el.querySelector('#converse-register'));
  66. expect($form.find('input').length).toEqual(2);
  67. expect($form.find('input').first().attr('name')).toEqual('domain');
  68. expect($form.find('input').last().attr('type')).toEqual('submit');
  69. // Check that the input[type=domain] input is required
  70. $form.find('input[type=submit]')[0].click();
  71. expect(registerview.onProviderChosen).not.toHaveBeenCalled();
  72. // Check that the form is accepted if input[type=domain] has a value
  73. $form.find('input[name=domain]').val('conversejs.org');
  74. $form.find('input[type=submit]')[0].click();
  75. expect(registerview.onProviderChosen).toHaveBeenCalled();
  76. expect(_converse.connection.connect).toHaveBeenCalled();
  77. done();
  78. });
  79. }));
  80. it("will render a registration form as received from the XMPP provider",
  81. mock.initConverseWithPromises(
  82. null, ['connectionInitialized', 'chatBoxesInitialized'],
  83. { auto_login: false,
  84. allow_registration: true },
  85. function (done, _converse) {
  86. test_utils.waitUntil(function () {
  87. return _.get(_converse.chatboxviews.get('controlbox'), 'registerpanel');
  88. }, 300).then(function () {
  89. test_utils.openControlBox();
  90. var cbview = _converse.chatboxviews.get('controlbox');
  91. cbview.el.querySelector('.toggle-register-login').click();
  92. var registerview = _converse.chatboxviews.get('controlbox').registerpanel;
  93. spyOn(registerview, 'onProviderChosen').and.callThrough();
  94. spyOn(registerview, 'getRegistrationFields').and.callThrough();
  95. spyOn(registerview, 'onRegistrationFields').and.callThrough();
  96. spyOn(registerview, 'renderRegistrationForm').and.callThrough();
  97. registerview.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
  98. spyOn(_converse.connection, 'connect').and.callThrough();
  99. expect(registerview._registering).toBeFalsy();
  100. expect(_converse.connection.connected).toBeFalsy();
  101. registerview.el.querySelector('input[name=domain]').value = 'conversejs.org';
  102. registerview.el.querySelector('input[type=submit]').click();
  103. expect(registerview.onProviderChosen).toHaveBeenCalled();
  104. expect(registerview._registering).toBeTruthy();
  105. expect(_converse.connection.connect).toHaveBeenCalled();
  106. var stanza = new Strophe.Builder("stream:features", {
  107. 'xmlns:stream': "http://etherx.jabber.org/streams",
  108. 'xmlns': "jabber:client"
  109. })
  110. .c('register', {xmlns: "http://jabber.org/features/iq-register"}).up()
  111. .c('mechanisms', {xmlns: "urn:ietf:params:xml:ns:xmpp-sasl"});
  112. _converse.connection._connect_cb(test_utils.createRequest(stanza));
  113. expect(registerview.getRegistrationFields).toHaveBeenCalled();
  114. stanza = $iq({
  115. 'type': 'result',
  116. 'id': 'reg1'
  117. }).c('query', {'xmlns': 'jabber:iq:register'})
  118. .c('instructions')
  119. .t('Please choose a username, password and provide your email address').up()
  120. .c('username').up()
  121. .c('password').up()
  122. .c('email');
  123. _converse.connection._dataRecv(test_utils.createRequest(stanza));
  124. expect(registerview.onRegistrationFields).toHaveBeenCalled();
  125. expect(registerview.renderRegistrationForm).toHaveBeenCalled();
  126. expect(registerview.el.querySelectorAll('input').length).toBe(5);
  127. expect(registerview.el.querySelectorAll('input[type=submit]').length).toBe(1);
  128. expect(registerview.el.querySelectorAll('input[type=button]').length).toBe(1);
  129. done();
  130. });
  131. }));
  132. it("will set form_type to legacy and submit it as legacy",
  133. mock.initConverseWithPromises(
  134. null, ['connectionInitialized', 'chatBoxesInitialized'],
  135. { auto_login: false,
  136. allow_registration: true },
  137. function (done, _converse) {
  138. test_utils.waitUntil(function () {
  139. return _.get(_converse.chatboxviews.get('controlbox'), 'registerpanel');
  140. }, 300)
  141. .then(function () {
  142. test_utils.openControlBox();
  143. var cbview = _converse.chatboxviews.get('controlbox');
  144. cbview.el.querySelector('.toggle-register-login').click();
  145. var registerview = cbview.registerpanel;
  146. spyOn(registerview, 'onProviderChosen').and.callThrough();
  147. spyOn(registerview, 'getRegistrationFields').and.callThrough();
  148. spyOn(registerview, 'onRegistrationFields').and.callThrough();
  149. spyOn(registerview, 'renderRegistrationForm').and.callThrough();
  150. registerview.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
  151. spyOn(_converse.connection, 'connect').and.callThrough();
  152. registerview.el.querySelector('input[name=domain]').value = 'conversejs.org';
  153. registerview.el.querySelector('input[type=submit]').click();
  154. var stanza = new Strophe.Builder("stream:features", {
  155. 'xmlns:stream': "http://etherx.jabber.org/streams",
  156. 'xmlns': "jabber:client"
  157. })
  158. .c('register', {xmlns: "http://jabber.org/features/iq-register"}).up()
  159. .c('mechanisms', {xmlns: "urn:ietf:params:xml:ns:xmpp-sasl"});
  160. _converse.connection._connect_cb(test_utils.createRequest(stanza));
  161. stanza = $iq({
  162. 'type': 'result',
  163. 'id': 'reg1'
  164. }).c('query', {'xmlns': 'jabber:iq:register'})
  165. .c('instructions')
  166. .t('Please choose a username, password and provide your email address').up()
  167. .c('username').up()
  168. .c('password').up()
  169. .c('email');
  170. _converse.connection._dataRecv(test_utils.createRequest(stanza));
  171. expect(registerview.form_type).toBe('legacy');
  172. $(registerview.el.querySelector('input[name=username]')).val('testusername');
  173. $(registerview.el.querySelector('input[name=password]')).val('testpassword');
  174. $(registerview.el.querySelector('input[name=email]')).val('test@email.local');
  175. spyOn(_converse.connection, 'send');
  176. registerview.el.querySelector('input[type=submit]').click();
  177. expect(_converse.connection.send).toHaveBeenCalled();
  178. var $stanza = $(_converse.connection.send.calls.argsFor(0)[0].tree());
  179. expect($stanza.children('query').children().length).toBe(3);
  180. expect($stanza.children('query').children()[0].tagName).toBe('username');
  181. done();
  182. });
  183. }));
  184. it("will set form_type to xform and submit it as xform",
  185. mock.initConverseWithPromises(
  186. null, ['connectionInitialized', 'chatBoxesInitialized'],
  187. { auto_login: false,
  188. allow_registration: true },
  189. function (done, _converse) {
  190. test_utils.waitUntil(function () {
  191. return _.get(_converse.chatboxviews.get('controlbox'), 'registerpanel');
  192. }, 300).then(function () {
  193. test_utils.openControlBox();
  194. var cbview = _converse.chatboxviews.get('controlbox');
  195. cbview.el.querySelector('.toggle-register-login').click();
  196. var registerview = _converse.chatboxviews.get('controlbox').registerpanel;
  197. spyOn(registerview, 'onProviderChosen').and.callThrough();
  198. spyOn(registerview, 'getRegistrationFields').and.callThrough();
  199. spyOn(registerview, 'onRegistrationFields').and.callThrough();
  200. spyOn(registerview, 'renderRegistrationForm').and.callThrough();
  201. registerview.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
  202. spyOn(_converse.connection, 'connect').and.callThrough();
  203. registerview.el.querySelector('input[name=domain]').value = 'conversejs.org';
  204. registerview.el.querySelector('input[type=submit]').click();
  205. var stanza = new Strophe.Builder("stream:features", {
  206. 'xmlns:stream': "http://etherx.jabber.org/streams",
  207. 'xmlns': "jabber:client"
  208. })
  209. .c('register', {xmlns: "http://jabber.org/features/iq-register"}).up()
  210. .c('mechanisms', {xmlns: "urn:ietf:params:xml:ns:xmpp-sasl"});
  211. _converse.connection._connect_cb(test_utils.createRequest(stanza));
  212. stanza = $iq({
  213. 'type': 'result',
  214. 'id': 'reg1'
  215. }).c('query', {'xmlns': 'jabber:iq:register'})
  216. .c('instructions')
  217. .t('Using xform data').up()
  218. .c('x', { 'xmlns': 'jabber:x:data', 'type': 'form' })
  219. .c('instructions').t('xform instructions').up()
  220. .c('field', {'type': 'text-single', 'var': 'username'}).c('required').up().up()
  221. .c('field', {'type': 'text-private', 'var': 'password'}).c('required').up().up()
  222. .c('field', {'type': 'text-single', 'var': 'email'}).c('required').up().up();
  223. _converse.connection._dataRecv(test_utils.createRequest(stanza));
  224. expect(registerview.form_type).toBe('xform');
  225. $(registerview.el.querySelector('input[name=username]')).val('testusername');
  226. $(registerview.el.querySelector('input[name=password]')).val('testpassword');
  227. $(registerview.el.querySelector('input[name=email]')).val('test@email.local');
  228. spyOn(_converse.connection, 'send');
  229. registerview.el.querySelector('input[type=submit]').click();
  230. expect(_converse.connection.send).toHaveBeenCalled();
  231. stanza = _converse.connection.send.calls.argsFor(0)[0].tree();
  232. expect(stanza.outerHTML.trim().replace(/(\n|\s{2,})/g, '')).toEqual(
  233. '<iq type="set" id="'+stanza.getAttribute('id')+'" xmlns="jabber:client">'+
  234. '<query xmlns="jabber:iq:register">'+
  235. '<x xmlns="jabber:x:data" type="submit">'+
  236. '<field xmlns="http://www.w3.org/1999/xhtml" var="username">'+
  237. '<value>testusername</value>'+
  238. '</field>'+
  239. '<field xmlns="http://www.w3.org/1999/xhtml" var="password">'+
  240. '<value>testpassword</value>'+
  241. '</field>'+
  242. '<field xmlns="http://www.w3.org/1999/xhtml" var="email">'+
  243. '<value>test@email.local</value>'+
  244. '</field>'+
  245. '</x>'+
  246. '</query>'+
  247. '</iq>'
  248. );
  249. done();
  250. });
  251. }));
  252. });
  253. }));