controlbox.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. (function (root, factory) {
  2. define(["jquery", "jasmine", "mock", "converse-core", "test-utils"], factory);
  3. } (this, function ($, jasmine, mock, converse, test_utils) {
  4. var _ = converse.env._;
  5. var $pres = converse.env.$pres;
  6. var $msg = converse.env.$msg;
  7. var $iq = converse.env.$iq;
  8. var u = converse.env.utils;
  9. describe("The Controlbox", function () {
  10. it("can be opened by clicking a DOM element with class 'toggle-controlbox'",
  11. mock.initConverseWithPromises(
  12. null, ['rosterGroupsFetched'], {},
  13. function (done, _converse) {
  14. // This spec will only pass if the controlbox is not currently
  15. // open yet.
  16. expect($("div#controlbox").is(':visible')).toBe(false);
  17. spyOn(_converse.controlboxtoggle, 'onClick').and.callThrough();
  18. spyOn(_converse.controlboxtoggle, 'showControlBox').and.callThrough();
  19. spyOn(_converse, 'emit');
  20. // Redelegate so that the spies are now registered as the event handlers (specifically for 'onClick')
  21. _converse.controlboxtoggle.delegateEvents();
  22. document.querySelector('.toggle-controlbox').click();
  23. expect(_converse.controlboxtoggle.onClick).toHaveBeenCalled();
  24. expect(_converse.controlboxtoggle.showControlBox).toHaveBeenCalled();
  25. expect(_converse.emit).toHaveBeenCalledWith('controlBoxOpened', jasmine.any(Object));
  26. expect($("div#controlbox").is(':visible')).toBe(true);
  27. done();
  28. }));
  29. describe("The \"Contacts\" section", function () {
  30. it("shows the number of unread mentions received",
  31. mock.initConverseWithPromises(
  32. null, ['rosterGroupsFetched'], {},
  33. function (done, _converse) {
  34. test_utils.createContacts(_converse, 'all').openControlBox();
  35. var contacts_panel = _converse.chatboxviews.get('controlbox').contactspanel;
  36. var sender_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost';
  37. test_utils.openChatBoxFor(_converse, sender_jid);
  38. var chatview = _converse.chatboxviews.get(sender_jid);
  39. chatview.model.set({'minimized': true});
  40. expect(_.isNull(_converse.chatboxviews.el.querySelector('.restore-chat .message-count'))).toBeTruthy();
  41. expect(_.isNull(_converse.rosterview.el.querySelector('.msgs-indicator'))).toBeTruthy();
  42. var msg = $msg({
  43. from: sender_jid,
  44. to: _converse.connection.jid,
  45. type: 'chat',
  46. id: (new Date()).getTime()
  47. }).c('body').t('hello').up()
  48. .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
  49. _converse.chatboxes.onMessage(msg);
  50. expect(_converse.chatboxviews.el.querySelector('.restore-chat .message-count').textContent).toBe('1');
  51. expect(_converse.rosterview.el.querySelector('.msgs-indicator').textContent).toBe('1');
  52. msg = $msg({
  53. from: sender_jid,
  54. to: _converse.connection.jid,
  55. type: 'chat',
  56. id: (new Date()).getTime()
  57. }).c('body').t('hello again').up()
  58. .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
  59. _converse.chatboxes.onMessage(msg);
  60. expect(_converse.chatboxviews.el.querySelector('.restore-chat .message-count').textContent).toBe('2');
  61. expect(_converse.rosterview.el.querySelector('.msgs-indicator').textContent).toBe('2');
  62. chatview.model.set({'minimized': false});
  63. expect(_.isNull(_converse.chatboxviews.el.querySelector('.restore-chat .message-count'))).toBeTruthy();
  64. expect(_.isNull(_converse.rosterview.el.querySelector('.msgs-indicator'))).toBeTruthy();
  65. done();
  66. }));
  67. });
  68. describe("The Status Widget", function () {
  69. it("shows the user's chat status, which is online by default",
  70. mock.initConverseWithPromises(
  71. null, ['rosterGroupsFetched'], {},
  72. function (done, _converse) {
  73. test_utils.openControlBox();
  74. var view = _converse.xmppstatusview;
  75. expect($(view.el).find('.xmpp-status span:first-child').hasClass('online')).toBe(true);
  76. expect(view.el.querySelector('.xmpp-status span.online').textContent.trim()).toBe('I am online');
  77. done();
  78. }));
  79. it("can be used to set the current user's chat status",
  80. mock.initConverseWithPromises(
  81. null, ['rosterGroupsFetched'], {},
  82. function (done, _converse) {
  83. test_utils.openControlBox();
  84. var cbview = _converse.chatboxviews.get('controlbox');
  85. cbview.el.querySelector('.change-status').click()
  86. var modal = _converse.xmppstatusview.status_modal;
  87. test_utils.waitUntil(function () {
  88. return u.isVisible(modal.el);
  89. }, 1000).then(function () {
  90. var view = _converse.xmppstatusview;
  91. spyOn(_converse, 'emit');
  92. modal.el.querySelector('label[for="radio-busy"]').click(); // Change status to "dnd"
  93. modal.el.querySelector('[type="submit"]').click();
  94. expect(_converse.emit).toHaveBeenCalledWith('statusChanged', 'dnd');
  95. expect($(view.el).find('.xmpp-status span:first-child').hasClass('online')).toBe(false);
  96. expect($(view.el).find('.xmpp-status span:first-child').hasClass('dnd')).toBe(true);
  97. expect(view.el.querySelector('.xmpp-status span:first-child').textContent.trim()).toBe('I am busy');
  98. done();
  99. });
  100. }));
  101. it("can be used to set a custom status message",
  102. mock.initConverseWithPromises(
  103. null, ['rosterGroupsFetched'], {},
  104. function (done, _converse) {
  105. test_utils.openControlBox();
  106. var cbview = _converse.chatboxviews.get('controlbox');
  107. cbview.el.querySelector('.change-status').click()
  108. var modal = _converse.xmppstatusview.status_modal;
  109. test_utils.waitUntil(function () {
  110. return u.isVisible(modal.el);
  111. }, 1000).then(function () {
  112. var view = _converse.xmppstatusview;
  113. spyOn(_converse, 'emit');
  114. var msg = 'I am happy';
  115. modal.el.querySelector('input[name="status_message"]').value = msg;
  116. modal.el.querySelector('[type="submit"]').click();
  117. expect(_converse.emit).toHaveBeenCalledWith('statusMessageChanged', msg);
  118. expect($(view.el).find('.xmpp-status span:first-child').hasClass('online')).toBe(true);
  119. expect(view.el.querySelector('.xmpp-status span:first-child').textContent.trim()).toBe(msg);
  120. done();
  121. });
  122. }));
  123. });
  124. });
  125. describe("The 'Add Contact' widget", function () {
  126. it("opens up an add form when you click on it",
  127. mock.initConverseWithPromises(
  128. null, ['rosterGroupsFetched'], {},
  129. function (done, _converse) {
  130. var panel = _converse.chatboxviews.get('controlbox').contactspanel;
  131. spyOn(panel, 'toggleContactForm').and.callThrough();
  132. panel.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
  133. panel.el.querySelector('a.toggle-xmpp-contact-form').click();
  134. expect(panel.toggleContactForm).toHaveBeenCalled();
  135. // XXX: Awaiting more tests, close it again for now...
  136. panel.el.querySelector('a.toggle-xmpp-contact-form').click();
  137. done();
  138. }));
  139. it("can be used to add contact and it checks for case-sensivity",
  140. mock.initConverseWithPromises(
  141. null, ['rosterGroupsFetched'], {},
  142. function (done, _converse) {
  143. spyOn(_converse, 'emit');
  144. spyOn(_converse.rosterview, 'update').and.callThrough();
  145. test_utils.openControlBox();
  146. // Adding two contacts one with Capital initials and one with small initials of same JID (Case sensitive check)
  147. _converse.roster.create({
  148. jid: mock.pend_names[0].replace(/ /g,'.').toLowerCase() + '@localhost',
  149. subscription: 'none',
  150. ask: 'subscribe',
  151. fullname: mock.pend_names[0]
  152. });
  153. _converse.roster.create({
  154. jid: mock.pend_names[0].replace(/ /g,'.') + '@localhost',
  155. subscription: 'none',
  156. ask: 'subscribe',
  157. fullname: mock.pend_names[0]
  158. });
  159. test_utils.waitUntil(function () {
  160. return $(_converse.rosterview.el).find('.roster-group li:visible').length;
  161. }, 700).then(function () {
  162. // Checking that only one entry is created because both JID is same (Case sensitive check)
  163. expect($(_converse.rosterview.el).find('li:visible').length).toBe(1);
  164. expect(_converse.rosterview.update).toHaveBeenCalled();
  165. done();
  166. });
  167. }));
  168. });
  169. }));