#!/usr/bin/ruby
$:.unshift File::dirname(__FILE__) + '/../../lib'
require 'test/unit'
require File::dirname(__FILE__) + '/../lib/clienttester'
require 'xmpp4r'
require 'xmpp4r/pubsub/helper/servicehelper'
include Jabber
# Jabber.debug = true
class PubSub::ServiceHelperTest < Test::Unit::TestCase
include ClientTester
##
# subscribe_to
# examples 30 and 31 from
# http://www.xmpp.org/extensions/xep-0060.html#subscriber-subscribe
def test_subscribe
pubsub = 'pubsub.example.org'
h = PubSub::ServiceHelper.new(@client,pubsub)
assert_kind_of(Jabber::PubSub::ServiceHelper,h)
state { |iq|
assert_kind_of(Jabber::Iq,iq)
assert_equal(:set,iq.type)
assert_equal(pubsub, iq.to.to_s)
assert_equal(@client.jid, iq.from)
assert_equal(1, iq.children.size)
assert_equal('http://jabber.org/protocol/pubsub', iq.pubsub.namespace)
assert_equal(1, iq.pubsub.children.size)
assert_equal('subscribe',iq.pubsub.children.first.name)
assert_equal('princely_musings',iq.pubsub.children.first.attributes['node'])
assert_equal(@client.jid.strip.to_s,iq.pubsub.children.first.attributes['jid'])
send("
")
}
subscription = h.subscribe_to('princely_musings')
assert_kind_of(Jabber::PubSub::Subscription,subscription)
assert_equal(@client.jid.strip,subscription.jid)
assert_equal('princely_musings',subscription.node)
assert_equal('ba49252aaa4f5d320c24d3766f0bdcade78c78d3',subscription.subid)
assert_equal(:subscribed,subscription.subscription)
wait_state
end
##
# subscribe error condition
# example 44 from
# http://www.xmpp.org/extensions/xep-0060.html#subscriber-subscribe-configure
def test_subscribe_configuration_required
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
assert_kind_of(PubSub::ServiceHelper,h)
state { |iq|
assert_kind_of(Jabber::Iq,iq)
assert_equal(:set,iq.type)
assert_equal(1, iq.children.size)
assert_equal('http://jabber.org/protocol/pubsub', iq.pubsub.namespace)
assert_equal(1, iq.pubsub.children.size)
assert_equal('subscribe',iq.pubsub.children.first.name)
assert_equal('princely_musings',iq.pubsub.children.first.attributes['node'])
assert_equal(@client.jid.strip.to_s,iq.pubsub.children.first.attributes['jid'])
send("
")
}
subscription = h.subscribe_to('princely_musings')
assert_kind_of(Jabber::PubSub::Subscription,subscription)
assert_equal(@client.jid.strip,subscription.jid)
assert_equal('princely_musings',subscription.node)
assert_equal('ba49252aaa4f5d320c24d3766f0bdcade78c78d3',subscription.subid)
assert_equal(:unconfigured,subscription.subscription)
wait_state
end
##
# subscribe error condition
# example 43 from
# http://www.xmpp.org/extensions/xep-0060.html#subscriber-subscribe-approval
def test_subscribe_approval_required
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
assert_kind_of(PubSub::ServiceHelper,h)
state { |iq|
assert_kind_of(Jabber::Iq,iq)
assert_equal(:set,iq.type)
assert_equal(1, iq.children.size)
assert_equal('http://jabber.org/protocol/pubsub', iq.pubsub.namespace)
assert_equal(1, iq.pubsub.children.size)
assert_equal('subscribe',iq.pubsub.children.first.name)
assert_equal('princely_musings',iq.pubsub.children.first.attributes['node'])
assert_equal(@client.jid.strip.to_s,iq.pubsub.children.first.attributes['jid'])
send("
")
}
subscription = h.subscribe_to('princely_musings')
assert_kind_of(Jabber::PubSub::Subscription,subscription)
assert_equal(@client.jid.strip,subscription.jid)
assert_equal('princely_musings',subscription.node)
assert_equal('ba49252aaa4f5d320c24d3766f0bdcade78c78d3',subscription.subid)
assert_equal(:pending,subscription.subscription)
assert_equal(true,subscription.need_approval?)
wait_state
end
##
# unsubscribe from
# examples 48 and 49 from
# http://www.xmpp.org/extensions/xep-0060.html#subscriber-unsubscribe-request
def test_unsubscribe
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
assert_kind_of(PubSub::ServiceHelper,h)
state { |iq|
assert_kind_of(Jabber::Iq,iq)
assert_equal(:set,iq.type)
assert_equal(1, iq.children.size)
assert_equal('http://jabber.org/protocol/pubsub', iq.pubsub.namespace)
assert_equal(1, iq.pubsub.children.size)
assert_equal('unsubscribe',iq.pubsub.children.first.name)
assert_equal('princely_musings',iq.pubsub.children.first.attributes['node'])
assert_equal(@client.jid.strip.to_s,iq.pubsub.children.first.attributes['jid'])
send("")
}
unsubscribe = h.unsubscribe_from('princely_musings')
assert_equal(true, unsubscribe)
wait_state
end
##
# get subscription options
# examples 56 and 57 from
# http://www.xmpp.org/extensions/xep-0060.html#subscriber-configure-request
def test_get_subscription_options
pubsub = Jabber::JID.new('pubsub.example.org')
node = 'princely_musings'
jid = Jabber::JID.new('test@test.com/test')
h = PubSub::ServiceHelper.new(@client, pubsub)
state { |iq|
assert_kind_of(Jabber::Iq, iq)
assert_equal(:get, iq.type)
assert_equal(pubsub, iq.to)
assert_kind_of(Jabber::PubSub::SubscriptionConfig, iq.pubsub.first_element('options'))
assert_equal(node, iq.pubsub.first_element('options').node)
assert_equal(jid.strip, iq.pubsub.first_element('options').jid)
send( "
http://jabber.org/protocol/pubsub#subscribe_options
1
")
}
options = h.get_options_from(node, jid)
assert_kind_of(Jabber::PubSub::SubscriptionConfig, options)
assert_equal({'pubsub#deliver'=>'1'}, options.options)
wait_state
end
##
# set subscription options
# examples 65 and 66 from
# http://www.xmpp.org/extensions/xep-0060.html#subscriber-configure-submit
def test_set_subscription_options
pubsub = Jabber::JID.new('pubsub.example.org')
node = 'princely_musings'
jid = Jabber::JID.new('test@test.com/test')
options = {'pubsub#deliver' => '0'}
h = PubSub::ServiceHelper.new(@client, pubsub)
state { |iq|
assert_kind_of(Jabber::Iq, iq)
assert_equal(:set, iq.type)
assert_equal(pubsub, iq.to)
assert_kind_of(Jabber::PubSub::SubscriptionConfig, iq.pubsub.first_element('options'))
assert_equal(node, iq.pubsub.first_element('options').node)
assert_equal(jid.strip, iq.pubsub.first_element('options').jid)
send( "")
}
assert_nothing_raised do
assert_equal(true, h.set_options_for(node, jid, options) )
end
wait_state
end
##
# create node with default configuration
# example 119 and 121 from
# http://www.xmpp.org/extensions/xep-0060.html#owner-create-default
def test_create
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
assert_kind_of(PubSub::ServiceHelper, h)
state { |iq|
assert_kind_of(Jabber::Iq, iq)
assert_equal(:set, iq.type)
assert_equal(1, iq.children.size)
assert_equal('http://jabber.org/protocol/pubsub', iq.pubsub.namespace)
assert_equal(2, iq.pubsub.children.size)
assert_equal('create', iq.pubsub.children.first.name)
assert_equal('mynode', iq.pubsub.children.first.attributes['node'])
assert_equal('configure', iq.pubsub.children[1].name)
assert_equal({}, iq.pubsub.children[1].attributes)
assert_equal([], iq.pubsub.children[1].children)
send("")
}
assert_equal('mynode', h.create_node('mynode'))
wait_state
end
##
# create node with configuration
# example 123 and 124 from
# http://www.xmpp.org/extensions/xep-0060.html#owner-create-and-configure
def test_create_configure
node = 'mynode'
options = {'pubsub#access_model'=>'open'}
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
state { |iq|
assert_kind_of(Jabber::Iq, iq)
assert_equal(:set, iq.type)
assert_equal(1, iq.children.size)
assert_equal('http://jabber.org/protocol/pubsub', iq.pubsub.namespace)
assert_equal(2, iq.pubsub.children.size)
assert_equal('create', iq.pubsub.children.first.name)
assert_equal(node, iq.pubsub.children.first.attributes['node'])
assert_kind_of(Jabber::PubSub::NodeConfig, iq.pubsub.children[1])
assert_equal(options, iq.pubsub.children[1].options)
send("")
}
assert_nothing_raised do
assert_equal(node, h.create_node(node, Jabber::PubSub::NodeConfig.new(node, options)))
end
wait_state
end
##
# create node a collection node
# example 203 and 204 from
# http://www.xmpp.org/extensions/xep-0060.html#collections-createnode
def test_create_collection
node = 'mynode'
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
required_options = {'pubsub#node_type' => 'collection'}
state { |iq|
assert_kind_of(Jabber::Iq, iq)
assert_equal(:set, iq.type)
assert_equal(1, iq.children.size)
assert_equal('http://jabber.org/protocol/pubsub', iq.pubsub.namespace)
assert_equal(2, iq.pubsub.children.size)
assert_equal('create', iq.pubsub.children.first.name)
assert_equal(node, iq.pubsub.children.first.attributes['node'])
assert_kind_of(Jabber::PubSub::NodeConfig, iq.pubsub.children[1])
assert_equal(required_options, iq.pubsub.children[1].options)
send("")
}
assert_equal('mynode', h.create_collection_node('mynode'))
wait_state
end
##
# delete node
# example 144 and 145 from
# http://www.xmpp.org/extensions/xep-0060.html#owner-delete-request
def test_delete
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
state { |iq|
assert_kind_of(Jabber::Iq, iq)
assert_equal(:set, iq.type)
assert_equal(1, iq.children.size)
assert_equal(1, iq.pubsub.children.size)
assert_equal('delete', iq.pubsub.children.first.name)
assert_equal('mynode', iq.pubsub.children.first.attributes['node'])
send("")
}
h.delete_node('mynode')
wait_state
end
##
# publish to a node
# example 88 and 89 from
# http://www.xmpp.org/extensions/xep-0060.html#publisher-publish
def test_publish
node = 'mynode'
item1 = Jabber::PubSub::Item.new
item1.text = 'foobar'
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
state { |iq|
assert_kind_of(Jabber::Iq, iq)
assert_equal(:set, iq.type)
assert_equal(1, iq.children.size)
assert_equal(1, iq.pubsub.children.size)
assert_equal('publish', iq.pubsub.children[0].name)
assert_equal(node, iq.pubsub.children[0].attributes['node'])
assert_equal(1, iq.pubsub.children[0].children.size)
assert_equal('item', iq.pubsub.children[0].children[0].name)
assert_equal(1, iq.pubsub.children[0].children[0].children.size)
assert_equal(item1.children.to_s, iq.pubsub.children[0].children[0].children[0].to_s)
send("")
}
assert_nothing_raised { h.publish_item_to(node, item1) }
wait_state
end
##
# publish item with id
# example 88 and 89 from
# http://www.xmpp.org/extensions/xep-0060.html#publisher-publish
def test_publish_pubsub_item_with_id
item1 = Jabber::PubSub::Item.new
item1.text = 'foobar'
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
state { |iq|
assert_kind_of(Jabber::Iq, iq)
assert_equal(:set, iq.type)
assert_equal(1, iq.children.size)
assert_equal(1, iq.pubsub.children.size)
assert_equal('publish', iq.pubsub.children[0].name)
assert_equal(1, iq.pubsub.children[0].children.size)
assert_equal('item', iq.pubsub.children[0].children[0].name)
assert_equal('blubb', iq.pubsub.children[0].children[0].attributes['id'] )
assert_equal(1, iq.pubsub.children[0].children[0].children.size)
assert_equal(item1.children.to_s, iq.pubsub.children[0].children[0].children[0].to_s)
send("")
}
assert_nothing_raised { h.publish_item_with_id_to('mynode', item1,"blubb") }
wait_state
end
##
# publish item and trap client-side error
# examples 88 from
# http://www.xmpp.org/extensions/xep-0060.html#publisher-publish
def test_publish_pubsub_item_with_id_and_produce_a_local_error
item1 = 'foobarbaz'
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
assert_raise RuntimeError do h.publish_item_with_id_to('mynode', item1,"blubb") end
end
##
# publish item and trap server-side error
# examples 88 from
# http://www.xmpp.org/extensions/xep-0060.html#publisher-publish
# and 93 from
# http://www.xmpp.org/extensions/xep-0060.html#publisher-publish-error-forbidden
def test_publish_pubsub_item_with_id_and_produce_an_error
item1 = Jabber::PubSub::Item.new
item1.text = "foobarbaz"
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
state { |iq|
assert_kind_of(Jabber::Iq, iq)
assert_equal(:set, iq.type)
assert_equal(1, iq.children.size)
assert_equal(1, iq.pubsub.children.size)
assert_equal('publish', iq.pubsub.children[0].name)
assert_equal(1, iq.pubsub.children[0].children.size)
assert_equal('item', iq.pubsub.children[0].children[0].name)
assert_equal('blubb', iq.pubsub.children[0].children[0].attributes['id'] )
assert_equal(1, iq.pubsub.children[0].children[0].children.size)
assert_equal(item1.children.to_s, iq.pubsub.children[0].children[0].children[0].to_s)
send("
")
}
assert_raise Jabber::ServerError do h.publish_item_with_id_to('mynode', item1,"blubb") end
wait_state
end
##
# retrieve all items
# examples 70 and 71 from
# http://www.xmpp.org/extensions/xep-0060.html#subscriber-retrieve-returnall
def test_items
item1 = Jabber::PubSub::Item.new("1")
item1.text = 'foobar'
item2 = Jabber::PubSub::Item.new("2")
item2.text = 'barfoo'
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
state { |iq|
assert_kind_of(Jabber::Iq, iq)
assert_equal(:get, iq.type)
assert_equal(1, iq.pubsub.children.size)
assert_equal('items', iq.pubsub.children.first.name)
assert_equal('mynode', iq.pubsub.children.first.attributes['node'])
send("
#{item1.to_s}
#{item2.to_s}
")
}
items = h.get_items_from('mynode')
assert_equal(2, items.size)
assert_kind_of(REXML::Text, items['1'])
assert_kind_of(REXML::Text, items['2'])
assert_equal(item1.children.join, items['1'].to_s)
assert_equal(item2.children.join, items['2'].to_s)
wait_state
end
##
# get affiliation
# example 184 and 185 from
# http://www.xmpp.org/extensions/xep-0060.html#owner-affiliations-retrieve-success1
def test_affiliations
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
state { |iq|
assert_kind_of(Jabber::Iq, iq)
assert_equal(:get, iq.type)
assert_equal(1, iq.pubsub.children.size)
assert_equal('affiliations', iq.pubsub.children.first.name)
send("
")
}
a = h.get_affiliations
assert_kind_of(Hash, a)
assert_equal(4, a.size)
assert_equal(:owner, a['node1'])
assert_equal(:publisher, a['node2'])
assert_equal(:outcast, a['node5'])
assert_equal(:owner, a['node6'])
wait_state
end
##
# get_subscriptions_from
# example 171 and 172 from
# http://www.xmpp.org/extensions/xep-0060.html#owner-subscriptions-retrieve-request
def test_subscriptions
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
state { |iq|
assert_kind_of(Jabber::Iq, iq)
assert_equal(:get, iq.type)
assert_equal(1, iq.pubsub.children.size)
assert_equal('subscriptions', iq.pubsub.children.first.name)
send("
")
}
s = h.get_subscriptions_from('node1')
assert_kind_of(Array,s)
assert_equal(4,s.size)
assert_kind_of(Jabber::PubSub::Subscription,s[0])
assert_kind_of(Jabber::PubSub::Subscription,s[1])
assert_kind_of(Jabber::PubSub::Subscription,s[2])
assert_kind_of(Jabber::PubSub::Subscription,s[3])
assert_equal(:subscribed,s[0].state)
assert_equal(:unconfigured,s[1].state)
assert_equal(JID.new("hamlet@denmark.lit"),s[0].jid)
assert_equal("123-abc",s[2].subid)
wait_state
end
##
# get_subscribers
# example 171 and 172 from
# http://www.xmpp.org/extensions/xep-0060.html#owner-subscriptions-retrieve
def test_subscribers
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
state { |iq|
assert_kind_of(Jabber::Iq, iq)
assert_equal(:get, iq.type)
assert_equal(1, iq.pubsub.children.size)
assert_equal('subscriptions', iq.pubsub.children.first.name)
send("
")
}
s = h.get_subscribers_from('princely_musings')
assert_equal(4,s.size)
assert_kind_of(Jabber::JID,s[0])
assert_kind_of(Jabber::JID,s[1])
assert_kind_of(Jabber::JID,s[2])
assert_kind_of(Jabber::JID,s[3])
wait_state
end
##
# get_all_subscriptions
def test_get_all_subscriptions
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
state { |iq|
assert_kind_of(Jabber::Iq, iq)
assert_equal(:get, iq.type)
assert_equal(1, iq.pubsub.children.size)
assert_equal('subscriptions', iq.pubsub.children.first.name)
send("
")
}
s = h.get_subscriptions_from_all_nodes
assert_kind_of(Array,s)
assert_equal(4,s.size)
assert_kind_of(Jabber::PubSub::Subscription,s[0])
assert_kind_of(Jabber::PubSub::Subscription,s[1])
assert_kind_of(Jabber::PubSub::Subscription,s[2])
assert_kind_of(Jabber::PubSub::Subscription,s[3])
assert_equal(:subscribed,s[0].state)
assert_equal(:unconfigured,s[2].state)
assert_equal(:pending,s[3].state)
assert_equal(JID.new("francisco@denmark.lit"),s[0].jid)
assert_equal("node1",s[0].node)
wait_state
end
##
# get all subscriptions with no subscriptions
def test_get_all_subscriptions_with_no_subscriptions
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
state { |iq|
assert_kind_of(Jabber::Iq, iq)
assert_equal(:get, iq.type)
assert_equal(1, iq.pubsub.children.size)
assert_equal('subscriptions', iq.pubsub.children.first.name)
send("
")
}
s = h.get_subscriptions_from_all_nodes
assert_kind_of(Array,s)
assert_equal(0,s.size)
wait_state
end
##
# get configuration for a node
# example 125 and 126 from
# http://www.xmpp.org/extensions/xep-0060.html#owner-configure-request
def test_get_node_config
pubsub = 'pubsub.example.org'
h = PubSub::ServiceHelper.new(@client, pubsub)
state { |iq|
assert_kind_of(Jabber::Iq, iq)
assert_equal(:get, iq.type)
assert_equal(pubsub, iq.to.to_s)
assert_kind_of(Jabber::PubSub::OwnerNodeConfig, iq.pubsub.first_element('configure'))
send( "
http://jabber.org/protocol/pubsub#node_config
")
}
config = h.get_config_from('princelymusings')
assert_kind_of(Jabber::PubSub::OwnerNodeConfig, config)
wait_state
end
def test_to_s
h = PubSub::ServiceHelper.new(@client,'pubsub.example.org')
assert_equal('pubsub.example.org',h.to_s)
end
end