Browse Source

Fix failing tests based on recent unread message changes

JC Brand 8 years ago
parent
commit
c81599931c
5 changed files with 73 additions and 52 deletions
  1. 33 33
      spec/chatbox.js
  2. 1 1
      spec/chatroom.js
  3. 28 10
      spec/controlbox.js
  4. 7 5
      src/converse-core.js
  5. 4 3
      src/converse-headline.js

+ 33 - 33
spec/chatbox.js

@@ -93,7 +93,7 @@
                     var online_contacts = _converse.rosterview.$el.find('dt.roster-group').siblings('dd.current-xmpp-contact').find('a.open-chat');
                     var online_contacts = _converse.rosterview.$el.find('dt.roster-group').siblings('dd.current-xmpp-contact').find('a.open-chat');
                     for (i=0; i<online_contacts.length; i++) {
                     for (i=0; i<online_contacts.length; i++) {
                         $el = $(online_contacts[i]);
                         $el = $(online_contacts[i]);
-                        jid = $el.text().replace(/ /g,'.').toLowerCase() + '@localhost';
+                        jid = _.trim($el.text()).replace(/ /g,'.').toLowerCase() + '@localhost';
                         $el.click();
                         $el.click();
                         expect(_converse.chatboxviews.trimChats).toHaveBeenCalled();
                         expect(_converse.chatboxviews.trimChats).toHaveBeenCalled();
 
 
@@ -508,7 +508,7 @@
 
 
                             // onMessage is a handler for received XMPP messages
                             // onMessage is a handler for received XMPP messages
                             _converse.chatboxes.onMessage(msg);
                             _converse.chatboxes.onMessage(msg);
-                            expect(_converse.emit).toHaveBeenCalledWith('message', msg);
+                            expect(_converse.emit).toHaveBeenCalledWith('message', jasmine.any(Object));
 
 
                             // Check that the chatbox and its view now exist
                             // Check that the chatbox and its view now exist
                             var chatbox = _converse.chatboxes.get(sender_jid);
                             var chatbox = _converse.chatboxes.get(sender_jid);
@@ -533,38 +533,38 @@
                     }));
                     }));
 
 
                     describe("who is not on the roster", function () {
                     describe("who is not on the roster", function () {
-                        it("will open a chatbox and be displayed inside it if allow_non_roster_messaging is true", mock.initConverse(function (converse) {
-                            converse.allow_non_roster_messaging = false;
+                        it("will open a chatbox and be displayed inside it if allow_non_roster_messaging is true", mock.initConverse(function (_converse) {
+                            _converse.allow_non_roster_messaging = false;
 
 
-                            spyOn(converse, 'emit');
+                            spyOn(_converse, 'emit');
                             var message = 'This is a received message from someone not on the roster';
                             var message = 'This is a received message from someone not on the roster';
                             var sender_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost';
                             var sender_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost';
                             var msg = $msg({
                             var msg = $msg({
                                     from: sender_jid,
                                     from: sender_jid,
-                                    to: converse.connection.jid,
+                                    to: _converse.connection.jid,
                                     type: 'chat',
                                     type: 'chat',
                                     id: (new Date()).getTime()
                                     id: (new Date()).getTime()
                                 }).c('body').t(message).up()
                                 }).c('body').t(message).up()
                                 .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
                                 .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
 
 
                             // We don't already have an open chatbox for this user
                             // We don't already have an open chatbox for this user
-                            expect(converse.chatboxes.get(sender_jid)).not.toBeDefined();
+                            expect(_converse.chatboxes.get(sender_jid)).not.toBeDefined();
 
 
                             // onMessage is a handler for received XMPP messages
                             // onMessage is a handler for received XMPP messages
-                            converse.chatboxes.onMessage(msg);
-                            expect(converse.emit).toHaveBeenCalledWith('message', msg);
+                            _converse.chatboxes.onMessage(msg);
+                            expect(_converse.emit).toHaveBeenCalledWith('message', jasmine.any(Object));
 
 
-                            var chatbox = converse.chatboxes.get(sender_jid);
+                            var chatbox = _converse.chatboxes.get(sender_jid);
                             expect(chatbox).not.toBeDefined();
                             expect(chatbox).not.toBeDefined();
 
 
                             // onMessage is a handler for received XMPP messages
                             // onMessage is a handler for received XMPP messages
-                            converse.allow_non_roster_messaging =true;
-                            converse.chatboxes.onMessage(msg);
-                            expect(converse.emit).toHaveBeenCalledWith('message', msg);
+                            _converse.allow_non_roster_messaging =true;
+                            _converse.chatboxes.onMessage(msg);
+                            expect(_converse.emit).toHaveBeenCalledWith('message', jasmine.any(Object));
 
 
                             // Check that the chatbox and its view now exist
                             // Check that the chatbox and its view now exist
-                            chatbox = converse.chatboxes.get(sender_jid);
-                            var chatboxview = converse.chatboxviews.get(sender_jid);
+                            chatbox = _converse.chatboxes.get(sender_jid);
+                            var chatboxview = _converse.chatboxviews.get(sender_jid);
                             expect(chatbox).toBeDefined();
                             expect(chatbox).toBeDefined();
                             expect(chatboxview).toBeDefined();
                             expect(chatboxview).toBeDefined();
                             // Check that the message was received and check the message parameters
                             // Check that the message was received and check the message parameters
@@ -917,10 +917,10 @@
                     expect(msg_txt).toEqual(msgtext);
                     expect(msg_txt).toEqual(msgtext);
                 }));
                 }));
 
 
-                it("will be discarded if it's a malicious message meant to look like a carbon copy", mock.initConverse(function (converse) {
-                    test_utils.createContacts(converse, 'current');
+                it("will be discarded if it's a malicious message meant to look like a carbon copy", mock.initConverse(function (_converse) {
+                    test_utils.createContacts(_converse, 'current');
                     test_utils.openControlBox();
                     test_utils.openControlBox();
-                    test_utils.openContactsPanel(converse);
+                    test_utils.openContactsPanel(_converse);
                     /* <message from="mallory@evil.example" to="b@xmpp.example">
                     /* <message from="mallory@evil.example" to="b@xmpp.example">
                      *    <received xmlns='urn:xmpp:carbons:2'>
                      *    <received xmlns='urn:xmpp:carbons:2'>
                      *      <forwarded xmlns='urn:xmpp:forward:0'>
                      *      <forwarded xmlns='urn:xmpp:forward:0'>
@@ -931,14 +931,14 @@
                      *    </received>
                      *    </received>
                      * </message>
                      * </message>
                      */
                      */
-                    spyOn(converse, 'log');
+                    spyOn(_converse, 'log');
                     var msgtext = 'Please come to Creepy Valley tonight, alone!';
                     var msgtext = 'Please come to Creepy Valley tonight, alone!';
                     var sender_jid = mock.cur_names[1].replace(/ /g,'.').toLowerCase() + '@localhost';
                     var sender_jid = mock.cur_names[1].replace(/ /g,'.').toLowerCase() + '@localhost';
                     var impersonated_jid = mock.cur_names[2].replace(/ /g,'.').toLowerCase() + '@localhost';
                     var impersonated_jid = mock.cur_names[2].replace(/ /g,'.').toLowerCase() + '@localhost';
                     var msg = $msg({
                     var msg = $msg({
                             'from': sender_jid,
                             'from': sender_jid,
                             'id': (new Date()).getTime(),
                             'id': (new Date()).getTime(),
-                            'to': converse.connection.jid,
+                            'to': _converse.connection.jid,
                             'type': 'chat',
                             'type': 'chat',
                             'xmlns': 'jabber:client'
                             'xmlns': 'jabber:client'
                         }).c('received', {'xmlns': 'urn:xmpp:carbons:2'})
                         }).c('received', {'xmlns': 'urn:xmpp:carbons:2'})
@@ -946,17 +946,17 @@
                           .c('message', {
                           .c('message', {
                                 'xmlns': 'jabber:client',
                                 'xmlns': 'jabber:client',
                                 'from': impersonated_jid,
                                 'from': impersonated_jid,
-                                'to': converse.connection.jid,
+                                'to': _converse.connection.jid,
                                 'type': 'chat'
                                 'type': 'chat'
                         }).c('body').t(msgtext).tree();
                         }).c('body').t(msgtext).tree();
-                    converse.chatboxes.onMessage(msg);
+                    _converse.chatboxes.onMessage(msg);
 
 
                     // Check that chatbox for impersonated user is not created.
                     // Check that chatbox for impersonated user is not created.
-                    var chatbox = converse.chatboxes.get(impersonated_jid);
+                    var chatbox = _converse.chatboxes.get(impersonated_jid);
                     expect(chatbox).not.toBeDefined();
                     expect(chatbox).not.toBeDefined();
 
 
                     // Check that the chatbox for the malicous user is not created
                     // Check that the chatbox for the malicous user is not created
-                    chatbox = converse.chatboxes.get(sender_jid);
+                    chatbox = _converse.chatboxes.get(sender_jid);
                     expect(chatbox).not.toBeDefined();
                     expect(chatbox).not.toBeDefined();
                 }));
                 }));
 
 
@@ -989,7 +989,7 @@
                         }).c('body').t(message).up()
                         }).c('body').t(message).up()
                         .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
                         .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
                         _converse.chatboxes.onMessage(msg);
                         _converse.chatboxes.onMessage(msg);
-                        expect(_converse.emit).toHaveBeenCalledWith('message', msg);
+                        expect(_converse.emit).toHaveBeenCalledWith('message', jasmine.any(Object));
                         var trimmed_chatboxes = _converse.minimized_chats;
                         var trimmed_chatboxes = _converse.minimized_chats;
                         var trimmedview = trimmed_chatboxes.get(contact_jid);
                         var trimmedview = trimmed_chatboxes.get(contact_jid);
                         var $count = trimmedview.$el.find('.chat-head-message-count');
                         var $count = trimmedview.$el.find('.chat-head-message-count');
@@ -1050,7 +1050,7 @@
                         .c('delay', { xmlns:'urn:xmpp:delay', from: 'localhost', stamp: one_day_ago.format() })
                         .c('delay', { xmlns:'urn:xmpp:delay', from: 'localhost', stamp: one_day_ago.format() })
                         .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
                         .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
                         _converse.chatboxes.onMessage(msg);
                         _converse.chatboxes.onMessage(msg);
-                        expect(_converse.emit).toHaveBeenCalledWith('message', msg);
+                        expect(_converse.emit).toHaveBeenCalledWith('message', jasmine.any(Object));
                         expect(chatbox.messages.length).toEqual(1);
                         expect(chatbox.messages.length).toEqual(1);
                         msg_obj = chatbox.messages.models[0];
                         msg_obj = chatbox.messages.models[0];
                         expect(msg_obj.get('message')).toEqual(message);
                         expect(msg_obj.get('message')).toEqual(message);
@@ -1077,7 +1077,7 @@
                         }).c('body').t(message).up()
                         }).c('body').t(message).up()
                         .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
                         .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
                         _converse.chatboxes.onMessage(msg);
                         _converse.chatboxes.onMessage(msg);
-                        expect(_converse.emit).toHaveBeenCalledWith('message', msg);
+                        expect(_converse.emit).toHaveBeenCalledWith('message', jasmine.any(Object));
                         // Check that there is a <time> element, with the required
                         // Check that there is a <time> element, with the required
                         // props.
                         // props.
                         $time = $chat_content.find('time');
                         $time = $chat_content.find('time');
@@ -1299,7 +1299,7 @@
                             id: (new Date()).getTime()
                             id: (new Date()).getTime()
                         }).c('composing', {'xmlns': Strophe.NS.CHATSTATES}).tree();
                         }).c('composing', {'xmlns': Strophe.NS.CHATSTATES}).tree();
                     _converse.chatboxes.onMessage(msg);
                     _converse.chatboxes.onMessage(msg);
-                    expect(_converse.emit).toHaveBeenCalledWith('message', msg);
+                    expect(_converse.emit).toHaveBeenCalledWith('message', jasmine.any(Object));
                 }));
                 }));
 
 
                 describe("An active notification", function () {
                 describe("An active notification", function () {
@@ -1414,7 +1414,7 @@
                                 id: (new Date()).getTime()
                                 id: (new Date()).getTime()
                             }).c('body').c('composing', {'xmlns': Strophe.NS.CHATSTATES}).tree();
                             }).c('body').c('composing', {'xmlns': Strophe.NS.CHATSTATES}).tree();
                         _converse.chatboxes.onMessage(msg);
                         _converse.chatboxes.onMessage(msg);
-                        expect(_converse.emit).toHaveBeenCalledWith('message', msg);
+                        expect(_converse.emit).toHaveBeenCalledWith('message', jasmine.any(Object));
                         var chatboxview = _converse.chatboxviews.get(sender_jid);
                         var chatboxview = _converse.chatboxviews.get(sender_jid);
                         expect(chatboxview).toBeDefined();
                         expect(chatboxview).toBeDefined();
                         // Check that the notification appears inside the chatbox in the DOM
                         // Check that the notification appears inside the chatbox in the DOM
@@ -1537,7 +1537,7 @@
                                     id: (new Date()).getTime()
                                     id: (new Date()).getTime()
                                 }).c('body').c('paused', {'xmlns': Strophe.NS.CHATSTATES}).tree();
                                 }).c('body').c('paused', {'xmlns': Strophe.NS.CHATSTATES}).tree();
                             _converse.chatboxes.onMessage(msg);
                             _converse.chatboxes.onMessage(msg);
-                            expect(_converse.emit).toHaveBeenCalledWith('message', msg);
+                            expect(_converse.emit).toHaveBeenCalledWith('message', jasmine.any(Object));
                             var chatboxview = _converse.chatboxviews.get(sender_jid);
                             var chatboxview = _converse.chatboxviews.get(sender_jid);
                             var $events = chatboxview.$el.find('.chat-event');
                             var $events = chatboxview.$el.find('.chat-event');
                             expect($events.text()).toEqual(mock.cur_names[1] + ' has stopped typing');
                             expect($events.text()).toEqual(mock.cur_names[1] + ' has stopped typing');
@@ -1697,7 +1697,7 @@
                                 id: (new Date()).getTime()
                                 id: (new Date()).getTime()
                             }).c('body').c('inactive', {'xmlns': Strophe.NS.CHATSTATES}).tree();
                             }).c('body').c('inactive', {'xmlns': Strophe.NS.CHATSTATES}).tree();
                         _converse.chatboxes.onMessage(msg);
                         _converse.chatboxes.onMessage(msg);
-                        expect(_converse.emit).toHaveBeenCalledWith('message', msg);
+                        expect(_converse.emit).toHaveBeenCalledWith('message', jasmine.any(Object));
                         expect(view.$el.find('.chat-event').length).toBe(0);
                         expect(view.$el.find('.chat-event').length).toBe(0);
                     }));
                     }));
 
 
@@ -1720,7 +1720,7 @@
                                 id: (new Date()).getTime()
                                 id: (new Date()).getTime()
                             }).c('body').c('gone', {'xmlns': Strophe.NS.CHATSTATES}).tree();
                             }).c('body').c('gone', {'xmlns': Strophe.NS.CHATSTATES}).tree();
                         _converse.chatboxes.onMessage(msg);
                         _converse.chatboxes.onMessage(msg);
-                        expect(_converse.emit).toHaveBeenCalledWith('message', msg);
+                        expect(_converse.emit).toHaveBeenCalledWith('message', jasmine.any(Object));
                         var chatboxview = _converse.chatboxviews.get(sender_jid);
                         var chatboxview = _converse.chatboxviews.get(sender_jid);
                         var $events = chatboxview.$el.find('.chat-event');
                         var $events = chatboxview.$el.find('.chat-event');
                         expect($events.text()).toEqual(mock.cur_names[1] + ' has gone away');
                         expect($events.text()).toEqual(mock.cur_names[1] + ' has gone away');
@@ -1789,7 +1789,7 @@
                 _converse.chatboxes.onMessage(msg);
                 _converse.chatboxes.onMessage(msg);
                 expect(_converse.incrementMsgCounter).toHaveBeenCalled();
                 expect(_converse.incrementMsgCounter).toHaveBeenCalled();
                 expect(_converse.msg_counter).toBe(1);
                 expect(_converse.msg_counter).toBe(1);
-                expect(_converse.emit).toHaveBeenCalledWith('message', msg);
+                expect(_converse.emit).toHaveBeenCalledWith('message', jasmine.any(Object));
                 _converse.windowSate = previous_state;
                 _converse.windowSate = previous_state;
             }));
             }));
 
 

+ 1 - 1
spec/chatroom.js

@@ -1038,7 +1038,7 @@
                 var $chat_content = view.$el.find('.chat-content');
                 var $chat_content = view.$el.find('.chat-content');
                 expect($chat_content.find('.chat-message').length).toBe(1);
                 expect($chat_content.find('.chat-message').length).toBe(1);
                 expect($chat_content.find('.chat-msg-content').text()).toBe(text);
                 expect($chat_content.find('.chat-msg-content').text()).toBe(text);
-                expect(_converse.emit).toHaveBeenCalledWith('message', message.nodeTree);
+                expect(_converse.emit).toHaveBeenCalledWith('message', jasmine.any(Object));
             }));
             }));
 
 
             it("shows sent groupchat messages", mock.initConverse(function (_converse) {
             it("shows sent groupchat messages", mock.initConverse(function (_converse) {

+ 28 - 10
spec/controlbox.js

@@ -527,10 +527,11 @@
                     expect(_converse.rosterview.update).toHaveBeenCalled();
                     expect(_converse.rosterview.update).toHaveBeenCalled();
                 }
                 }
                 // Check that they are sorted alphabetically
                 // Check that they are sorted alphabetically
-                t = _converse.rosterview.get('Pending contacts').$el.siblings('dd.pending-xmpp-contact').find('span').text();
+                t = _.reduce(_converse.rosterview.get('Pending contacts').$el.siblings('dd.pending-xmpp-contact').find('span'), function (result, value) {
+                    return result + _.trim(value.textContent);
+                }, '');
                 expect(t).toEqual(mock.pend_names.slice(0,i+1).sort().join(''));
                 expect(t).toEqual(mock.pend_names.slice(0,i+1).sort().join(''));
             }));
             }));
-
         });
         });
 
 
         describe("Existing Contacts", function () {
         describe("Existing Contacts", function () {
@@ -587,7 +588,9 @@
                     return _converse.rosterview.$el.find('dd').length;
                     return _converse.rosterview.$el.find('dd').length;
                 }).then(function () {
                 }).then(function () {
                     // Check that they are sorted alphabetically
                     // Check that they are sorted alphabetically
-                    var t = _converse.rosterview.$el.find('dt.roster-group').siblings('dd.current-xmpp-contact.offline').find('a.open-chat').text();
+                    var t = _.reduce(_converse.rosterview.$('dt.roster-group').siblings('dd.current-xmpp-contact.offline').find('a.open-chat'), function (result, value) {
+                        return result + _.trim(value.textContent);
+                    }, '');
                     expect(t).toEqual(mock.cur_names.slice(0,i+1).sort().join(''));
                     expect(t).toEqual(mock.cur_names.slice(0,i+1).sort().join(''));
                     done();
                     done();
                 });
                 });
@@ -657,12 +660,15 @@
                     var jid, t;
                     var jid, t;
                     spyOn(_converse, 'emit');
                     spyOn(_converse, 'emit');
                     spyOn(_converse.rosterview, 'update').and.callThrough();
                     spyOn(_converse.rosterview, 'update').and.callThrough();
+                    var $roster = _converse.rosterview.$el;
                     for (var i=0; i<mock.cur_names.length; i++) {
                     for (var i=0; i<mock.cur_names.length; i++) {
                         jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
                         jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
                         _converse.roster.get(jid).set('chat_status', 'online');
                         _converse.roster.get(jid).set('chat_status', 'online');
                         expect(_converse.rosterview.update).toHaveBeenCalled();
                         expect(_converse.rosterview.update).toHaveBeenCalled();
                         // Check that they are sorted alphabetically
                         // Check that they are sorted alphabetically
-                        t = _converse.rosterview.$el.find('dt.roster-group').siblings('dd.current-xmpp-contact.online').find('a.open-chat').text();
+                        t = _.reduce($roster.find('dt.roster-group').siblings('dd.current-xmpp-contact.online').find('a.open-chat'), function (result, value) {
+                            return result + _.trim(value.textContent);
+                        }, '');
                         expect(t).toEqual(mock.cur_names.slice(0,i+1).sort().join(''));
                         expect(t).toEqual(mock.cur_names.slice(0,i+1).sort().join(''));
                     }
                     }
                     done();
                     done();
@@ -678,12 +684,15 @@
                     var jid, t;
                     var jid, t;
                     spyOn(_converse, 'emit');
                     spyOn(_converse, 'emit');
                     spyOn(_converse.rosterview, 'update').and.callThrough();
                     spyOn(_converse.rosterview, 'update').and.callThrough();
+                    var $roster = _converse.rosterview.$el;
                     for (var i=0; i<mock.cur_names.length; i++) {
                     for (var i=0; i<mock.cur_names.length; i++) {
                         jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
                         jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
                         _converse.roster.get(jid).set('chat_status', 'dnd');
                         _converse.roster.get(jid).set('chat_status', 'dnd');
                         expect(_converse.rosterview.update).toHaveBeenCalled();
                         expect(_converse.rosterview.update).toHaveBeenCalled();
                         // Check that they are sorted alphabetically
                         // Check that they are sorted alphabetically
-                        t = _converse.rosterview.$el.find('dt.roster-group').siblings('dd.current-xmpp-contact.dnd').find('a.open-chat').text();
+                        t = _.reduce($roster.find('dt.roster-group').siblings('dd.current-xmpp-contact.dnd').find('a.open-chat'), function (result, value) {
+                            return result + _.trim(value.textContent);
+                        }, '');
                         expect(t).toEqual(mock.cur_names.slice(0,i+1).sort().join(''));
                         expect(t).toEqual(mock.cur_names.slice(0,i+1).sort().join(''));
                     }
                     }
                     done();
                     done();
@@ -699,12 +708,15 @@
                     var jid, t;
                     var jid, t;
                     spyOn(_converse, 'emit');
                     spyOn(_converse, 'emit');
                     spyOn(_converse.rosterview, 'update').and.callThrough();
                     spyOn(_converse.rosterview, 'update').and.callThrough();
+                    var $roster = _converse.rosterview.$el;
                     for (var i=0; i<mock.cur_names.length; i++) {
                     for (var i=0; i<mock.cur_names.length; i++) {
                         jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
                         jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
                         _converse.roster.get(jid).set('chat_status', 'away');
                         _converse.roster.get(jid).set('chat_status', 'away');
                         expect(_converse.rosterview.update).toHaveBeenCalled();
                         expect(_converse.rosterview.update).toHaveBeenCalled();
                         // Check that they are sorted alphabetically
                         // Check that they are sorted alphabetically
-                        t = _converse.rosterview.$el.find('dt.roster-group').siblings('dd.current-xmpp-contact.away').find('a.open-chat').text();
+                        t = _.reduce($roster.find('dt.roster-group').siblings('dd.current-xmpp-contact.away').find('a.open-chat'), function (result, value) {
+                            return result + _.trim(value.textContent);
+                        }, '');
                         expect(t).toEqual(mock.cur_names.slice(0,i+1).sort().join(''));
                         expect(t).toEqual(mock.cur_names.slice(0,i+1).sort().join(''));
                     }
                     }
                     done();
                     done();
@@ -720,12 +732,15 @@
                     var jid, t;
                     var jid, t;
                     spyOn(_converse, 'emit');
                     spyOn(_converse, 'emit');
                     spyOn(_converse.rosterview, 'update').and.callThrough();
                     spyOn(_converse.rosterview, 'update').and.callThrough();
+                    var $roster = _converse.rosterview.$el;
                     for (var i=0; i<mock.cur_names.length; i++) {
                     for (var i=0; i<mock.cur_names.length; i++) {
                         jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
                         jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
                         _converse.roster.get(jid).set('chat_status', 'xa');
                         _converse.roster.get(jid).set('chat_status', 'xa');
                         expect(_converse.rosterview.update).toHaveBeenCalled();
                         expect(_converse.rosterview.update).toHaveBeenCalled();
                         // Check that they are sorted alphabetically
                         // Check that they are sorted alphabetically
-                        t = _converse.rosterview.$el.find('dt.roster-group').siblings('dd.current-xmpp-contact.xa').find('a.open-chat').text();
+                        t = _.reduce($roster.find('dt.roster-group').siblings('dd.current-xmpp-contact.xa').find('a.open-chat'), function (result, value) {
+                            return result + _.trim(value.textContent);
+                        }, '');
                         expect(t).toEqual(mock.cur_names.slice(0,i+1).sort().join(''));
                         expect(t).toEqual(mock.cur_names.slice(0,i+1).sort().join(''));
                     }
                     }
                     done();
                     done();
@@ -741,13 +756,16 @@
                     var jid, t;
                     var jid, t;
                     spyOn(_converse, 'emit');
                     spyOn(_converse, 'emit');
                     spyOn(_converse.rosterview, 'update').and.callThrough();
                     spyOn(_converse.rosterview, 'update').and.callThrough();
+                    var $roster = _converse.rosterview.$el;
                     for (var i=0; i<mock.cur_names.length; i++) {
                     for (var i=0; i<mock.cur_names.length; i++) {
                         jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
                         jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
                         _converse.roster.get(jid).set('chat_status', 'unavailable');
                         _converse.roster.get(jid).set('chat_status', 'unavailable');
                         expect(_converse.rosterview.update).toHaveBeenCalled();
                         expect(_converse.rosterview.update).toHaveBeenCalled();
                         // Check that they are sorted alphabetically
                         // Check that they are sorted alphabetically
-                        t = _converse.rosterview.$el.find('dt.roster-group').siblings('dd.current-xmpp-contact.unavailable').find('a.open-chat').text();
-                        expect(t).toEqual(mock.cur_names.slice(0, i+1).sort().join(''));
+                        t = _.reduce($roster.find('dt.roster-group').siblings('dd.current-xmpp-contact.unavailable').find('a.open-chat'), function (result, value) {
+                            return result + _.trim(value.textContent);
+                        }, '');
+                        expect(t).toEqual(mock.cur_names.slice(0,i+1).sort().join(''));
                     }
                     }
                     done();
                     done();
                 });
                 });
@@ -1035,7 +1053,7 @@
                         var $dd = _converse.rosterview.$el.find("dd:contains('"+name+"')").children().first();
                         var $dd = _converse.rosterview.$el.find("dd:contains('"+name+"')").children().first();
                         var dd_text = $dd.text();
                         var dd_text = $dd.text();
                         var dd_title = $dd.attr('title');
                         var dd_title = $dd.attr('title');
-                        expect(dd_text).toBe(name);
+                        expect(_.trim(dd_text)).toBe(name);
                         expect(dd_title).toContain(name);
                         expect(dd_title).toContain(name);
                         expect(dd_title).toContain(jid);
                         expect(dd_title).toContain(jid);
                     }
                     }

+ 7 - 5
src/converse-core.js

@@ -1531,11 +1531,13 @@
                 // Get chat box, but only create a new one when the message has a body.
                 // Get chat box, but only create a new one when the message has a body.
                 chatbox = this.getChatBox(contact_jid, !_.isNull(message.querySelector('body')));
                 chatbox = this.getChatBox(contact_jid, !_.isNull(message.querySelector('body')));
                 msgid = message.getAttribute('id');
                 msgid = message.getAttribute('id');
-                messages = msgid && chatbox.messages.findWhere({msgid: msgid}) || [];
-                if (chatbox && _.isEmpty(messages)) {
-                    // Only create the message when we're sure it's not a
-                    // duplicate
-                    chatbox.createMessage(message, delay, original_stanza);
+                if (chatbox) {
+                    messages = msgid && chatbox.messages.findWhere({msgid: msgid}) || [];
+                    if (_.isEmpty(messages)) {
+                        // Only create the message when we're sure it's not a
+                        // duplicate
+                        chatbox.createMessage(message, delay, original_stanza);
+                    }
                 }
                 }
                 _converse.emit('message', {'stanza': original_stanza, 'chatbox': chatbox});
                 _converse.emit('message', {'stanza': original_stanza, 'chatbox': chatbox});
                 return true;
                 return true;

+ 4 - 3
src/converse-headline.js

@@ -96,13 +96,14 @@
                     if (_.includes(from_jid, '@') && !_converse.allow_non_roster_messaging) {
                     if (_.includes(from_jid, '@') && !_converse.allow_non_roster_messaging) {
                         return;
                         return;
                     }
                     }
-                    _converse.chatboxes.create({
+                    var chatbox = _converse.chatboxes.create({
                         'id': from_jid,
                         'id': from_jid,
                         'jid': from_jid,
                         'jid': from_jid,
                         'fullname':  from_jid,
                         'fullname':  from_jid,
                         'type': 'headline'
                         'type': 'headline'
-                    }).createMessage(message, undefined, message);
-                    _converse.emit('message', message);
+                    });
+                    chatbox.createMessage(message, undefined, message);
+                    _converse.emit('message', {'chatbox': chatbox, 'stanza': message});
                 }
                 }
                 return true;
                 return true;
             };
             };