tp-blather 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.autotest +13 -0
- data/.gemtest +0 -0
- data/.gitignore +19 -0
- data/.rspec +3 -0
- data/.travis.yml +8 -0
- data/CHANGELOG.md +249 -0
- data/Gemfile +4 -0
- data/Guardfile +5 -0
- data/LICENSE +22 -0
- data/README.md +413 -0
- data/Rakefile +20 -0
- data/TODO.md +2 -0
- data/blather.gemspec +51 -0
- data/examples/certs/README +20 -0
- data/examples/certs/ca-bundle.crt +3987 -0
- data/examples/echo.rb +19 -0
- data/examples/execute.rb +17 -0
- data/examples/ping_pong.rb +38 -0
- data/examples/print_hierarchy.rb +77 -0
- data/examples/rosterprint.rb +15 -0
- data/examples/stream_only.rb +28 -0
- data/examples/trusted_echo.rb +21 -0
- data/examples/xmpp4r/echo.rb +36 -0
- data/lib/blather.rb +112 -0
- data/lib/blather/cert_store.rb +53 -0
- data/lib/blather/client.rb +95 -0
- data/lib/blather/client/client.rb +345 -0
- data/lib/blather/client/dsl.rb +320 -0
- data/lib/blather/client/dsl/pubsub.rb +174 -0
- data/lib/blather/core_ext/eventmachine.rb +125 -0
- data/lib/blather/core_ext/ipaddr.rb +20 -0
- data/lib/blather/errors.rb +69 -0
- data/lib/blather/errors/sasl_error.rb +44 -0
- data/lib/blather/errors/stanza_error.rb +110 -0
- data/lib/blather/errors/stream_error.rb +84 -0
- data/lib/blather/file_transfer.rb +107 -0
- data/lib/blather/file_transfer/ibb.rb +68 -0
- data/lib/blather/file_transfer/s5b.rb +114 -0
- data/lib/blather/jid.rb +141 -0
- data/lib/blather/roster.rb +118 -0
- data/lib/blather/roster_item.rb +146 -0
- data/lib/blather/stanza.rb +167 -0
- data/lib/blather/stanza/disco.rb +32 -0
- data/lib/blather/stanza/disco/capabilities.rb +161 -0
- data/lib/blather/stanza/disco/disco_info.rb +205 -0
- data/lib/blather/stanza/disco/disco_items.rb +134 -0
- data/lib/blather/stanza/iq.rb +144 -0
- data/lib/blather/stanza/iq/command.rb +339 -0
- data/lib/blather/stanza/iq/ibb.rb +86 -0
- data/lib/blather/stanza/iq/ping.rb +50 -0
- data/lib/blather/stanza/iq/query.rb +53 -0
- data/lib/blather/stanza/iq/roster.rb +185 -0
- data/lib/blather/stanza/iq/s5b.rb +208 -0
- data/lib/blather/stanza/iq/si.rb +415 -0
- data/lib/blather/stanza/iq/vcard.rb +149 -0
- data/lib/blather/stanza/message.rb +428 -0
- data/lib/blather/stanza/message/muc_user.rb +119 -0
- data/lib/blather/stanza/muc/muc_user_base.rb +54 -0
- data/lib/blather/stanza/presence.rb +172 -0
- data/lib/blather/stanza/presence/c.rb +100 -0
- data/lib/blather/stanza/presence/muc.rb +35 -0
- data/lib/blather/stanza/presence/muc_user.rb +147 -0
- data/lib/blather/stanza/presence/status.rb +218 -0
- data/lib/blather/stanza/presence/subscription.rb +100 -0
- data/lib/blather/stanza/pubsub.rb +119 -0
- data/lib/blather/stanza/pubsub/affiliations.rb +79 -0
- data/lib/blather/stanza/pubsub/create.rb +65 -0
- data/lib/blather/stanza/pubsub/errors.rb +18 -0
- data/lib/blather/stanza/pubsub/event.rb +139 -0
- data/lib/blather/stanza/pubsub/items.rb +103 -0
- data/lib/blather/stanza/pubsub/publish.rb +103 -0
- data/lib/blather/stanza/pubsub/retract.rb +92 -0
- data/lib/blather/stanza/pubsub/subscribe.rb +68 -0
- data/lib/blather/stanza/pubsub/subscription.rb +135 -0
- data/lib/blather/stanza/pubsub/subscriptions.rb +83 -0
- data/lib/blather/stanza/pubsub/unsubscribe.rb +84 -0
- data/lib/blather/stanza/pubsub_owner.rb +51 -0
- data/lib/blather/stanza/pubsub_owner/delete.rb +52 -0
- data/lib/blather/stanza/pubsub_owner/purge.rb +52 -0
- data/lib/blather/stanza/x.rb +416 -0
- data/lib/blather/stream.rb +266 -0
- data/lib/blather/stream/client.rb +32 -0
- data/lib/blather/stream/component.rb +39 -0
- data/lib/blather/stream/features.rb +70 -0
- data/lib/blather/stream/features/register.rb +38 -0
- data/lib/blather/stream/features/resource.rb +63 -0
- data/lib/blather/stream/features/sasl.rb +190 -0
- data/lib/blather/stream/features/session.rb +45 -0
- data/lib/blather/stream/features/tls.rb +29 -0
- data/lib/blather/stream/parser.rb +102 -0
- data/lib/blather/version.rb +3 -0
- data/lib/blather/xmpp_node.rb +94 -0
- data/spec/blather/client/client_spec.rb +687 -0
- data/spec/blather/client/dsl/pubsub_spec.rb +492 -0
- data/spec/blather/client/dsl_spec.rb +266 -0
- data/spec/blather/errors/sasl_error_spec.rb +33 -0
- data/spec/blather/errors/stanza_error_spec.rb +129 -0
- data/spec/blather/errors/stream_error_spec.rb +108 -0
- data/spec/blather/errors_spec.rb +33 -0
- data/spec/blather/file_transfer_spec.rb +135 -0
- data/spec/blather/jid_spec.rb +87 -0
- data/spec/blather/roster_item_spec.rb +134 -0
- data/spec/blather/roster_spec.rb +107 -0
- data/spec/blather/stanza/discos/disco_info_spec.rb +247 -0
- data/spec/blather/stanza/discos/disco_items_spec.rb +154 -0
- data/spec/blather/stanza/iq/command_spec.rb +206 -0
- data/spec/blather/stanza/iq/ibb_spec.rb +124 -0
- data/spec/blather/stanza/iq/ping_spec.rb +45 -0
- data/spec/blather/stanza/iq/query_spec.rb +64 -0
- data/spec/blather/stanza/iq/roster_spec.rb +139 -0
- data/spec/blather/stanza/iq/s5b_spec.rb +57 -0
- data/spec/blather/stanza/iq/si_spec.rb +98 -0
- data/spec/blather/stanza/iq/vcard_spec.rb +93 -0
- data/spec/blather/stanza/iq_spec.rb +61 -0
- data/spec/blather/stanza/message/muc_user_spec.rb +152 -0
- data/spec/blather/stanza/message_spec.rb +282 -0
- data/spec/blather/stanza/presence/c_spec.rb +56 -0
- data/spec/blather/stanza/presence/muc_spec.rb +37 -0
- data/spec/blather/stanza/presence/muc_user_spec.rb +83 -0
- data/spec/blather/stanza/presence/status_spec.rb +144 -0
- data/spec/blather/stanza/presence/subscription_spec.rb +102 -0
- data/spec/blather/stanza/presence_spec.rb +125 -0
- data/spec/blather/stanza/pubsub/affiliations_spec.rb +57 -0
- data/spec/blather/stanza/pubsub/create_spec.rb +56 -0
- data/spec/blather/stanza/pubsub/event_spec.rb +98 -0
- data/spec/blather/stanza/pubsub/items_spec.rb +79 -0
- data/spec/blather/stanza/pubsub/publish_spec.rb +83 -0
- data/spec/blather/stanza/pubsub/retract_spec.rb +75 -0
- data/spec/blather/stanza/pubsub/subscribe_spec.rb +61 -0
- data/spec/blather/stanza/pubsub/subscription_spec.rb +97 -0
- data/spec/blather/stanza/pubsub/subscriptions_spec.rb +59 -0
- data/spec/blather/stanza/pubsub/unsubscribe_spec.rb +74 -0
- data/spec/blather/stanza/pubsub_owner/delete_spec.rb +50 -0
- data/spec/blather/stanza/pubsub_owner/purge_spec.rb +50 -0
- data/spec/blather/stanza/pubsub_owner_spec.rb +27 -0
- data/spec/blather/stanza/pubsub_spec.rb +68 -0
- data/spec/blather/stanza/x_spec.rb +231 -0
- data/spec/blather/stanza_spec.rb +134 -0
- data/spec/blather/stream/client_spec.rb +1090 -0
- data/spec/blather/stream/component_spec.rb +108 -0
- data/spec/blather/stream/parser_spec.rb +152 -0
- data/spec/blather/stream/ssl_spec.rb +32 -0
- data/spec/blather/xmpp_node_spec.rb +47 -0
- data/spec/blather_spec.rb +34 -0
- data/spec/fixtures/pubsub.rb +311 -0
- data/spec/spec_helper.rb +17 -0
- data/yard/templates/default/class/html/handlers.erb +18 -0
- data/yard/templates/default/class/setup.rb +10 -0
- data/yard/templates/default/class/text/handlers.erb +1 -0
- metadata +459 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
def ibb_open_xml
|
|
4
|
+
<<-XML
|
|
5
|
+
<iq from='romeo@montague.net/orchard'
|
|
6
|
+
id='jn3h8g65'
|
|
7
|
+
to='juliet@capulet.com/balcony'
|
|
8
|
+
type='set'>
|
|
9
|
+
<open xmlns='http://jabber.org/protocol/ibb'
|
|
10
|
+
block-size='4096'
|
|
11
|
+
sid='i781hf64'
|
|
12
|
+
stanza='iq'/>
|
|
13
|
+
</iq>
|
|
14
|
+
XML
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def ibb_data_xml
|
|
18
|
+
<<-XML
|
|
19
|
+
<iq from='romeo@montague.net/orchard'
|
|
20
|
+
id='kr91n475'
|
|
21
|
+
to='juliet@capulet.com/balcony'
|
|
22
|
+
type='set'>
|
|
23
|
+
<data xmlns='http://jabber.org/protocol/ibb' seq='0' sid='i781hf64'>
|
|
24
|
+
qANQR1DBwU4DX7jmYZnncmUQB/9KuKBddzQH+tZ1ZywKK0yHKnq57kWq+RFtQdCJ
|
|
25
|
+
WpdWpR0uQsuJe7+vh3NWn59/gTc5MDlX8dS9p0ovStmNcyLhxVgmqS8ZKhsblVeu
|
|
26
|
+
IpQ0JgavABqibJolc3BKrVtVV1igKiX/N7Pi8RtY1K18toaMDhdEfhBRzO/XB0+P
|
|
27
|
+
AQhYlRjNacGcslkhXqNjK5Va4tuOAPy2n1Q8UUrHbUd0g+xJ9Bm0G0LZXyvCWyKH
|
|
28
|
+
kuNEHFQiLuCY6Iv0myq6iX6tjuHehZlFSh80b5BVV9tNLwNR5Eqz1klxMhoghJOA
|
|
29
|
+
</data>
|
|
30
|
+
</iq>
|
|
31
|
+
XML
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def ibb_close_xml
|
|
35
|
+
<<-XML
|
|
36
|
+
<iq from='romeo@montague.net/orchard'
|
|
37
|
+
id='us71g45j'
|
|
38
|
+
to='juliet@capulet.com/balcony'
|
|
39
|
+
type='set'>
|
|
40
|
+
<close xmlns='http://jabber.org/protocol/ibb' sid='i781hf64'/>
|
|
41
|
+
</iq>
|
|
42
|
+
XML
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
describe Blather::Stanza::Iq::Ibb::Open do
|
|
46
|
+
it 'registers itself' do
|
|
47
|
+
Blather::XMPPNode.class_from_registration(:open, 'http://jabber.org/protocol/ibb').should == Blather::Stanza::Iq::Ibb::Open
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it 'can be imported' do
|
|
51
|
+
node = Blather::XMPPNode.parse ibb_open_xml
|
|
52
|
+
node.should be_instance_of Blather::Stanza::Iq::Ibb::Open
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it 'has open node' do
|
|
56
|
+
node = Blather::XMPPNode.parse ibb_open_xml
|
|
57
|
+
node.open.should be_kind_of Nokogiri::XML::Element
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it 'can get sid' do
|
|
61
|
+
node = Blather::XMPPNode.parse ibb_open_xml
|
|
62
|
+
node.sid.should == 'i781hf64'
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it 'deleted open node on reply' do
|
|
66
|
+
node = Blather::XMPPNode.parse ibb_open_xml
|
|
67
|
+
reply = node.reply
|
|
68
|
+
reply.open.should be_nil
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
describe Blather::Stanza::Iq::Ibb::Data do
|
|
73
|
+
it 'registers itself' do
|
|
74
|
+
Blather::XMPPNode.class_from_registration(:data, 'http://jabber.org/protocol/ibb').should == Blather::Stanza::Iq::Ibb::Data
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it 'can be imported' do
|
|
78
|
+
node = Blather::XMPPNode.parse ibb_data_xml
|
|
79
|
+
node.should be_instance_of Blather::Stanza::Iq::Ibb::Data
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it 'has data node' do
|
|
83
|
+
node = Blather::XMPPNode.parse ibb_data_xml
|
|
84
|
+
node.data.should be_kind_of Nokogiri::XML::Element
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it 'can get sid' do
|
|
88
|
+
node = Blather::XMPPNode.parse ibb_data_xml
|
|
89
|
+
node.sid.should == 'i781hf64'
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it 'deleted data node on reply' do
|
|
93
|
+
node = Blather::XMPPNode.parse ibb_data_xml
|
|
94
|
+
reply = node.reply
|
|
95
|
+
reply.data.should be_nil
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
describe Blather::Stanza::Iq::Ibb::Close do
|
|
100
|
+
it 'registers itself' do
|
|
101
|
+
Blather::XMPPNode.class_from_registration(:close, 'http://jabber.org/protocol/ibb').should == Blather::Stanza::Iq::Ibb::Close
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it 'can be imported' do
|
|
105
|
+
node = Blather::XMPPNode.parse ibb_close_xml
|
|
106
|
+
node.should be_instance_of Blather::Stanza::Iq::Ibb::Close
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it 'has close node' do
|
|
110
|
+
node = Blather::XMPPNode.parse ibb_close_xml
|
|
111
|
+
node.close.should be_kind_of Nokogiri::XML::Element
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it 'can get sid' do
|
|
115
|
+
node = Blather::XMPPNode.parse ibb_close_xml
|
|
116
|
+
node.sid.should == 'i781hf64'
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it 'deleted close node on reply' do
|
|
120
|
+
node = Blather::XMPPNode.parse ibb_close_xml
|
|
121
|
+
reply = node.reply
|
|
122
|
+
reply.close.should be_nil
|
|
123
|
+
end
|
|
124
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
def ping_xml
|
|
4
|
+
<<-XML
|
|
5
|
+
<iq from='capulet.lit' to='juliet@capulet.lit/balcony' id='s2c1' type='get'>
|
|
6
|
+
<ping xmlns='urn:xmpp:ping'/>
|
|
7
|
+
</iq>
|
|
8
|
+
XML
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
describe Blather::Stanza::Iq::Ping do
|
|
12
|
+
it 'registers itself' do
|
|
13
|
+
Blather::XMPPNode.class_from_registration(:ping, 'urn:xmpp:ping').should == Blather::Stanza::Iq::Ping
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it 'can be imported' do
|
|
17
|
+
node = Blather::XMPPNode.parse ping_xml
|
|
18
|
+
node.should be_instance_of Blather::Stanza::Iq::Ping
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it 'ensures a ping node is present on create' do
|
|
22
|
+
iq = Blather::Stanza::Iq::Ping.new
|
|
23
|
+
iq.xpath('ns:ping', :ns => 'urn:xmpp:ping').should_not be_empty
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'ensures a ping node exists when calling #ping' do
|
|
27
|
+
iq = Blather::Stanza::Iq::Ping.new
|
|
28
|
+
iq.ping.remove
|
|
29
|
+
iq.xpath('ns:ping', :ns => 'urn:xmpp:ping').should be_empty
|
|
30
|
+
|
|
31
|
+
iq.ping.should_not be_nil
|
|
32
|
+
iq.xpath('ns:ping', :ns => 'urn:xmpp:ping').should_not be_empty
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it 'responds with an empty IQ' do
|
|
36
|
+
ping = Blather::Stanza::Iq::Ping.new :get, 'one@example.com', 'abc123'
|
|
37
|
+
ping.from = 'two@example.com'
|
|
38
|
+
expected_pong = Blather::Stanza::Iq::Ping.new(:result, 'two@example.com', 'abc123').tap do |pong|
|
|
39
|
+
pong.from = 'one@example.com'
|
|
40
|
+
end
|
|
41
|
+
reply = ping.reply
|
|
42
|
+
reply.should == expected_pong
|
|
43
|
+
reply.children.count.should == 0
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Blather::Stanza::Iq::Query do
|
|
4
|
+
it 'registers itself' do
|
|
5
|
+
Blather::XMPPNode.class_from_registration(:query, nil).should == Blather::Stanza::Iq::Query
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it 'can be imported' do
|
|
9
|
+
string = <<-XML
|
|
10
|
+
<iq from='juliet@example.com/balcony' type='set' id='roster_4'>
|
|
11
|
+
<query>
|
|
12
|
+
<item jid='nurse@example.com' subscription='remove'/>
|
|
13
|
+
</query>
|
|
14
|
+
</iq>
|
|
15
|
+
XML
|
|
16
|
+
Blather::XMPPNode.parse(string).should be_instance_of Blather::Stanza::Iq::Query
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'ensures a query node is present on create' do
|
|
20
|
+
query = Blather::Stanza::Iq::Query.new
|
|
21
|
+
query.xpath('query').should_not be_empty
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'ensures a query node exists when calling #query' do
|
|
25
|
+
query = Blather::Stanza::Iq::Query.new
|
|
26
|
+
query.remove_child :query
|
|
27
|
+
query.xpath('query').should be_empty
|
|
28
|
+
|
|
29
|
+
query.query.should_not be_nil
|
|
30
|
+
query.xpath('query').should_not be_empty
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
[:get, :set, :result, :error].each do |type|
|
|
34
|
+
it "can be set as \"#{type}\"" do
|
|
35
|
+
query = Blather::Stanza::Iq::Query.new type
|
|
36
|
+
query.type.should == type
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it 'sets type to "result" on reply' do
|
|
41
|
+
query = Blather::Stanza::Iq::Query.new
|
|
42
|
+
query.type.should == :get
|
|
43
|
+
reply = query.reply.type.should == :result
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'sets type to "result" on reply!' do
|
|
47
|
+
query = Blather::Stanza::Iq::Query.new
|
|
48
|
+
query.type.should == :get
|
|
49
|
+
query.reply!
|
|
50
|
+
query.type.should == :result
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it 'can be registered under a namespace' do
|
|
54
|
+
class QueryNs < Blather::Stanza::Iq::Query; register :query_ns, nil, 'query:ns'; end
|
|
55
|
+
Blather::XMPPNode.class_from_registration(:query, 'query:ns').should == QueryNs
|
|
56
|
+
query_ns = QueryNs.new
|
|
57
|
+
query_ns.xpath('query').should be_empty
|
|
58
|
+
query_ns.xpath('ns:query', :ns => 'query:ns').size.should == 1
|
|
59
|
+
|
|
60
|
+
query_ns.query
|
|
61
|
+
query_ns.query
|
|
62
|
+
query_ns.xpath('ns:query', :ns => 'query:ns').size.should == 1
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
def roster_xml
|
|
4
|
+
<<-XML
|
|
5
|
+
<iq to='juliet@example.com/balcony' type='result' id='roster_1'>
|
|
6
|
+
<query xmlns='jabber:iq:roster'>
|
|
7
|
+
<item jid='romeo@example.net'
|
|
8
|
+
name='Romeo'
|
|
9
|
+
subscription='both'>
|
|
10
|
+
<group>Friends</group>
|
|
11
|
+
</item>
|
|
12
|
+
<item jid='mercutio@example.org'
|
|
13
|
+
name='Mercutio'
|
|
14
|
+
subscription='from'>
|
|
15
|
+
<group>Friends</group>
|
|
16
|
+
</item>
|
|
17
|
+
<item jid='benvolio@example.org'
|
|
18
|
+
name='Benvolio'
|
|
19
|
+
subscription='both'>
|
|
20
|
+
<group>Friends</group>
|
|
21
|
+
</item>
|
|
22
|
+
</query>
|
|
23
|
+
</iq>
|
|
24
|
+
XML
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe Blather::Stanza::Iq::Roster do
|
|
28
|
+
it 'registers itself' do
|
|
29
|
+
Blather::XMPPNode.class_from_registration(:query, 'jabber:iq:roster').should == Blather::Stanza::Iq::Roster
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it 'ensures newly inherited items are RosterItem objects' do
|
|
33
|
+
n = parse_stanza roster_xml
|
|
34
|
+
r = Blather::Stanza::Iq::Roster.new.inherit n.root
|
|
35
|
+
r.items.map { |i| i.class }.uniq.should == [Blather::Stanza::Iq::Roster::RosterItem]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it 'can be created with #import' do
|
|
39
|
+
Blather::XMPPNode.parse(roster_xml).should be_instance_of Blather::Stanza::Iq::Roster
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe Blather::Stanza::Iq::Roster::RosterItem do
|
|
44
|
+
it 'can be initialized with just a Blather::JID' do
|
|
45
|
+
i = Blather::Stanza::Iq::Roster::RosterItem.new 'n@d/r'
|
|
46
|
+
i.jid.should == Blather::JID.new('n@d/r').stripped
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it 'can be initialized with a name' do
|
|
50
|
+
i = Blather::Stanza::Iq::Roster::RosterItem.new nil, 'foobar'
|
|
51
|
+
i.name.should == 'foobar'
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it 'can be initialized with a subscription' do
|
|
55
|
+
i = Blather::Stanza::Iq::Roster::RosterItem.new nil, nil, :both
|
|
56
|
+
i.subscription.should == :both
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it 'can be initialized with ask (subscription sub-type)' do
|
|
60
|
+
i = Blather::Stanza::Iq::Roster::RosterItem.new nil, nil, nil, :subscribe
|
|
61
|
+
i.ask.should == :subscribe
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it 'can be initailized with a hash' do
|
|
65
|
+
control = { :jid => 'j@d/r',
|
|
66
|
+
:name => 'name',
|
|
67
|
+
:subscription => :both,
|
|
68
|
+
:ask => :subscribe }
|
|
69
|
+
i = Blather::Stanza::Iq::Roster::RosterItem.new control
|
|
70
|
+
i.jid.should == Blather::JID.new(control[:jid]).stripped
|
|
71
|
+
i.name.should == control[:name]
|
|
72
|
+
i.subscription.should == control[:subscription]
|
|
73
|
+
i.ask.should == control[:ask]
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it 'inherits a node when initialized with one' do
|
|
77
|
+
n = Blather::XMPPNode.new 'item'
|
|
78
|
+
n[:jid] = 'n@d/r'
|
|
79
|
+
n[:subscription] = 'both'
|
|
80
|
+
|
|
81
|
+
i = Blather::Stanza::Iq::Roster::RosterItem.new n
|
|
82
|
+
i.jid.should == Blather::JID.new('n@d/r')
|
|
83
|
+
i.subscription.should == :both
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it 'has a #groups helper that gives an array of groups' do
|
|
87
|
+
n = parse_stanza "<item jid='romeo@example.net' subscription='both'><group>foo</group><group>bar</group><group>baz</group></item>"
|
|
88
|
+
i = Blather::Stanza::Iq::Roster::RosterItem.new n.root
|
|
89
|
+
i.should respond_to :groups
|
|
90
|
+
i.groups.sort.should == %w[bar baz foo]
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it 'has a helper to set the groups' do
|
|
94
|
+
n = parse_stanza "<item jid='romeo@example.net' subscription='both'><group>foo</group><group>bar</group><group>baz</group></item>"
|
|
95
|
+
i = Blather::Stanza::Iq::Roster::RosterItem.new n.root
|
|
96
|
+
i.should respond_to :groups=
|
|
97
|
+
i.groups.sort.should == %w[bar baz foo]
|
|
98
|
+
i.groups = %w[a b c]
|
|
99
|
+
i.groups.sort.should == %w[a b c]
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it 'can be easily converted into a proper stanza' do
|
|
103
|
+
xml = "<item jid='romeo@example.net' subscription='both'><group>foo</group><group>bar</group><group>baz</group></item>"
|
|
104
|
+
n = parse_stanza xml
|
|
105
|
+
i = Blather::Stanza::Iq::Roster::RosterItem.new n.root
|
|
106
|
+
i.should respond_to :to_stanza
|
|
107
|
+
s = i.to_stanza
|
|
108
|
+
s.should be_kind_of Blather::Stanza::Iq::Roster
|
|
109
|
+
s.items.first.jid.should == Blather::JID.new('romeo@example.net')
|
|
110
|
+
s.items.first.groups.sort.should == %w[bar baz foo]
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it 'has an "attr_accessor" for jid' do
|
|
114
|
+
i = Blather::Stanza::Iq::Roster::RosterItem.new
|
|
115
|
+
i.should respond_to :jid
|
|
116
|
+
i.jid.should be_nil
|
|
117
|
+
i.should respond_to :jid=
|
|
118
|
+
i.jid = 'n@d/r'
|
|
119
|
+
i.jid.should == Blather::JID.new('n@d/r').stripped
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it 'has a name attribute' do
|
|
123
|
+
i = Blather::Stanza::Iq::Roster::RosterItem.new
|
|
124
|
+
i.name = 'name'
|
|
125
|
+
i.name.should == 'name'
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
it 'has a subscription attribute' do
|
|
129
|
+
i = Blather::Stanza::Iq::Roster::RosterItem.new
|
|
130
|
+
i.subscription = :both
|
|
131
|
+
i.subscription.should == :both
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it 'has an ask attribute' do
|
|
135
|
+
i = Blather::Stanza::Iq::Roster::RosterItem.new
|
|
136
|
+
i.ask = :subscribe
|
|
137
|
+
i.ask.should == :subscribe
|
|
138
|
+
end
|
|
139
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
def s5b_open_xml
|
|
4
|
+
<<-XML
|
|
5
|
+
<iq from='requester@example.com/foo'
|
|
6
|
+
id='hu3vax16'
|
|
7
|
+
to='target@example.org/bar'
|
|
8
|
+
type='set'>
|
|
9
|
+
<query xmlns='http://jabber.org/protocol/bytestreams'
|
|
10
|
+
sid='vxf9n471bn46'>
|
|
11
|
+
<streamhost
|
|
12
|
+
jid='requester@example.com/foo'
|
|
13
|
+
host='192.168.4.1'
|
|
14
|
+
port='5086'/>
|
|
15
|
+
<streamhost
|
|
16
|
+
jid='requester2@example.com/foo'
|
|
17
|
+
host='192.168.4.2'
|
|
18
|
+
port='5087'/>
|
|
19
|
+
</query>
|
|
20
|
+
</iq>
|
|
21
|
+
XML
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe Blather::Stanza::Iq::S5b do
|
|
25
|
+
it 'registers itself' do
|
|
26
|
+
Blather::XMPPNode.class_from_registration(:query, 'http://jabber.org/protocol/bytestreams').should == Blather::Stanza::Iq::S5b
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'can be imported' do
|
|
30
|
+
node = Blather::XMPPNode.parse s5b_open_xml
|
|
31
|
+
node.should be_instance_of Blather::Stanza::Iq::S5b
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it 'can get sid' do
|
|
35
|
+
node = Blather::XMPPNode.parse s5b_open_xml
|
|
36
|
+
node.sid.should == 'vxf9n471bn46'
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it 'can get streamhosts' do
|
|
40
|
+
node = Blather::XMPPNode.parse s5b_open_xml
|
|
41
|
+
node.streamhosts.size.should == 2
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it 'can set streamhosts' do
|
|
45
|
+
node = Blather::Stanza::Iq::S5b.new
|
|
46
|
+
node.streamhosts += [{:jid => 'test@example.com/foo', :host => '192.168.5.1', :port => 123}]
|
|
47
|
+
node.streamhosts.size.should == 1
|
|
48
|
+
node.streamhosts += [Blather::Stanza::Iq::S5b::StreamHost.new('test2@example.com/foo', '192.168.5.2', 123)]
|
|
49
|
+
node.streamhosts.size.should == 2
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it 'can get and set streamhost-used' do
|
|
53
|
+
node = Blather::Stanza::Iq::S5b.new
|
|
54
|
+
node.streamhost_used = 'used@example.com/foo'
|
|
55
|
+
node.streamhost_used.jid.to_s.should == 'used@example.com/foo'
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
def si_xml
|
|
4
|
+
<<-XML
|
|
5
|
+
<iq type='set' id='offer1' to='juliet@capulet.com/balcony' from='romeo@montague.net/orchard'>
|
|
6
|
+
<si xmlns='http://jabber.org/protocol/si'
|
|
7
|
+
id='a0'
|
|
8
|
+
mime-type='text/plain'
|
|
9
|
+
profile='http://jabber.org/protocol/si/profile/file-transfer'>
|
|
10
|
+
<file xmlns='http://jabber.org/protocol/si/profile/file-transfer'
|
|
11
|
+
name='test.txt'
|
|
12
|
+
size='1022'>
|
|
13
|
+
<range/>
|
|
14
|
+
</file>
|
|
15
|
+
<feature xmlns='http://jabber.org/protocol/feature-neg'>
|
|
16
|
+
<x xmlns='jabber:x:data' type='form'>
|
|
17
|
+
<field var='stream-method' type='list-single'>
|
|
18
|
+
<option><value>http://jabber.org/protocol/bytestreams</value></option>
|
|
19
|
+
<option><value>http://jabber.org/protocol/ibb</value></option>
|
|
20
|
+
</field>
|
|
21
|
+
</x>
|
|
22
|
+
</feature>
|
|
23
|
+
</si>
|
|
24
|
+
</iq>
|
|
25
|
+
XML
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe Blather::Stanza::Iq::Si do
|
|
29
|
+
it 'registers itself' do
|
|
30
|
+
Blather::XMPPNode.class_from_registration(:si, 'http://jabber.org/protocol/si').should == Blather::Stanza::Iq::Si
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it 'can be imported' do
|
|
34
|
+
node = Blather::XMPPNode.parse si_xml
|
|
35
|
+
node.should be_instance_of Blather::Stanza::Iq::Si
|
|
36
|
+
node.si.should be_instance_of Blather::Stanza::Iq::Si::Si
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it 'ensures a si node is present on create' do
|
|
40
|
+
iq = Blather::Stanza::Iq::Si.new
|
|
41
|
+
iq.xpath('ns:si', :ns => 'http://jabber.org/protocol/si').should_not be_empty
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it 'ensures a si node exists when calling #si' do
|
|
45
|
+
iq = Blather::Stanza::Iq::Si.new
|
|
46
|
+
iq.si.remove
|
|
47
|
+
iq.xpath('ns:si', :ns => 'http://jabber.org/protocol/si').should be_empty
|
|
48
|
+
|
|
49
|
+
iq.si.should_not be_nil
|
|
50
|
+
iq.xpath('ns:si', :ns => 'http://jabber.org/protocol/si').should_not be_empty
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it 'ensures a si node is replaced when calling #si=' do
|
|
54
|
+
iq = Blather::XMPPNode.parse si_xml
|
|
55
|
+
|
|
56
|
+
new_si = Blather::Stanza::Iq::Si::Si.new
|
|
57
|
+
new_si.id = 'a1'
|
|
58
|
+
|
|
59
|
+
iq.si = new_si
|
|
60
|
+
|
|
61
|
+
iq.xpath('ns:si', :ns => 'http://jabber.org/protocol/si').size.should == 1
|
|
62
|
+
iq.si.id.should == 'a1'
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
describe Blather::Stanza::Iq::Si::Si do
|
|
67
|
+
it 'can set and get attributes' do
|
|
68
|
+
si = Blather::Stanza::Iq::Si::Si.new
|
|
69
|
+
si.id = 'a1'
|
|
70
|
+
si.mime_type = 'text/plain'
|
|
71
|
+
si.profile = 'http://jabber.org/protocol/si/profile/file-transfer'
|
|
72
|
+
si.id.should == 'a1'
|
|
73
|
+
si.mime_type.should == 'text/plain'
|
|
74
|
+
si.profile.should == 'http://jabber.org/protocol/si/profile/file-transfer'
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
describe Blather::Stanza::Iq::Si::Si::File do
|
|
79
|
+
it 'can be initialized with name and size' do
|
|
80
|
+
file = Blather::Stanza::Iq::Si::Si::File.new('test.txt', 123)
|
|
81
|
+
file.name.should == 'test.txt'
|
|
82
|
+
file.size.should == 123
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it 'can be initialized with node' do
|
|
86
|
+
node = Blather::XMPPNode.parse si_xml
|
|
87
|
+
|
|
88
|
+
file = Blather::Stanza::Iq::Si::Si::File.new node.find_first('.//ns:file', :ns => 'http://jabber.org/protocol/si/profile/file-transfer')
|
|
89
|
+
file.name.should == 'test.txt'
|
|
90
|
+
file.size.should == 1022
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it 'can set and get description' do
|
|
94
|
+
file = Blather::Stanza::Iq::Si::Si::File.new('test.txt', 123)
|
|
95
|
+
file.desc = 'This is a test. If this were a real file...'
|
|
96
|
+
file.desc.should == 'This is a test. If this were a real file...'
|
|
97
|
+
end
|
|
98
|
+
end
|