diff --git a/converse.js b/converse.js
index 1f0766822..51cf1455f 100644
--- a/converse.js
+++ b/converse.js
@@ -2493,6 +2493,7 @@
},
getRoomJID: function () {
+ var room = this.model.get('jid');
var nick = this.model.get('nick');
var node = Strophe.escapeNode(Strophe.getNodeFromJid(room));
var domain = Strophe.getDomainFromJid(room);
@@ -2732,15 +2733,15 @@
});
$(x).find('status').each($.proxy(function (idx, stat) {
var code = stat.getAttribute('code');
- if (is_self && _.contains(_.keys(this.newNicknameMessages), code)) {
- this.model.save({'nick': Strophe.getResourceFromJid($el.attr('from'))});
+ var from_nick = Strophe.unescapeNode(Strophe.getResourceFromJid($el.attr('from')));
+ if (is_self && code === "210") {
+ msgs.push(__(this.newNicknameMessages[code], from_nick));
+ } else if (is_self && code === "303") {
msgs.push(__(this.newNicknameMessages[code], $item.attr('nick')));
} else if (is_self && _.contains(_.keys(this.disconnectMessages), code)) {
disconnect_msgs.push(this.disconnectMessages[code]);
} else if (!is_self && _.contains(_.keys(this.actionInfoMessages), code)) {
- msgs.push(
- __(this.actionInfoMessages[code], Strophe.unescapeNode(Strophe.getResourceFromJid($el.attr('from'))))
- );
+ msgs.push(__(this.actionInfoMessages[code], from_nick));
} else if (_.contains(_.keys(this.infoMessages), code)) {
msgs.push(this.infoMessages[code]);
} else if (code !== '110') {
diff --git a/spec/chatroom.js b/spec/chatroom.js
index f277825d8..a4a4a8a66 100644
--- a/spec/chatroom.js
+++ b/spec/chatroom.js
@@ -2,12 +2,13 @@
define([
"jquery",
"mock",
- "test_utils"
- ], function ($, mock, test_utils) {
- return factory($, mock, test_utils);
+ "test_utils",
+ "utils"
+ ], function ($, mock, test_utils, utils) {
+ return factory($, mock, test_utils, utils);
}
);
-} (this, function ($, mock, test_utils) {
+} (this, function ($, mock, test_utils, utils) {
var $pres = converse_api.env.$pres;
var $msg = converse_api.env.$msg;
@@ -102,7 +103,7 @@
expect(converse.chatboxes.models.length).toBe(1);
expect(converse.chatboxes.models[0].id).toBe("controlbox");
converse.chatboxes.onInvite(message);
- expect(window.confirm).toHaveBeenCalledWith(
+ expect(window.confirm).toHaveBeenCalledWith(
name + ' has invited you to join a chat room: '+ room_jid +
', and left the following reason: "'+reason+'"');
expect(converse.chatboxes.models.length).toBe(2);
@@ -178,7 +179,7 @@
*
*
*
- *
+ *
*
*
*/
+ var __ = $.proxy(utils.__, converse);
test_utils.openChatRoom('lounge', 'localhost', 'oldnick');
- var presence = $pres().attrs({
+ var view = this.chatboxviews.get('lounge@localhost');
+ var $chat_content = view.$el.find('.chat-content');
+ spyOn(view, 'onChatRoomPresence').andCallThrough();
+
+ // The user has just entered the room and receives their own
+ // presence from the server.
+ // See example 24:
+ // http://xmpp.org/extensions/xep-0045.html#enter-pres
+ var presence = $pres({
+ to:'dummy@localhost/pda',
+ from:'lounge@localhost/oldnick',
+ id:'DC352437-C019-40EC-B590-AF29E879AF97'
+ }).c('x').attrs({xmlns:'http://jabber.org/protocol/muc#user'})
+ .c('item').attrs({
+ affiliation: 'member',
+ jid: 'dummy@localhost/pda',
+ role: 'participant'
+ }).up()
+ .c('status').attrs({code:'110'}).up()
+ .c('status').attrs({code:'210'}).nodeTree;
+
+ this.connection._dataRecv(test_utils.createRequest(presence));
+ expect(view.onChatRoomPresence).toHaveBeenCalled();
+ $participants = view.$('.participant-list');
+ expect($participants.children().length).toBe(1);
+ expect($participants.children().first(0).text()).toBe("oldnick");
+ expect($chat_content.find('div.chat-info').length).toBe(1);
+ expect($chat_content.find('div.chat-info').html()).toBe(__(view.newNicknameMessages["210"], "oldnick"));
+
+ presence = $pres().attrs({
from:'lounge@localhost/oldnick',
id:'DC352437-C019-40EC-B590-AF29E879AF98',
to:'dummy@localhost/pda',
@@ -208,13 +239,13 @@
.c('status').attrs({code:'303'}).up()
.c('status').attrs({code:'110'}).nodeTree;
- var view = this.chatboxviews.get('lounge@localhost');
- view.onChatRoomPresence(presence, {nick: 'oldnick', name: 'lounge@localhost'});
- var $chat_content = view.$el.find('.chat-content');
- expect($chat_content.find('div.chat-info').length).toBe(1);
- expect($chat_content.find('div.chat-info').html()).toBe('Your nickname has been changed to: newnick');
+ this.connection._dataRecv(test_utils.createRequest(presence));
+ expect(view.onChatRoomPresence).toHaveBeenCalled();
+ expect($chat_content.find('div.chat-info').length).toBe(2);
+ expect($chat_content.find('div.chat-info').last().html()).toBe(__(view.newNicknameMessages["303"], "newnick"));
+ $participants = view.$('.participant-list');
+ expect($participants.children().length).toBe(0);
- // The second presence shouldn't do anything...
presence = $pres().attrs({
from:'lounge@localhost/newnick',
id:'5B4F27A4-25ED-43F7-A699-382C6B4AFC67',
@@ -227,9 +258,14 @@
role: 'participant'
}).up()
.c('status').attrs({code:'110'}).nodeTree;
- view.onChatRoomPresence(presence, {nick: 'newnick', name: 'lounge@localhost'});
- expect($chat_content.find('div.chat-info').length).toBe(1);
- expect($chat_content.find('div.chat-info').html()).toBe('Your nickname has been changed to: newnick');
+
+ this.connection._dataRecv(test_utils.createRequest(presence));
+ expect(view.onChatRoomPresence).toHaveBeenCalled();
+ expect($chat_content.find('div.chat-info').length).toBe(2);
+ expect($chat_content.find('div.chat-info').last().html()).toBe(__(view.newNicknameMessages["303"], "newnick"));
+ $participants = view.$('.participant-list');
+ expect($participants.children().length).toBe(1);
+ expect($participants.children().first(0).text()).toBe("newnick");
}, converse));
it("informs users if they have been kicked out of the chat room", $.proxy(function () {