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.
Files changed (150) hide show
  1. data/.autotest +13 -0
  2. data/.gemtest +0 -0
  3. data/.gitignore +19 -0
  4. data/.rspec +3 -0
  5. data/.travis.yml +8 -0
  6. data/CHANGELOG.md +249 -0
  7. data/Gemfile +4 -0
  8. data/Guardfile +5 -0
  9. data/LICENSE +22 -0
  10. data/README.md +413 -0
  11. data/Rakefile +20 -0
  12. data/TODO.md +2 -0
  13. data/blather.gemspec +51 -0
  14. data/examples/certs/README +20 -0
  15. data/examples/certs/ca-bundle.crt +3987 -0
  16. data/examples/echo.rb +19 -0
  17. data/examples/execute.rb +17 -0
  18. data/examples/ping_pong.rb +38 -0
  19. data/examples/print_hierarchy.rb +77 -0
  20. data/examples/rosterprint.rb +15 -0
  21. data/examples/stream_only.rb +28 -0
  22. data/examples/trusted_echo.rb +21 -0
  23. data/examples/xmpp4r/echo.rb +36 -0
  24. data/lib/blather.rb +112 -0
  25. data/lib/blather/cert_store.rb +53 -0
  26. data/lib/blather/client.rb +95 -0
  27. data/lib/blather/client/client.rb +345 -0
  28. data/lib/blather/client/dsl.rb +320 -0
  29. data/lib/blather/client/dsl/pubsub.rb +174 -0
  30. data/lib/blather/core_ext/eventmachine.rb +125 -0
  31. data/lib/blather/core_ext/ipaddr.rb +20 -0
  32. data/lib/blather/errors.rb +69 -0
  33. data/lib/blather/errors/sasl_error.rb +44 -0
  34. data/lib/blather/errors/stanza_error.rb +110 -0
  35. data/lib/blather/errors/stream_error.rb +84 -0
  36. data/lib/blather/file_transfer.rb +107 -0
  37. data/lib/blather/file_transfer/ibb.rb +68 -0
  38. data/lib/blather/file_transfer/s5b.rb +114 -0
  39. data/lib/blather/jid.rb +141 -0
  40. data/lib/blather/roster.rb +118 -0
  41. data/lib/blather/roster_item.rb +146 -0
  42. data/lib/blather/stanza.rb +167 -0
  43. data/lib/blather/stanza/disco.rb +32 -0
  44. data/lib/blather/stanza/disco/capabilities.rb +161 -0
  45. data/lib/blather/stanza/disco/disco_info.rb +205 -0
  46. data/lib/blather/stanza/disco/disco_items.rb +134 -0
  47. data/lib/blather/stanza/iq.rb +144 -0
  48. data/lib/blather/stanza/iq/command.rb +339 -0
  49. data/lib/blather/stanza/iq/ibb.rb +86 -0
  50. data/lib/blather/stanza/iq/ping.rb +50 -0
  51. data/lib/blather/stanza/iq/query.rb +53 -0
  52. data/lib/blather/stanza/iq/roster.rb +185 -0
  53. data/lib/blather/stanza/iq/s5b.rb +208 -0
  54. data/lib/blather/stanza/iq/si.rb +415 -0
  55. data/lib/blather/stanza/iq/vcard.rb +149 -0
  56. data/lib/blather/stanza/message.rb +428 -0
  57. data/lib/blather/stanza/message/muc_user.rb +119 -0
  58. data/lib/blather/stanza/muc/muc_user_base.rb +54 -0
  59. data/lib/blather/stanza/presence.rb +172 -0
  60. data/lib/blather/stanza/presence/c.rb +100 -0
  61. data/lib/blather/stanza/presence/muc.rb +35 -0
  62. data/lib/blather/stanza/presence/muc_user.rb +147 -0
  63. data/lib/blather/stanza/presence/status.rb +218 -0
  64. data/lib/blather/stanza/presence/subscription.rb +100 -0
  65. data/lib/blather/stanza/pubsub.rb +119 -0
  66. data/lib/blather/stanza/pubsub/affiliations.rb +79 -0
  67. data/lib/blather/stanza/pubsub/create.rb +65 -0
  68. data/lib/blather/stanza/pubsub/errors.rb +18 -0
  69. data/lib/blather/stanza/pubsub/event.rb +139 -0
  70. data/lib/blather/stanza/pubsub/items.rb +103 -0
  71. data/lib/blather/stanza/pubsub/publish.rb +103 -0
  72. data/lib/blather/stanza/pubsub/retract.rb +92 -0
  73. data/lib/blather/stanza/pubsub/subscribe.rb +68 -0
  74. data/lib/blather/stanza/pubsub/subscription.rb +135 -0
  75. data/lib/blather/stanza/pubsub/subscriptions.rb +83 -0
  76. data/lib/blather/stanza/pubsub/unsubscribe.rb +84 -0
  77. data/lib/blather/stanza/pubsub_owner.rb +51 -0
  78. data/lib/blather/stanza/pubsub_owner/delete.rb +52 -0
  79. data/lib/blather/stanza/pubsub_owner/purge.rb +52 -0
  80. data/lib/blather/stanza/x.rb +416 -0
  81. data/lib/blather/stream.rb +266 -0
  82. data/lib/blather/stream/client.rb +32 -0
  83. data/lib/blather/stream/component.rb +39 -0
  84. data/lib/blather/stream/features.rb +70 -0
  85. data/lib/blather/stream/features/register.rb +38 -0
  86. data/lib/blather/stream/features/resource.rb +63 -0
  87. data/lib/blather/stream/features/sasl.rb +190 -0
  88. data/lib/blather/stream/features/session.rb +45 -0
  89. data/lib/blather/stream/features/tls.rb +29 -0
  90. data/lib/blather/stream/parser.rb +102 -0
  91. data/lib/blather/version.rb +3 -0
  92. data/lib/blather/xmpp_node.rb +94 -0
  93. data/spec/blather/client/client_spec.rb +687 -0
  94. data/spec/blather/client/dsl/pubsub_spec.rb +492 -0
  95. data/spec/blather/client/dsl_spec.rb +266 -0
  96. data/spec/blather/errors/sasl_error_spec.rb +33 -0
  97. data/spec/blather/errors/stanza_error_spec.rb +129 -0
  98. data/spec/blather/errors/stream_error_spec.rb +108 -0
  99. data/spec/blather/errors_spec.rb +33 -0
  100. data/spec/blather/file_transfer_spec.rb +135 -0
  101. data/spec/blather/jid_spec.rb +87 -0
  102. data/spec/blather/roster_item_spec.rb +134 -0
  103. data/spec/blather/roster_spec.rb +107 -0
  104. data/spec/blather/stanza/discos/disco_info_spec.rb +247 -0
  105. data/spec/blather/stanza/discos/disco_items_spec.rb +154 -0
  106. data/spec/blather/stanza/iq/command_spec.rb +206 -0
  107. data/spec/blather/stanza/iq/ibb_spec.rb +124 -0
  108. data/spec/blather/stanza/iq/ping_spec.rb +45 -0
  109. data/spec/blather/stanza/iq/query_spec.rb +64 -0
  110. data/spec/blather/stanza/iq/roster_spec.rb +139 -0
  111. data/spec/blather/stanza/iq/s5b_spec.rb +57 -0
  112. data/spec/blather/stanza/iq/si_spec.rb +98 -0
  113. data/spec/blather/stanza/iq/vcard_spec.rb +93 -0
  114. data/spec/blather/stanza/iq_spec.rb +61 -0
  115. data/spec/blather/stanza/message/muc_user_spec.rb +152 -0
  116. data/spec/blather/stanza/message_spec.rb +282 -0
  117. data/spec/blather/stanza/presence/c_spec.rb +56 -0
  118. data/spec/blather/stanza/presence/muc_spec.rb +37 -0
  119. data/spec/blather/stanza/presence/muc_user_spec.rb +83 -0
  120. data/spec/blather/stanza/presence/status_spec.rb +144 -0
  121. data/spec/blather/stanza/presence/subscription_spec.rb +102 -0
  122. data/spec/blather/stanza/presence_spec.rb +125 -0
  123. data/spec/blather/stanza/pubsub/affiliations_spec.rb +57 -0
  124. data/spec/blather/stanza/pubsub/create_spec.rb +56 -0
  125. data/spec/blather/stanza/pubsub/event_spec.rb +98 -0
  126. data/spec/blather/stanza/pubsub/items_spec.rb +79 -0
  127. data/spec/blather/stanza/pubsub/publish_spec.rb +83 -0
  128. data/spec/blather/stanza/pubsub/retract_spec.rb +75 -0
  129. data/spec/blather/stanza/pubsub/subscribe_spec.rb +61 -0
  130. data/spec/blather/stanza/pubsub/subscription_spec.rb +97 -0
  131. data/spec/blather/stanza/pubsub/subscriptions_spec.rb +59 -0
  132. data/spec/blather/stanza/pubsub/unsubscribe_spec.rb +74 -0
  133. data/spec/blather/stanza/pubsub_owner/delete_spec.rb +50 -0
  134. data/spec/blather/stanza/pubsub_owner/purge_spec.rb +50 -0
  135. data/spec/blather/stanza/pubsub_owner_spec.rb +27 -0
  136. data/spec/blather/stanza/pubsub_spec.rb +68 -0
  137. data/spec/blather/stanza/x_spec.rb +231 -0
  138. data/spec/blather/stanza_spec.rb +134 -0
  139. data/spec/blather/stream/client_spec.rb +1090 -0
  140. data/spec/blather/stream/component_spec.rb +108 -0
  141. data/spec/blather/stream/parser_spec.rb +152 -0
  142. data/spec/blather/stream/ssl_spec.rb +32 -0
  143. data/spec/blather/xmpp_node_spec.rb +47 -0
  144. data/spec/blather_spec.rb +34 -0
  145. data/spec/fixtures/pubsub.rb +311 -0
  146. data/spec/spec_helper.rb +17 -0
  147. data/yard/templates/default/class/html/handlers.erb +18 -0
  148. data/yard/templates/default/class/setup.rb +10 -0
  149. data/yard/templates/default/class/text/handlers.erb +1 -0
  150. metadata +459 -0
@@ -0,0 +1,492 @@
1
+ require 'spec_helper'
2
+ require 'fixtures/pubsub'
3
+ require 'blather/client/dsl'
4
+
5
+ describe Blather::DSL::PubSub do
6
+ before do
7
+ @host = 'host.name'
8
+ @client = mock()
9
+ @client.stubs(:jid).returns Blather::JID.new('n@d/r')
10
+ @pubsub = Blather::DSL::PubSub.new @client, @host
11
+ end
12
+
13
+ it 'raises an error when trying to send a stanza without a host' do
14
+ @pubsub.host = nil
15
+ proc { @pubsub.affiliations }.should raise_error RuntimeError
16
+ end
17
+
18
+ it 'requests affiliations' do
19
+ @client.expects(:write_with_handler).with do |n|
20
+ n.should be_instance_of Blather::Stanza::PubSub::Affiliations
21
+ n.find('//ns:pubsub/ns:affiliations', :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
22
+ n.to.should == Blather::JID.new(@host)
23
+ n.type.should == :get
24
+ end
25
+ @pubsub.affiliations
26
+ end
27
+
28
+ it 'requests affiliations from a specified host' do
29
+ host = 'another.host'
30
+ @client.expects(:write_with_handler).with do |n|
31
+ n.should be_instance_of Blather::Stanza::PubSub::Affiliations
32
+ n.find('//ns:pubsub/ns:affiliations', :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
33
+ n.to.should == Blather::JID.new(host)
34
+ n.type.should == :get
35
+ end
36
+ @pubsub.affiliations host
37
+ end
38
+
39
+ it 'requests subscriptions' do
40
+ @client.expects(:write_with_handler).with do |n|
41
+ n.should be_instance_of Blather::Stanza::PubSub::Subscriptions
42
+ n.find('//ns:pubsub/ns:subscriptions', :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
43
+ n.to.should == Blather::JID.new(@host)
44
+ n.type.should == :get
45
+ end
46
+ @pubsub.subscriptions
47
+ end
48
+
49
+ it 'requests subscriptions from a specified host' do
50
+ host = 'another.host'
51
+ @client.expects(:write_with_handler).with do |n|
52
+ n.should be_instance_of Blather::Stanza::PubSub::Subscriptions
53
+ n.find('//ns:pubsub/ns:subscriptions', :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
54
+ n.to.should == Blather::JID.new(host)
55
+ n.type.should == :get
56
+ end
57
+ @pubsub.subscriptions host
58
+ end
59
+
60
+ it 'requests nodes defaulting to "/"' do
61
+ @client.expects(:write_with_handler).with do |n|
62
+ n.should be_instance_of Blather::Stanza::DiscoItems
63
+ n.find("/iq/ns:query[@node='/']", :ns => Blather::Stanza::DiscoItems.registered_ns).should_not be_empty
64
+ n.to.should == Blather::JID.new(@host)
65
+ n.type.should == :get
66
+ end
67
+ @pubsub.nodes nil
68
+ end
69
+
70
+ it 'requests nodes from a specified host' do
71
+ host = 'another.host'
72
+ @client.expects(:write_with_handler).with do |n|
73
+ n.should be_instance_of Blather::Stanza::DiscoItems
74
+ n.find("/iq/ns:query[@node='/']", :ns => Blather::Stanza::DiscoItems.registered_ns).should_not be_empty
75
+ n.to.should == Blather::JID.new(host)
76
+ n.type.should == :get
77
+ end
78
+ @pubsub.nodes nil, host
79
+ end
80
+
81
+ it 'requests nodes under a specified path' do
82
+ @client.expects(:write_with_handler).with do |n|
83
+ n.should be_instance_of Blather::Stanza::DiscoItems
84
+ n.find("/iq/ns:query[@node='/path/to/nodes']", :ns => Blather::Stanza::DiscoItems.registered_ns).should_not be_empty
85
+ n.to.should == Blather::JID.new(@host)
86
+ n.type.should == :get
87
+ end
88
+ @pubsub.nodes '/path/to/nodes'
89
+ end
90
+
91
+ it 'requests information on a node' do
92
+ @client.expects(:write_with_handler).with do |n|
93
+ n.should be_instance_of Blather::Stanza::DiscoInfo
94
+ n.find("/iq/ns:query[@node='/path/to/node']", :ns => Blather::Stanza::DiscoInfo.registered_ns).should_not be_empty
95
+ n.to.should == Blather::JID.new(@host)
96
+ n.type.should == :get
97
+ end
98
+ @pubsub.node '/path/to/node'
99
+ end
100
+
101
+ it 'requests all items from a node' do
102
+ @client.expects(:write_with_handler).with do |n|
103
+ n.should be_instance_of Blather::Stanza::PubSub::Items
104
+ n.find("/iq/ns:pubsub/ns:items[@node='/path/to/node']", :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
105
+ n.to.should == Blather::JID.new(@host)
106
+ n.type.should == :get
107
+ end
108
+ @pubsub.items '/path/to/node'
109
+ end
110
+
111
+ it 'requests specific items from a node' do
112
+ @client.expects(:write_with_handler).with do |n|
113
+ n.should be_instance_of Blather::Stanza::PubSub::Items
114
+ n.find("/iq/ns:pubsub/ns:items[@node='/path/to/node'][ns:item[@id='item1']][ns:item[@id='item2']]", :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
115
+ n.to.should == Blather::JID.new(@host)
116
+ n.type.should == :get
117
+ end
118
+ @pubsub.items '/path/to/node', %w[item1 item2]
119
+ end
120
+
121
+ it 'requests some items from a node' do
122
+ @client.expects(:write_with_handler).with do |n|
123
+ n.should be_instance_of Blather::Stanza::PubSub::Items
124
+ n.find("/iq/ns:pubsub/ns:items[@node='/path/to/node' and @max_items='2']", :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
125
+ n.to.should == Blather::JID.new(@host)
126
+ n.type.should == :get
127
+ end
128
+ @pubsub.items '/path/to/node', nil, 2
129
+ end
130
+
131
+ it 'can publish items to a node with a hash' do
132
+ @client.expects(:write_with_handler).with do |n|
133
+ n.should be_instance_of Blather::Stanza::PubSub::Publish
134
+ n.find("/iq[@type='set']/ns:pubsub/ns:publish[@node='/path/to/node' and ns:item[@id='id1' and .='payload1'] and ns:item[@id='id2' and .='payload2']]", :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
135
+ n.to.should == Blather::JID.new(@host)
136
+ n.type.should == :set
137
+ end
138
+ @pubsub.publish '/path/to/node', {'id1' => 'payload1', 'id2' => 'payload2'}
139
+ end
140
+
141
+ it 'can publish items to a node with an array' do
142
+ @client.expects(:write_with_handler).with do |n|
143
+ n.should be_instance_of Blather::Stanza::PubSub::Publish
144
+ n.find("/iq[@type='set']/ns:pubsub/ns:publish[@node='/path/to/node' and ns:item[.='payload1'] and ns:item[.='payload2']]", :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
145
+ n.to.should == Blather::JID.new(@host)
146
+ n.type.should == :set
147
+ end
148
+ @pubsub.publish '/path/to/node', %w[payload1 payload2]
149
+ end
150
+
151
+ it 'can publish items to a node with a string' do
152
+ @client.expects(:write_with_handler).with do |n|
153
+ n.should be_instance_of Blather::Stanza::PubSub::Publish
154
+ n.find("/iq[@type='set']/ns:pubsub/ns:publish[@node='/path/to/node' and ns:item[.='payload']]", :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
155
+ n.to.should == Blather::JID.new(@host)
156
+ n.type.should == :set
157
+ end
158
+ @pubsub.publish '/path/to/node', 'payload'
159
+ end
160
+
161
+ it 'can retract an item with an array' do
162
+ @client.expects(:write_with_handler).with do |n|
163
+ n.should be_instance_of Blather::Stanza::PubSub::Retract
164
+ n.find("/iq[@type='set']/ns:pubsub/ns:retract[@node='/path/to/node' and ns:item[@id='id1'] and ns:item[@id='id2']]", :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
165
+ n.to.should == Blather::JID.new(@host)
166
+ n.type.should == :set
167
+ end
168
+ @pubsub.retract '/path/to/node', %w[id1 id2]
169
+ end
170
+
171
+ it 'can retract an item with a string' do
172
+ @client.expects(:write_with_handler).with do |n|
173
+ n.should be_instance_of Blather::Stanza::PubSub::Retract
174
+ n.find("/iq[@type='set']/ns:pubsub/ns:retract[@node='/path/to/node' and ns:item[@id='id1']]", :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
175
+ n.to.should == Blather::JID.new(@host)
176
+ n.type.should == :set
177
+ end
178
+ @pubsub.retract '/path/to/node', 'id1'
179
+ end
180
+
181
+ it 'can subscribe to a node with the default jid' do
182
+ @client.expects(:write_with_handler).with do |n|
183
+ n.should be_instance_of Blather::Stanza::PubSub::Subscribe
184
+ n.find("/iq[@type='set']/ns:pubsub/ns:subscribe[@node='/path/to/node' and @jid='#{@client.jid.stripped}']", :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
185
+ n.to.should == Blather::JID.new(@host)
186
+ n.type.should == :set
187
+ end
188
+ @pubsub.subscribe '/path/to/node'
189
+ end
190
+
191
+ it 'can subscribe to a node with a specified jid as a string' do
192
+ @client.expects(:write_with_handler).with do |n|
193
+ n.should be_instance_of Blather::Stanza::PubSub::Subscribe
194
+ n.find("/iq[@type='set']/ns:pubsub/ns:subscribe[@node='/path/to/node' and @jid='jid@d/r']", :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
195
+ n.to.should == Blather::JID.new(@host)
196
+ n.type.should == :set
197
+ end
198
+ @pubsub.subscribe '/path/to/node', 'jid@d/r'
199
+ end
200
+
201
+ it 'can subscribe to a node with a specified jid as a Blather::JID' do
202
+ @client.expects(:write_with_handler).with do |n|
203
+ n.should be_instance_of Blather::Stanza::PubSub::Subscribe
204
+ n.find("/iq[@type='set']/ns:pubsub/ns:subscribe[@node='/path/to/node' and @jid='jid@d/r']", :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
205
+ n.to.should == Blather::JID.new(@host)
206
+ n.type.should == :set
207
+ end
208
+ @pubsub.subscribe '/path/to/node', Blather::JID.new('jid@d/r')
209
+ end
210
+
211
+ it 'can unsubscribe to a node with the default jid' do
212
+ @client.expects(:write_with_handler).with do |n|
213
+ n.should be_instance_of Blather::Stanza::PubSub::Unsubscribe
214
+ n.find("/iq[@type='set']/ns:pubsub/ns:unsubscribe[@node='/path/to/node' and @jid='#{@client.jid.stripped}']", :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
215
+ n.to.should == Blather::JID.new(@host)
216
+ n.type.should == :set
217
+ end
218
+ @pubsub.unsubscribe '/path/to/node'
219
+ end
220
+
221
+ it 'can unsubscribe to a node with a specified jid as a string' do
222
+ @client.expects(:write_with_handler).with do |n|
223
+ n.should be_instance_of Blather::Stanza::PubSub::Unsubscribe
224
+ n.find("/iq[@type='set']/ns:pubsub/ns:unsubscribe[@node='/path/to/node' and @jid='jid@d/r']", :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
225
+ n.to.should == Blather::JID.new(@host)
226
+ n.type.should == :set
227
+ end
228
+ @pubsub.unsubscribe '/path/to/node', 'jid@d/r'
229
+ end
230
+
231
+ it 'can unsubscribe to a node with a specified jid as a Blather::JID' do
232
+ @client.expects(:write_with_handler).with do |n|
233
+ n.should be_instance_of Blather::Stanza::PubSub::Unsubscribe
234
+ n.find("/iq[@type='set']/ns:pubsub/ns:unsubscribe[@node='/path/to/node' and @jid='jid@d/r']", :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
235
+ n.to.should == Blather::JID.new(@host)
236
+ n.type.should == :set
237
+ end
238
+ @pubsub.unsubscribe '/path/to/node', Blather::JID.new('jid@d/r')
239
+ end
240
+
241
+ it 'can unsubscribe with a particular subscription id' do
242
+ @client.expects(:write_with_handler).with do |n|
243
+ n.should be_instance_of Blather::Stanza::PubSub::Unsubscribe
244
+ n.find("/iq[@type='set']/ns:pubsub/ns:unsubscribe[@node='/path/to/node' and @jid='jid@d/r' and @subid='subid']", :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
245
+ n.subid.should == 'subid'
246
+ n.type.should == :set
247
+ end
248
+ @pubsub.unsubscribe '/path/to/node', 'jid@d/r', 'subid'
249
+ end
250
+
251
+ it 'can purge a node' do
252
+ @client.expects(:write_with_handler).with do |n|
253
+ n.should be_instance_of Blather::Stanza::PubSubOwner::Purge
254
+ n.find("/iq[@type='set']/ns:pubsub/ns:purge[@node='/path/to/node']", :ns => Blather::Stanza::PubSubOwner.registered_ns).should_not be_empty
255
+ n.to.should == Blather::JID.new(@host)
256
+ n.type.should == :set
257
+ end
258
+ @pubsub.purge '/path/to/node'
259
+ end
260
+
261
+ it 'can create a node' do
262
+ @client.expects(:write_with_handler).with do |n|
263
+ n.should be_instance_of Blather::Stanza::PubSub::Create
264
+ n.find("/iq[@type='set']/ns:pubsub/ns:create[@node='/path/to/node']", :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
265
+ n.to.should == Blather::JID.new(@host)
266
+ n.type.should == :set
267
+ end
268
+ @pubsub.create '/path/to/node'
269
+ end
270
+
271
+ it 'can create a node with configuration' do
272
+ pubsub_configure = Blather::Stanza::X.new({
273
+ :type => :submit,
274
+ :fields => [
275
+ { :var => "FORM_TYPE", :type => 'hidden', :value => "http://jabber.org/protocol/pubsub#node_config" },
276
+ { :var => "pubsub#persist_items", :value => "0" },
277
+ { :var => "pubsub#max_items", :value => "0" },
278
+ { :var => "pubsub#notify_retract", :value => "0" },
279
+ { :var => "pubsub#publish_model", :value => "open" }]
280
+ })
281
+ @client.expects(:write_with_handler).with do |n|
282
+ n.should be_instance_of Blather::Stanza::PubSub::Create
283
+ n.find("/iq[@type='set']/ns:pubsub/ns:create[@node='/path/to/node']", :ns => Blather::Stanza::PubSub.registered_ns).should_not be_empty
284
+ n.to.should == Blather::JID.new(@host)
285
+ n.type.should == :set
286
+ n.configure_node.should == pubsub_configure
287
+ end
288
+ @pubsub.create '/path/to/node', nil, pubsub_configure
289
+ end
290
+
291
+ it 'can delete a node' do
292
+ @client.expects(:write_with_handler).with do |n|
293
+ n.should be_instance_of Blather::Stanza::PubSubOwner::Delete
294
+ n.find("/iq[@type='set']/ns:pubsub/ns:delete[@node='/path/to/node']", :ns => Blather::Stanza::PubSubOwner.registered_ns).should_not be_empty
295
+ n.to.should == Blather::JID.new(@host)
296
+ n.type.should == :set
297
+ end
298
+ @pubsub.delete '/path/to/node'
299
+ end
300
+ end
301
+
302
+ describe 'Blather::DSL::PubSub callbacks' do
303
+ before do
304
+ @host = 'host.name'
305
+ @client = Blather::Client.setup Blather::JID.new('n@d/r'), 'pass'
306
+ @pubsub = Blather::DSL::PubSub.new @client, @host
307
+ end
308
+
309
+ it 'returns a list of affiliations when requesting affiliations' do
310
+ affiliations = Blather::XMPPNode.parse(affiliations_xml)
311
+ response = mock()
312
+ response.expects(:call).with { |n| n.should == affiliations.list }
313
+ @client.stubs(:write).with do |n|
314
+ affiliations.id = n.id
315
+ @client.receive_data affiliations
316
+ true
317
+ end
318
+ @pubsub.affiliations { |n| response.call n }
319
+ end
320
+
321
+ it 'returns a list of subscriptions when requesting subscriptions' do
322
+ subscriptions = Blather::XMPPNode.parse(subscriptions_xml)
323
+ response = mock()
324
+ response.expects(:call).with { |n| n.should == subscriptions.list }
325
+ @client.stubs(:write).with do |n|
326
+ subscriptions.id = n.id
327
+ @client.receive_data subscriptions
328
+ true
329
+ end
330
+ @pubsub.subscriptions { |n| response.call n }
331
+ end
332
+
333
+ it 'returns a list of node items when requesting nodes' do
334
+ nodes = Blather::XMPPNode.parse(<<-NODES)
335
+ <iq type='result'
336
+ from='pubsub.shakespeare.lit'
337
+ to='francisco@denmark.lit/barracks'
338
+ id='nodes1'>
339
+ <query xmlns='http://jabber.org/protocol/disco#items'>
340
+ <item jid='pubsub.shakespeare.lit'
341
+ node='blogs'
342
+ name='Weblog updates'/>
343
+ <item jid='pubsub.shakespeare.lit'
344
+ node='news'
345
+ name='News and announcements'/>
346
+ </query>
347
+ </iq>
348
+ NODES
349
+ response = mock()
350
+ response.expects(:call).with { |n| n.should == nodes.items }
351
+ @client.stubs(:write).with do |n|
352
+ nodes.id = n.id
353
+ @client.receive_data nodes
354
+ true
355
+ end
356
+ @pubsub.nodes { |n| response.call n }
357
+ end
358
+
359
+ it 'returns a DiscoInfo node when requesting a node' do
360
+ node = Blather::XMPPNode.parse(<<-NODES)
361
+ <iq type='result'
362
+ from='pubsub.shakespeare.lit'
363
+ to='francisco@denmark.lit/barracks'
364
+ id='meta1'>
365
+ <query xmlns='http://jabber.org/protocol/disco#info'
366
+ node='blogs'>
367
+ <identity category='pubsub' type='collection'/>
368
+ </query>
369
+ </iq>
370
+ NODES
371
+ response = mock()
372
+ response.expects(:call).with { |n| n.should == node }
373
+ @client.stubs(:write).with do |n|
374
+ node.id = n.id
375
+ @client.receive_data node
376
+ true
377
+ end
378
+ @pubsub.node('blogs') { |n| response.call n }
379
+ end
380
+
381
+ it 'returns a set of items when requesting items' do
382
+ items = Blather::XMPPNode.parse(items_all_nodes_xml)
383
+ response = mock()
384
+ response.expects(:call).with { |n| n.map{|i|i.to_s}.should == items.items.map{|i|i.to_s} }
385
+ @client.stubs(:write).with do |n|
386
+ items.id = n.id
387
+ @client.receive_data items
388
+ true
389
+ end
390
+ @pubsub.items('princely_musings') { |n| response.call n }
391
+ end
392
+
393
+ it 'returns aa subscription node when subscribing' do
394
+ subscription = Blather::XMPPNode.parse(subscription_xml)
395
+ response = mock()
396
+ response.expects(:call).with { |n| n.should == subscription }
397
+ @client.stubs(:write).with do |n|
398
+ subscription.id = n.id
399
+ @client.receive_data subscription
400
+ true
401
+ end
402
+ @pubsub.subscribe('princely_musings') { |n| response.call n }
403
+ end
404
+
405
+ it 'returns aa unsubscribe node when unsubscribing' do
406
+ unsubscribe = Blather::XMPPNode.parse(unsubscribe_xml)
407
+ response = mock()
408
+ response.expects(:call).with { |n| n.should == unsubscribe }
409
+ @client.stubs(:write).with do |n|
410
+ unsubscribe.id = n.id
411
+ @client.receive_data unsubscribe
412
+ true
413
+ end
414
+ @pubsub.unsubscribe('princely_musings') { |n| response.call n }
415
+ end
416
+
417
+ it 'returns a publish result when publishing to a node' do
418
+ result = Blather::XMPPNode.parse(<<-NODE)
419
+ <iq type='result'
420
+ from='pubsub.shakespeare.lit'
421
+ to='hamlet@denmark.lit/blogbot'
422
+ id='publish1'>
423
+ <pubsub xmlns='http://jabber.org/protocol/pubsub'>
424
+ <publish node='princely_musings'>
425
+ <item id='ae890ac52d0df67ed7cfdf51b644e901'/>
426
+ </publish>
427
+ </pubsub>
428
+ </iq>
429
+ NODE
430
+ response = mock()
431
+ response.expects(:call).with { |n| n.should == result }
432
+ @client.stubs(:write).with do |n|
433
+ result.id = n.id
434
+ @client.receive_data result
435
+ true
436
+ end
437
+ @pubsub.publish('princely_musings', 'payload') { |n| response.call n }
438
+ end
439
+
440
+ it 'returns a create result when creating a node' do
441
+ result = Blather::XMPPNode.parse(<<-NODE)
442
+ <iq type='result'
443
+ from='pubsub.shakespeare.lit'
444
+ to='hamlet@denmark.lit/elsinore'
445
+ id='create2'>
446
+ <pubsub xmlns='http://jabber.org/protocol/pubsub'>
447
+ <create node='25e3d37dabbab9541f7523321421edc5bfeb2dae'/>
448
+ </pubsub>
449
+ </iq>
450
+ NODE
451
+ response = mock()
452
+ response.expects(:call).with { |n| n.should == result }
453
+ @client.stubs(:write).with do |n|
454
+ result.id = n.id
455
+ @client.receive_data result
456
+ true
457
+ end
458
+ @pubsub.create('princely_musings') { |n| response.call n }
459
+ end
460
+
461
+ it 'returns a purge result when purging a node' do
462
+ result = Blather::XMPPNode.parse(<<-NODE)
463
+ <iq type='result'
464
+ from='pubsub.shakespeare.lit'
465
+ id='purge1'/>
466
+ NODE
467
+ response = mock()
468
+ response.expects(:call).with { |n| n.should == result }
469
+ @client.stubs(:write).with do |n|
470
+ result.id = n.id
471
+ @client.receive_data result
472
+ true
473
+ end
474
+ @pubsub.purge('princely_musings') { |n| response.call n }
475
+ end
476
+
477
+ it 'returns a delete result when deleting a node' do
478
+ result = Blather::XMPPNode.parse(<<-NODE)
479
+ <iq type='result'
480
+ from='pubsub.shakespeare.lit'
481
+ id='delete1'/>
482
+ NODE
483
+ response = mock()
484
+ response.expects(:call).with { |n| n.should == result }
485
+ @client.stubs(:write).with do |n|
486
+ result.id = n.id
487
+ @client.receive_data result
488
+ true
489
+ end
490
+ @pubsub.delete('princely_musings') { |n| response.call n }
491
+ end
492
+ end