#!/usr/bin/ruby $:.unshift File::dirname(__FILE__) + '/../../lib' require 'test/unit' require File::dirname(__FILE__) + '/../lib/clienttester' require 'xmpp4r/muc' include Jabber class MUCClientTest < Test::Unit::TestCase include ClientTester def test_new1 m = MUC::MUCClient.new(@client) assert_equal(nil, m.jid) assert_equal(nil, m.my_jid) assert_equal({}, m.roster) assert(!m.active?) end # JEP-0045: 6.3 Entering a Room def test_enter_room state { |pres| assert_kind_of(Presence, pres) assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from) assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/thirdwitch'), pres.to) send("" + "" + "" + "") } state { |pres| assert_kind_of(Presence, pres) assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from) assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/thirdwitch'), pres.to) send("" + "" + "" + "" + "" + "" + "" + "" + "") } m = MUC::MUCClient.new(@client) m.my_jid = 'hag66@shakespeare.lit/pda' assert(!m.active?) assert_nil(m.room) assert_raises(ErrorException) { m.join('darkcave@macbeth.shakespeare.lit/thirdwitch') } assert(!m.active?) assert_nil(m.room) assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch')) assert(m.active?) assert_equal('darkcave', m.room) assert_equal(3, m.roster.size) m.roster.each { |resource,pres| assert_equal(resource, pres.from.resource) assert_equal('darkcave', pres.from.node) assert_equal('macbeth.shakespeare.lit', pres.from.domain) assert_kind_of(String, resource) assert_kind_of(Presence, pres) assert(%w(firstwitch secondwitch thirdwitch).include?(resource)) assert_kind_of(MUC::XMUCUser, pres.x) assert_kind_of(Array, pres.x.items) assert_equal(1, pres.x.items.size) } assert_equal(:owner, m.roster['firstwitch'].x.items[0].affiliation) assert_equal(:moderator, m.roster['firstwitch'].x.items[0].role) assert_equal(:admin, m.roster['secondwitch'].x.items[0].affiliation) assert_equal(:moderator, m.roster['secondwitch'].x.items[0].role) assert_equal(:member, m.roster['thirdwitch'].x.items[0].affiliation) assert_equal(:participant, m.roster['thirdwitch'].x.items[0].role) assert_nil(m.roster['thirdwitch'].x.items[0].jid) send("" + "" + "") sleep 0.1 assert_equal(3, m.roster.size) assert_equal(:none, m.roster['thirdwitch'].x.items[0].affiliation) assert_equal(:participant, m.roster['thirdwitch'].x.items[0].role) assert_equal(JID.new('hag66@shakespeare.lit/pda'), m.roster['thirdwitch'].x.items[0].jid) end def test_enter_room_password state { |pres| assert_kind_of(Presence, pres) send("" + "" + "") } state { |pres| assert_kind_of(Presence, pres) assert_equal('cauldron', pres.x.password) send("" + "" + "") } m = MUC::MUCClient.new(@client) m.my_jid = 'hag66@shakespeare.lit/pda' assert_raises(ErrorException) { m.join('darkcave@macbeth.shakespeare.lit/thirdwitch') } assert(!m.active?) assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch', 'cauldron')) assert(m.active?) end def test_members_only_room state { |pres| assert_kind_of(Presence, pres) send("" + "" + "") } m = MUC::MUCClient.new(@client) m.my_jid = 'hag66@shakespeare.lit/pda' assert_raises(ErrorException) { m.join('darkcave@macbeth.shakespeare.lit/thirdwitch') } assert(!m.active?) end def test_banned_users state { |pres| assert_kind_of(Presence, pres) send("" + "" + "") } m = MUC::MUCClient.new(@client) m.my_jid = 'hag66@shakespeare.lit/pda' assert_raises(ErrorException) { m.join('darkcave@macbeth.shakespeare.lit/thirdwitch') } assert(!m.active?) end def test_nickname_conflict state { |pres| assert_kind_of(Presence, pres) send("" + "" + "") } m = MUC::MUCClient.new(@client) m.my_jid = 'hag66@shakespeare.lit/pda' assert_raises(ErrorException) { m.join('darkcave@macbeth.shakespeare.lit/thirdwitch') } assert(!m.active?) end def test_max_users state { |pres| assert_kind_of(Presence, pres) send("" + "" + "") } m = MUC::MUCClient.new(@client) m.my_jid = 'hag66@shakespeare.lit/pda' assert_raises(ErrorException) { m.join('darkcave@macbeth.shakespeare.lit/thirdwitch') } assert(!m.active?) end def test_locked_room state { |pres| assert_kind_of(Presence, pres) send("" + "" + "") } m = MUC::MUCClient.new(@client) m.my_jid = 'hag66@shakespeare.lit/pda' assert_raises(ErrorException) { m.join('darkcave@macbeth.shakespeare.lit/thirdwitch') } assert(!m.active?) end def test_exit_room state { |pres| assert_kind_of(Presence, pres) assert_nil(pres.type) send("" + "" + "") } state { |pres| assert_kind_of(Presence, pres) assert_equal(:unavailable, pres.type) assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from) assert_nil(pres.status) send("" + "" + "") send("" + "" + "") } ignored_stanzas = 0 @client.add_stanza_callback { |stanza| ignored_stanzas += 1 } m = MUC::MUCClient.new(@client) m.my_jid = 'hag66@shakespeare.lit/pda' assert_equal(0, ignored_stanzas) assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch')) assert(m.active?) assert_equal(0, ignored_stanzas) assert_equal(m, m.exit) assert(!m.active?) assert_equal(1, ignored_stanzas) end def test_custom_exit_message state { |pres| assert_kind_of(Presence, pres) assert_nil(pres.type) send("" + "" + "") } state { |pres| assert_kind_of(Presence, pres) assert_equal(:unavailable, pres.type) assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from) assert_equal('gone where the goblins go', pres.status) send("" + "" + "") } m = MUC::MUCClient.new(@client) m.my_jid = 'hag66@shakespeare.lit/pda' assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch')) assert(m.active?) assert_equal(m, m.exit('gone where the goblins go')) assert(!m.active?) end def test_joins state { |pres| assert_kind_of(Presence, pres) assert_nil(pres.type) assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from) assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/thirdwitch'), pres.to) send("" + "" + "") } state { |pres| assert_kind_of(Presence, pres) assert_equal(:unavailable, pres.type) assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from) assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/thirdwitch'), pres.to) assert_nil(pres.status) send("" + "" + "") } state { |pres| assert_kind_of(Presence, pres) assert_nil(pres.type) assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from) assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/fourthwitch'), pres.to) send("" + "" + "") } state { |pres| assert_kind_of(Presence, pres) assert_equal(:unavailable, pres.type) assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from) assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/fourthwitch'), pres.to) assert_equal(pres.status, 'Exiting one last time') send("" + "" + "") } m = MUC::MUCClient.new(@client) m.my_jid = 'hag66@shakespeare.lit/pda' assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch')) assert(m.active?) assert_raises(RuntimeError) { m.join('darkcave@macbeth.shakespeare.lit/thirdwitch') } assert_raises(RuntimeError) { m.join('darkcave@macbeth.shakespeare.lit/fourthwitch') } assert(m.active?) assert_equal(m, m.exit) assert(!m.active?) assert_raises(RuntimeError) { m.exit } assert(!m.active?) assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/fourthwitch')) assert(m.active?) assert_raises(RuntimeError) { m.join('darkcave@macbeth.shakespeare.lit/thirdwitch') } assert_raises(RuntimeError) { m.join('darkcave@macbeth.shakespeare.lit/fourthwitch') } assert(m.active?) assert_equal(m, m.exit('Exiting one last time')) assert(!m.active?) assert_raises(RuntimeError) { m.exit } assert(!m.active?) end def test_message_callback state { |pres| assert_kind_of(Presence, pres) assert_equal('cauldron', pres.x.password) send("" + "" + "") } message_lock = Mutex.new message_lock.lock messages_client = 0 @client.add_message_callback { |msg| messages_client += 1 message_lock.unlock } m = MUC::MUCClient.new(@client) m.my_jid = 'hag66@shakespeare.lit/pda' messages_muc = 0 m.add_message_callback { |msg| messages_muc += 1 message_lock.unlock } messages_muc_private = 0 m.add_private_message_callback { |msg| messages_muc_private += 1 message_lock.unlock } assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch', 'cauldron')) assert(m.active?) assert_equal(0, messages_client) assert_equal(0, messages_muc) assert_equal(0, messages_muc_private) send("Hello") message_lock.lock assert_equal(0, messages_client) assert_equal(1, messages_muc) assert_equal(0, messages_muc_private) send("Hello") message_lock.lock assert_equal(1, messages_client) assert_equal(1, messages_muc) assert_equal(0, messages_muc_private) send("Hello") message_lock.lock assert_equal(1, messages_client) assert_equal(1, messages_muc) assert_equal(1, messages_muc_private) end def test_presence_callbacks state { |pres| assert_kind_of(Presence, pres) assert_nil(pres.x.password) send("" + "" + "") } presence_lock = Mutex.new presence_lock.lock presences_client = 0 @client.add_presence_callback { |pres| presences_client += 1 presence_lock.unlock } m = MUC::MUCClient.new(@client) m.my_jid = 'hag66@shakespeare.lit/pda' presences_join = 0 m.add_join_callback { |pres| presences_join += 1 presence_lock.unlock } presences_leave = 0 m.add_leave_callback { |pres| presences_leave += 1 presence_lock.unlock } presences_muc = 0 m.add_presence_callback { |pres| presences_muc += 1 presence_lock.unlock } assert_equal(0, presences_client) assert_equal(0, presences_join) assert_equal(0, presences_leave) assert_equal(0, presences_muc) assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch')) assert(m.active?) assert_equal(0, presences_client) assert_equal(0, presences_join) # Joins before own join won't be called back assert_equal(0, presences_leave) assert_equal(0, presences_muc) send("" + "" + "") presence_lock.lock assert_equal(0, presences_client) assert_equal(1, presences_join) assert_equal(0, presences_leave) assert_equal(0, presences_muc) send("" + "chat" + "") presence_lock.lock assert_equal(1, presences_client) assert_equal(1, presences_join) assert_equal(0, presences_leave) assert_equal(0, presences_muc) send("" + "" + "away") presence_lock.lock assert_equal(1, presences_client) assert_equal(1, presences_join) assert_equal(0, presences_leave) assert_equal(1, presences_muc) send("") presence_lock.lock assert_equal(1, presences_client) assert_equal(1, presences_join) assert_equal(1, presences_leave) assert_equal(1, presences_muc) end def test_send state { |pres| assert_kind_of(Presence, pres) assert_nil(pres.x.password) send("" + "" + "") } state { |stanza| assert_kind_of(Message, stanza) assert(:groupchat, stanza.type) assert_equal(JID.new('hag66@shakespeare.lit/pda'), stanza.from) assert_equal(JID.new('darkcave@macbeth.shakespeare.lit'), stanza.to) assert_equal('First message', stanza.body) } state { |stanza| assert_kind_of(Message, stanza) assert(:chat, stanza.type) assert_equal(JID.new('hag66@shakespeare.lit/pda'), stanza.from) assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/secondwitch'), stanza.to) assert_equal('Second message', stanza.body) } state { |stanza| assert_kind_of(Message, stanza) assert(:chat, stanza.type) assert_equal(JID.new('hag66@shakespeare.lit/pda'), stanza.from) assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/firstwitch'), stanza.to) assert_equal('Third message', stanza.body) } m = MUC::MUCClient.new(@client) m.my_jid = 'hag66@shakespeare.lit/pda' assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch')) wait_state assert(m.active?) m.send(Jabber::Message.new(nil, 'First message')) wait_state m.send(Jabber::Message.new(nil, 'Second message'), 'secondwitch') wait_state m.send(Jabber::Message.new('secondwitch', 'Third message'), 'firstwitch') wait_state end def test_nick state { |pres| assert_kind_of(Presence, pres) assert_nil(pres.x.password) send("" + "" + "") } state { |pres| assert_kind_of(Presence, pres) assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from) assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/secondwitch'), pres.to) assert_nil(pres.type) send("" + "" + "") } state { |pres| assert_kind_of(Presence, pres) assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from) assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/oldhag'), pres.to) assert_nil(pres.type) send("" + "" + "" + "" + "" + "" + "" + "" + "") } m = MUC::MUCClient.new(@client) m.my_jid = 'hag66@shakespeare.lit/pda' assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch')) assert(m.active?) assert_equal('thirdwitch', m.nick) assert_raises(ErrorException) { m.nick = 'secondwitch' } assert(m.active?) assert_equal('thirdwitch', m.nick) m.nick = 'oldhag' assert(m.active?) assert_equal('oldhag', m.nick) end end