blather 0.4.14 → 0.4.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/lib/blather.rb +8 -0
  2. data/lib/blather/client/client.rb +9 -1
  3. data/lib/blather/client/dsl/pubsub.rb +2 -2
  4. data/lib/blather/core_ext/active_support.rb +1 -0
  5. data/lib/blather/core_ext/eventmachine.rb +122 -0
  6. data/lib/blather/errors/stanza_error.rb +1 -0
  7. data/lib/blather/file_transfer.rb +100 -0
  8. data/lib/blather/file_transfer/ibb.rb +68 -0
  9. data/lib/blather/file_transfer/s5b.rb +104 -0
  10. data/lib/blather/roster_item.rb +2 -2
  11. data/lib/blather/stanza/disco/disco_info.rb +17 -2
  12. data/lib/blather/stanza/iq/ibb.rb +83 -0
  13. data/lib/blather/stanza/iq/s5b.rb +205 -0
  14. data/lib/blather/stanza/iq/si.rb +410 -0
  15. data/lib/blather/stanza/iq/vcard.rb +147 -0
  16. data/lib/blather/stanza/message.rb +10 -2
  17. data/lib/blather/stanza/presence/status.rb +11 -3
  18. data/lib/blather/stanza/pubsub.rb +3 -1
  19. data/lib/blather/stanza/pubsub/event.rb +18 -0
  20. data/lib/blather/stanza/pubsub/subscriptions.rb +4 -2
  21. data/lib/blather/stanza/pubsub/unsubscribe.rb +17 -1
  22. data/lib/blather/stanza/x.rb +12 -2
  23. data/lib/blather/stream/parser.rb +1 -0
  24. data/lib/test.rb +55 -0
  25. data/spec/blather/client/client_spec.rb +18 -4
  26. data/spec/blather/client/dsl/pubsub_spec.rb +12 -2
  27. data/spec/blather/client/dsl_spec.rb +1 -1
  28. data/spec/blather/core_ext/nokogiri_spec.rb +1 -1
  29. data/spec/blather/errors/sasl_error_spec.rb +1 -1
  30. data/spec/blather/errors/stanza_error_spec.rb +1 -1
  31. data/spec/blather/errors/stream_error_spec.rb +1 -1
  32. data/spec/blather/errors_spec.rb +1 -1
  33. data/spec/blather/file_transfer_spec.rb +100 -0
  34. data/spec/blather/jid_spec.rb +1 -1
  35. data/spec/blather/roster_item_spec.rb +32 -2
  36. data/spec/blather/roster_spec.rb +1 -1
  37. data/spec/blather/stanza/discos/disco_info_spec.rb +12 -3
  38. data/spec/blather/stanza/discos/disco_items_spec.rb +1 -1
  39. data/spec/blather/stanza/iq/command_spec.rb +1 -1
  40. data/spec/blather/stanza/iq/ibb_spec.rb +136 -0
  41. data/spec/blather/stanza/iq/query_spec.rb +1 -1
  42. data/spec/blather/stanza/iq/roster_spec.rb +1 -1
  43. data/spec/blather/stanza/iq/s5b_spec.rb +60 -0
  44. data/spec/blather/stanza/iq/si_spec.rb +101 -0
  45. data/spec/blather/stanza/iq/vcard_spec.rb +96 -0
  46. data/spec/blather/stanza/iq_spec.rb +1 -1
  47. data/spec/blather/stanza/message_spec.rb +48 -2
  48. data/spec/blather/stanza/presence/status_spec.rb +1 -1
  49. data/spec/blather/stanza/presence/subscription_spec.rb +1 -1
  50. data/spec/blather/stanza/presence_spec.rb +1 -1
  51. data/spec/blather/stanza/pubsub/affiliations_spec.rb +2 -2
  52. data/spec/blather/stanza/pubsub/create_spec.rb +2 -2
  53. data/spec/blather/stanza/pubsub/event_spec.rb +16 -2
  54. data/spec/blather/stanza/pubsub/items_spec.rb +2 -2
  55. data/spec/blather/stanza/pubsub/publish_spec.rb +2 -2
  56. data/spec/blather/stanza/pubsub/retract_spec.rb +2 -2
  57. data/spec/blather/stanza/pubsub/subscribe_spec.rb +2 -2
  58. data/spec/blather/stanza/pubsub/subscription_spec.rb +2 -2
  59. data/spec/blather/stanza/pubsub/subscriptions_spec.rb +3 -3
  60. data/spec/blather/stanza/pubsub/unsubscribe_spec.rb +15 -2
  61. data/spec/blather/stanza/pubsub_owner/delete_spec.rb +2 -2
  62. data/spec/blather/stanza/pubsub_owner/purge_spec.rb +2 -2
  63. data/spec/blather/stanza/pubsub_owner_spec.rb +2 -2
  64. data/spec/blather/stanza/pubsub_spec.rb +14 -2
  65. data/spec/blather/stanza/x_spec.rb +1 -1
  66. data/spec/blather/stanza_spec.rb +1 -1
  67. data/spec/blather/stream/client_spec.rb +1 -1
  68. data/spec/blather/stream/component_spec.rb +1 -1
  69. data/spec/blather/stream/parser_spec.rb +11 -1
  70. data/spec/blather/xmpp_node_spec.rb +1 -1
  71. data/spec/fixtures/pubsub.rb +2 -2
  72. data/spec/spec_helper.rb +27 -0
  73. metadata +85 -23
@@ -0,0 +1,60 @@
1
+ require File.expand_path "../../../../spec_helper", __FILE__
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').must_equal Blather::Stanza::Iq::S5b
27
+ end
28
+
29
+ it 'can be imported' do
30
+ doc = parse_stanza s5b_open_xml
31
+ node = Blather::XMPPNode.import(doc.root)
32
+ node.must_be_instance_of Blather::Stanza::Iq::S5b
33
+ end
34
+
35
+ it 'can get sid' do
36
+ doc = parse_stanza s5b_open_xml
37
+ node = Blather::XMPPNode.import(doc.root)
38
+ node.sid.must_equal 'vxf9n471bn46'
39
+ end
40
+
41
+ it 'can get streamhosts' do
42
+ doc = parse_stanza s5b_open_xml
43
+ node = Blather::XMPPNode.import(doc.root)
44
+ node.streamhosts.size.must_equal 2
45
+ end
46
+
47
+ it 'can set streamhosts' do
48
+ node = Blather::Stanza::Iq::S5b.new
49
+ node.streamhosts += [{:jid => 'test@example.com/foo', :host => '192.168.5.1', :port => 123}]
50
+ node.streamhosts.size.must_equal 1
51
+ node.streamhosts += [Blather::Stanza::Iq::S5b::StreamHost.new('test2@example.com/foo', '192.168.5.2', 123)]
52
+ node.streamhosts.size.must_equal 2
53
+ end
54
+
55
+ it 'can get and set streamhost-used' do
56
+ node = Blather::Stanza::Iq::S5b.new
57
+ node.streamhost_used = 'used@example.com/foo'
58
+ node.streamhost_used.jid.to_s.must_equal 'used@example.com/foo'
59
+ end
60
+ end
@@ -0,0 +1,101 @@
1
+ require File.expand_path "../../../../spec_helper", __FILE__
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').must_equal Blather::Stanza::Iq::Si
31
+ end
32
+
33
+ it 'can be imported' do
34
+ doc = parse_stanza si_xml
35
+ node = Blather::XMPPNode.import(doc.root)
36
+ node.must_be_instance_of Blather::Stanza::Iq::Si
37
+ node.si.must_be_instance_of Blather::Stanza::Iq::Si::Si
38
+ end
39
+
40
+ it 'ensures a si node is present on create' do
41
+ iq = Blather::Stanza::Iq::Si.new
42
+ iq.xpath('ns:si', :ns => 'http://jabber.org/protocol/si').wont_be_empty
43
+ end
44
+
45
+ it 'ensures a si node exists when calling #si' do
46
+ iq = Blather::Stanza::Iq::Si.new
47
+ iq.si.remove
48
+ iq.xpath('ns:si', :ns => 'http://jabber.org/protocol/si').must_be_empty
49
+
50
+ iq.si.wont_be_nil
51
+ iq.xpath('ns:si', :ns => 'http://jabber.org/protocol/si').wont_be_empty
52
+ end
53
+
54
+ it 'ensures a si node is replaced when calling #si=' do
55
+ doc = parse_stanza si_xml
56
+ iq = Blather::XMPPNode.import(doc.root)
57
+
58
+ new_si = Blather::Stanza::Iq::Si::Si.new
59
+ new_si.id = 'a1'
60
+
61
+ iq.si = new_si
62
+
63
+ iq.xpath('ns:si', :ns => 'http://jabber.org/protocol/si').size.must_equal 1
64
+ iq.si.id.must_equal 'a1'
65
+ end
66
+ end
67
+
68
+ describe Blather::Stanza::Iq::Si::Si do
69
+ it 'can set and get attributes' do
70
+ si = Blather::Stanza::Iq::Si::Si.new
71
+ si.id = 'a1'
72
+ si.mime_type = 'text/plain'
73
+ si.profile = 'http://jabber.org/protocol/si/profile/file-transfer'
74
+ si.id.must_equal 'a1'
75
+ si.mime_type.must_equal 'text/plain'
76
+ si.profile.must_equal 'http://jabber.org/protocol/si/profile/file-transfer'
77
+ end
78
+ end
79
+
80
+ describe Blather::Stanza::Iq::Si::Si::File do
81
+ it 'can be initialized with name and size' do
82
+ file = Blather::Stanza::Iq::Si::Si::File.new('test.txt', 123)
83
+ file.name.must_equal 'test.txt'
84
+ file.size.must_equal 123
85
+ end
86
+
87
+ it 'can be initialized with node' do
88
+ doc = parse_stanza si_xml
89
+ node = Blather::XMPPNode.import(doc.root)
90
+
91
+ file = Blather::Stanza::Iq::Si::Si::File.new node.find_first('.//ns:file', :ns => 'http://jabber.org/protocol/si/profile/file-transfer')
92
+ file.name.must_equal 'test.txt'
93
+ file.size.must_equal 1022
94
+ end
95
+
96
+ it 'can set and get description' do
97
+ file = Blather::Stanza::Iq::Si::Si::File.new('test.txt', 123)
98
+ file.desc = 'This is a test. If this were a real file...'
99
+ file.desc.must_equal 'This is a test. If this were a real file...'
100
+ end
101
+ end
@@ -0,0 +1,96 @@
1
+ require File.expand_path "../../../../spec_helper", __FILE__
2
+
3
+ def vcard_xml
4
+ <<-XML
5
+ <iq type="result" id="blather0007" to="romeo@example.net">
6
+ <vCard xmlns="vcard-temp">
7
+ <NICKNAME>Romeo</NICKNAME>
8
+ </vCard>
9
+ </iq>
10
+ XML
11
+ end
12
+
13
+ describe Blather::Stanza::Iq::Vcard do
14
+ it 'registers itself' do
15
+ Blather::XMPPNode.class_from_registration(:vCard, 'vcard-temp').must_equal Blather::Stanza::Iq::Vcard
16
+ end
17
+
18
+ it 'can be imported' do
19
+ doc = parse_stanza vcard_xml
20
+ query = Blather::XMPPNode.import(doc.root)
21
+ query.must_be_instance_of Blather::Stanza::Iq::Vcard
22
+ query.vcard.must_be_instance_of Blather::Stanza::Iq::Vcard::Vcard
23
+ end
24
+
25
+ it 'ensures a vcard node is present on create' do
26
+ query = Blather::Stanza::Iq::Vcard.new
27
+ query.xpath('ns:vCard', :ns => 'vcard-temp').wont_be_empty
28
+ end
29
+
30
+ it 'ensures a vcard node exists when calling #vcard' do
31
+ query = Blather::Stanza::Iq::Vcard.new
32
+ query.vcard.remove
33
+ query.xpath('ns:vCard', :ns => 'vcard-temp').must_be_empty
34
+
35
+ query.vcard.wont_be_nil
36
+ query.xpath('ns:vCard', :ns => 'vcard-temp').wont_be_empty
37
+ end
38
+
39
+ it 'ensures a vcard node is replaced when calling #vcard=' do
40
+ doc = parse_stanza vcard_xml
41
+ query = Blather::XMPPNode.import(doc.root)
42
+
43
+ new_vcard = Blather::Stanza::Iq::Vcard::Vcard.new
44
+ new_vcard["NICKNAME"] = 'Mercutio'
45
+
46
+ query.vcard = new_vcard
47
+
48
+ query.xpath('ns:vCard', :ns => 'vcard-temp').size.must_equal 1
49
+ query.find_first('ns:vCard/ns:NICKNAME', :ns => 'vcard-temp').content.must_equal 'Mercutio'
50
+ end
51
+ end
52
+
53
+ describe Blather::Stanza::Iq::Vcard::Vcard do
54
+ it 'can set vcard elements' do
55
+ query = Blather::Stanza::Iq::Vcard.new :set
56
+ query.vcard['NICKNAME'] = 'Romeo'
57
+ query.find_first('ns:vCard/ns:NICKNAME', :ns => 'vcard-temp').content.must_equal 'Romeo'
58
+ end
59
+
60
+ it 'can set deep vcard elements' do
61
+ query = Blather::Stanza::Iq::Vcard.new :set
62
+ query.vcard['PHOTO/TYPE'] = 'image/png'
63
+ query.vcard['PHOTO/BINVAL'] = '===='
64
+ query.find_first('ns:vCard/ns:PHOTO', :ns => 'vcard-temp').children.size.must_equal 2
65
+ query.find_first('ns:vCard/ns:PHOTO', :ns => 'vcard-temp').children.detect { |n| n.element_name == 'TYPE' && n.content == 'image/png' }.wont_be_nil
66
+ query.find_first('ns:vCard/ns:PHOTO', :ns => 'vcard-temp').children.detect { |n| n.element_name == 'BINVAL' && n.content == '====' }.wont_be_nil
67
+ end
68
+
69
+ it 'can get vcard elements' do
70
+ query = Blather::Stanza::Iq::Vcard.new :set
71
+ query.vcard['NICKNAME'] = 'Romeo'
72
+ query.vcard['NICKNAME'].must_equal 'Romeo'
73
+ end
74
+
75
+ it 'can get deep vcard elements' do
76
+ query = Blather::Stanza::Iq::Vcard.new :set
77
+ query.vcard['PHOTO/TYPE'] = 'image/png'
78
+ query.vcard['PHOTO/BINVAL'] = '===='
79
+ query.vcard['PHOTO/TYPE'].must_equal 'image/png'
80
+ query.vcard['PHOTO/BINVAL'].must_equal '===='
81
+ end
82
+
83
+ it 'returns nil on vcard elements which does not exist' do
84
+ query = Blather::Stanza::Iq::Vcard.new :set
85
+ query.vcard['NICKNAME'] = 'Romeo'
86
+ query.vcard['FN'].must_be_nil
87
+ end
88
+
89
+ it 'can update vcard elements' do
90
+ doc = parse_stanza vcard_xml
91
+ query = Blather::XMPPNode.import(doc.root)
92
+ query.vcard['NICKNAME'].must_equal 'Romeo'
93
+ query.vcard['NICKNAME'] = 'Mercutio'
94
+ query.vcard['NICKNAME'].must_equal 'Mercutio'
95
+ end
96
+ end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), *%w[.. .. spec_helper])
1
+ require File.expand_path "../../../spec_helper", __FILE__
2
2
 
3
3
  describe Blather::Stanza::Iq do
4
4
  it 'registers itself' do
@@ -1,4 +1,39 @@
1
- require File.join(File.dirname(__FILE__), *%w[.. .. spec_helper])
1
+ require File.expand_path "../../../spec_helper", __FILE__
2
+
3
+ def ichat_message_xml
4
+ <<-XML
5
+ <message from="juliet@example.com/balcony" to="romeo@example.net" type="chat" id="iChat_5FA6C6DC">
6
+ <body>Hello</body>
7
+ <html xmlns="http://www.w3.org/1999/xhtml">
8
+ <body style="background-color:#7bb5ee;color:#000000;">
9
+ <span style="font-family: 'Arial';font-size: 12px;color: #262626;">Hello</span>
10
+ <img alt="f5ad3a04d218d7160fa02415e02d41b3.jpg" src="message-attachments:1" width="30" height="30"/>
11
+ </body>
12
+ </html>
13
+
14
+ <x xmlns="http://www.apple.com/xmpp/message-attachments">
15
+ <attachment id="1">
16
+ <sipub xmlns="http://jabber.org/protocol/sipub" from="juliet@example.com/balcony" id="sipubid_77933F62" mime-type="binary/octet-stream" profile="http://jabber.org/protocol/si/profile/file-transfer">
17
+ <file xmlns="http://jabber.org/protocol/si/profile/file-transfer" xmlns:ichat="apple:profile:transfer-extensions" name="f5ad3a04d218d7160fa02415e02d41b3.jpg" size="1245" posixflags="000001A4"/>
18
+ </sipub>
19
+ </attachment>
20
+ </x>
21
+
22
+ <iq type="set" id="iChat_4CC32F1F" to="romeo@example.net">
23
+ <si xmlns="http://jabber.org/protocol/si" id="sid_60C2D273" mime-type="binary/octet-stream" profile="http://jabber.org/protocol/si/profile/file-transfer">
24
+ <file xmlns="http://jabber.org/protocol/si/profile/file-transfer" xmlns:ichat="apple:profile:transfer-extensions" name="f5ad3a04d218d7160fa02415e02d41b3.jpg" size="1245" posixflags="000001A4"/>
25
+ <feature xmlns="http://jabber.org/protocol/feature-neg">
26
+ <x xmlns="jabber:x:data" type="form">
27
+ <field type="list-single" var="stream-method">
28
+ <option><value>http://jabber.org/protocol/bytestreams</value></option>
29
+ </field>
30
+ </x>
31
+ </feature>
32
+ </si>
33
+ </iq>
34
+ </message>
35
+ XML
36
+ end
2
37
 
3
38
  def message_xml
4
39
  <<-XML
@@ -11,6 +46,7 @@ def message_xml
11
46
  <x xmlns='jabber:x:data' type='form'>
12
47
  <field var='field-name' type='text-single' label='description' />
13
48
  </x>
49
+ <paused xmlns="http://jabber.org/protocol/chatstates"/>
14
50
  </message>
15
51
  XML
16
52
  end
@@ -22,6 +58,7 @@ describe Blather::Stanza::Message do
22
58
 
23
59
  it 'must be importable' do
24
60
  Blather::XMPPNode.import(parse_stanza(message_xml).root).must_be_instance_of Blather::Stanza::Message
61
+ Blather::XMPPNode.import(parse_stanza(ichat_message_xml).root).must_be_instance_of Blather::Stanza::Message
25
62
  end
26
63
 
27
64
  it 'provides "attr_accessor" for body' do
@@ -144,6 +181,11 @@ describe Blather::Stanza::Message do
144
181
  msg.xhtml.must_equal(xhtml)
145
182
  end
146
183
 
184
+ it 'finds xhtml body when html wrapper has wrong namespace' do
185
+ msg = Blather::XMPPNode.import(parse_stanza(ichat_message_xml).root)
186
+ msg.xhtml.must_equal "<span style=\"font-family: 'Arial';font-size: 12px;color: #262626;\">Hello</span>\n <img alt=\"f5ad3a04d218d7160fa02415e02d41b3.jpg\" src=\"message-attachments:1\" width=\"30\" height=\"30\"></img>"
187
+ end
188
+
147
189
  it 'has a chat state setter' do
148
190
  msg = Blather::Stanza::Message.new
149
191
  msg.chat_state = :composing
@@ -157,7 +199,7 @@ describe Blather::Stanza::Message do
157
199
 
158
200
  msg.xpath('ns:*', :ns => Blather::Stanza::Message::CHAT_STATE_NS).size.must_equal(1)
159
201
  end
160
-
202
+
161
203
  it 'ensures chat state setter accepts strings' do
162
204
  msg = Blather::Stanza::Message.new
163
205
  msg.chat_state = "gone"
@@ -183,6 +225,10 @@ describe Blather::Stanza::Message do
183
225
  msg.chat_state.must_equal(:paused)
184
226
  end
185
227
 
228
+ it 'imports correct chat state' do
229
+ Blather::XMPPNode.import(parse_stanza(message_xml).root).chat_state.must_equal :paused
230
+ end
231
+
186
232
  it 'makes a form child available' do
187
233
  n = Blather::XMPPNode.import(parse_stanza(message_xml).root)
188
234
  n.form.fields.size.must_equal 1
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), *%w[.. .. .. spec_helper])
1
+ require File.expand_path "../../../../spec_helper", __FILE__
2
2
 
3
3
  describe Blather::Stanza::Presence::Status do
4
4
  it 'registers itself' do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), *%w[.. .. .. spec_helper])
1
+ require File.expand_path "../../../../spec_helper", __FILE__
2
2
 
3
3
  describe Blather::Stanza::Presence::Subscription do
4
4
  it 'registers itself' do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), *%w[.. .. spec_helper])
1
+ require File.expand_path "../../../spec_helper", __FILE__
2
2
 
3
3
  describe Blather::Stanza::Presence do
4
4
  it 'registers itself' do
@@ -1,5 +1,5 @@
1
- require File.join(File.dirname(__FILE__), *%w[.. .. .. spec_helper])
2
- require File.join(File.dirname(__FILE__), *%w[.. .. .. fixtures pubsub])
1
+ require File.expand_path "../../../../spec_helper", __FILE__
2
+ require File.expand_path "../../../../fixtures/pubsub", __FILE__
3
3
 
4
4
  def control_affiliations
5
5
  { :owner => ['node1', 'node2'],
@@ -1,5 +1,5 @@
1
- require File.join(File.dirname(__FILE__), *%w[.. .. .. spec_helper])
2
- require File.join(File.dirname(__FILE__), *%w[.. .. .. fixtures pubsub])
1
+ require File.expand_path "../../../../spec_helper", __FILE__
2
+ require File.expand_path "../../../../fixtures/pubsub", __FILE__
3
3
 
4
4
  describe Blather::Stanza::PubSub::Create do
5
5
  it 'registers itself' do
@@ -1,5 +1,5 @@
1
- require File.join(File.dirname(__FILE__), *%w[.. .. .. spec_helper])
2
- require File.join(File.dirname(__FILE__), *%w[.. .. .. fixtures pubsub])
1
+ require File.expand_path "../../../../spec_helper", __FILE__
2
+ require File.expand_path "../../../../fixtures/pubsub", __FILE__
3
3
 
4
4
  describe Blather::Stanza::PubSub::Event do
5
5
  it 'registers itself' do
@@ -81,4 +81,18 @@ describe Blather::Stanza::PubSub::Event do
81
81
  evt.purge?.wont_be_nil
82
82
  evt.node.must_equal 'princely_musings'
83
83
  end
84
+
85
+ it 'can be a subscription notification' do
86
+ evt = Blather::XMPPNode.import(parse_stanza(<<-NODE).root)
87
+ <message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'>
88
+ <event xmlns='http://jabber.org/protocol/pubsub#event'>
89
+ <subscription jid='francisco@denmark.lit' subscription='subscribed' node='/example.com/test'/>
90
+ </event>
91
+ </message>
92
+ NODE
93
+ evt.subscription?.wont_be_nil
94
+ evt.subscription[:jid].must_equal 'francisco@denmark.lit'
95
+ evt.subscription[:subscription].must_equal 'subscribed'
96
+ evt.subscription[:node].must_equal '/example.com/test'
97
+ end
84
98
  end
@@ -1,5 +1,5 @@
1
- require File.join(File.dirname(__FILE__), *%w[.. .. .. spec_helper])
2
- require File.join(File.dirname(__FILE__), *%w[.. .. .. fixtures pubsub])
1
+ require File.expand_path "../../../../spec_helper", __FILE__
2
+ require File.expand_path "../../../../fixtures/pubsub", __FILE__
3
3
 
4
4
  describe Blather::Stanza::PubSub::Items do
5
5
  it 'registers itself' do
@@ -1,5 +1,5 @@
1
- require File.join(File.dirname(__FILE__), *%w[.. .. .. spec_helper])
2
- require File.join(File.dirname(__FILE__), *%w[.. .. .. fixtures pubsub])
1
+ require File.expand_path "../../../../spec_helper", __FILE__
2
+ require File.expand_path "../../../../fixtures/pubsub", __FILE__
3
3
 
4
4
  describe Blather::Stanza::PubSub::Publish do
5
5
  it 'registers itself' do
@@ -1,5 +1,5 @@
1
- require File.join(File.dirname(__FILE__), *%w[.. .. .. spec_helper])
2
- require File.join(File.dirname(__FILE__), *%w[.. .. .. fixtures pubsub])
1
+ require File.expand_path "../../../../spec_helper", __FILE__
2
+ require File.expand_path "../../../../fixtures/pubsub", __FILE__
3
3
 
4
4
  describe Blather::Stanza::PubSub::Retract do
5
5
  it 'registers itself' do