shingara-blather 0.4.8

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 (100) hide show
  1. data/LICENSE +22 -0
  2. data/README.md +162 -0
  3. data/examples/echo.rb +18 -0
  4. data/examples/execute.rb +16 -0
  5. data/examples/ping_pong.rb +37 -0
  6. data/examples/print_hierarchy.rb +76 -0
  7. data/examples/rosterprint.rb +14 -0
  8. data/examples/stream_only.rb +27 -0
  9. data/examples/xmpp4r/echo.rb +35 -0
  10. data/lib/blather/client/client.rb +310 -0
  11. data/lib/blather/client/dsl/pubsub.rb +170 -0
  12. data/lib/blather/client/dsl.rb +264 -0
  13. data/lib/blather/client.rb +87 -0
  14. data/lib/blather/core_ext/nokogiri.rb +40 -0
  15. data/lib/blather/errors/sasl_error.rb +43 -0
  16. data/lib/blather/errors/stanza_error.rb +107 -0
  17. data/lib/blather/errors/stream_error.rb +82 -0
  18. data/lib/blather/errors.rb +69 -0
  19. data/lib/blather/jid.rb +142 -0
  20. data/lib/blather/roster.rb +111 -0
  21. data/lib/blather/roster_item.rb +122 -0
  22. data/lib/blather/stanza/disco/disco_info.rb +176 -0
  23. data/lib/blather/stanza/disco/disco_items.rb +132 -0
  24. data/lib/blather/stanza/disco.rb +25 -0
  25. data/lib/blather/stanza/iq/query.rb +53 -0
  26. data/lib/blather/stanza/iq/roster.rb +179 -0
  27. data/lib/blather/stanza/iq.rb +138 -0
  28. data/lib/blather/stanza/message.rb +332 -0
  29. data/lib/blather/stanza/presence/status.rb +212 -0
  30. data/lib/blather/stanza/presence/subscription.rb +101 -0
  31. data/lib/blather/stanza/presence.rb +163 -0
  32. data/lib/blather/stanza/pubsub/affiliations.rb +79 -0
  33. data/lib/blather/stanza/pubsub/create.rb +65 -0
  34. data/lib/blather/stanza/pubsub/errors.rb +18 -0
  35. data/lib/blather/stanza/pubsub/event.rb +123 -0
  36. data/lib/blather/stanza/pubsub/items.rb +103 -0
  37. data/lib/blather/stanza/pubsub/publish.rb +103 -0
  38. data/lib/blather/stanza/pubsub/retract.rb +92 -0
  39. data/lib/blather/stanza/pubsub/subscribe.rb +68 -0
  40. data/lib/blather/stanza/pubsub/subscription.rb +134 -0
  41. data/lib/blather/stanza/pubsub/subscriptions.rb +81 -0
  42. data/lib/blather/stanza/pubsub/unsubscribe.rb +68 -0
  43. data/lib/blather/stanza/pubsub.rb +129 -0
  44. data/lib/blather/stanza/pubsub_owner/delete.rb +52 -0
  45. data/lib/blather/stanza/pubsub_owner/purge.rb +52 -0
  46. data/lib/blather/stanza/pubsub_owner.rb +51 -0
  47. data/lib/blather/stanza.rb +149 -0
  48. data/lib/blather/stream/client.rb +31 -0
  49. data/lib/blather/stream/component.rb +38 -0
  50. data/lib/blather/stream/features/resource.rb +63 -0
  51. data/lib/blather/stream/features/sasl.rb +187 -0
  52. data/lib/blather/stream/features/session.rb +44 -0
  53. data/lib/blather/stream/features/tls.rb +28 -0
  54. data/lib/blather/stream/features.rb +53 -0
  55. data/lib/blather/stream/parser.rb +102 -0
  56. data/lib/blather/stream.rb +231 -0
  57. data/lib/blather/xmpp_node.rb +218 -0
  58. data/lib/blather.rb +78 -0
  59. data/spec/blather/client/client_spec.rb +559 -0
  60. data/spec/blather/client/dsl/pubsub_spec.rb +462 -0
  61. data/spec/blather/client/dsl_spec.rb +143 -0
  62. data/spec/blather/core_ext/nokogiri_spec.rb +83 -0
  63. data/spec/blather/errors/sasl_error_spec.rb +33 -0
  64. data/spec/blather/errors/stanza_error_spec.rb +129 -0
  65. data/spec/blather/errors/stream_error_spec.rb +108 -0
  66. data/spec/blather/errors_spec.rb +33 -0
  67. data/spec/blather/jid_spec.rb +87 -0
  68. data/spec/blather/roster_item_spec.rb +96 -0
  69. data/spec/blather/roster_spec.rb +103 -0
  70. data/spec/blather/stanza/discos/disco_info_spec.rb +226 -0
  71. data/spec/blather/stanza/discos/disco_items_spec.rb +148 -0
  72. data/spec/blather/stanza/iq/query_spec.rb +64 -0
  73. data/spec/blather/stanza/iq/roster_spec.rb +140 -0
  74. data/spec/blather/stanza/iq_spec.rb +45 -0
  75. data/spec/blather/stanza/message_spec.rb +132 -0
  76. data/spec/blather/stanza/presence/status_spec.rb +132 -0
  77. data/spec/blather/stanza/presence/subscription_spec.rb +105 -0
  78. data/spec/blather/stanza/presence_spec.rb +66 -0
  79. data/spec/blather/stanza/pubsub/affiliations_spec.rb +57 -0
  80. data/spec/blather/stanza/pubsub/create_spec.rb +56 -0
  81. data/spec/blather/stanza/pubsub/event_spec.rb +84 -0
  82. data/spec/blather/stanza/pubsub/items_spec.rb +79 -0
  83. data/spec/blather/stanza/pubsub/publish_spec.rb +83 -0
  84. data/spec/blather/stanza/pubsub/retract_spec.rb +75 -0
  85. data/spec/blather/stanza/pubsub/subscribe_spec.rb +61 -0
  86. data/spec/blather/stanza/pubsub/subscription_spec.rb +97 -0
  87. data/spec/blather/stanza/pubsub/subscriptions_spec.rb +59 -0
  88. data/spec/blather/stanza/pubsub/unsubscribe_spec.rb +61 -0
  89. data/spec/blather/stanza/pubsub_owner/delete_spec.rb +50 -0
  90. data/spec/blather/stanza/pubsub_owner/purge_spec.rb +50 -0
  91. data/spec/blather/stanza/pubsub_owner_spec.rb +27 -0
  92. data/spec/blather/stanza/pubsub_spec.rb +67 -0
  93. data/spec/blather/stanza_spec.rb +116 -0
  94. data/spec/blather/stream/client_spec.rb +1011 -0
  95. data/spec/blather/stream/component_spec.rb +95 -0
  96. data/spec/blather/stream/parser_spec.rb +145 -0
  97. data/spec/blather/xmpp_node_spec.rb +231 -0
  98. data/spec/fixtures/pubsub.rb +311 -0
  99. data/spec/spec_helper.rb +43 -0
  100. metadata +249 -0
@@ -0,0 +1,132 @@
1
+ require File.join(File.dirname(__FILE__), *%w[.. .. spec_helper])
2
+
3
+ describe Blather::Stanza::Message do
4
+ it 'registers itself' do
5
+ Blather::XMPPNode.class_from_registration(:message, nil).must_equal Blather::Stanza::Message
6
+ end
7
+
8
+ it 'must be importable' do
9
+ doc = parse_stanza <<-XML
10
+ <message
11
+ to='romeo@example.net'
12
+ from='juliet@example.com/balcony'
13
+ type='chat'
14
+ xml:lang='en'>
15
+ <body>Wherefore art thou, Romeo?</body>
16
+ </message>
17
+ XML
18
+ Blather::XMPPNode.import(doc.root).must_be_instance_of Blather::Stanza::Message
19
+ end
20
+
21
+ it 'provides "attr_accessor" for body' do
22
+ s = Blather::Stanza::Message.new
23
+ s.body.must_be_nil
24
+ s.find('body').must_be_empty
25
+
26
+ s.body = 'test message'
27
+ s.body.wont_be_nil
28
+ s.find('body').wont_be_empty
29
+ end
30
+
31
+ it 'provides "attr_accessor" for subject' do
32
+ s = Blather::Stanza::Message.new
33
+ s.subject.must_be_nil
34
+ s.find('subject').must_be_empty
35
+
36
+ s.subject = 'test subject'
37
+ s.subject.wont_be_nil
38
+ s.find('subject').wont_be_empty
39
+ end
40
+
41
+ it 'provides "attr_accessor" for thread' do
42
+ s = Blather::Stanza::Message.new
43
+ s.thread.must_be_nil
44
+ s.find('thread').must_be_empty
45
+
46
+ s.thread = 1234
47
+ s.thread.wont_be_nil
48
+ s.find('thread').wont_be_empty
49
+ end
50
+
51
+ it 'can set a parent attribute for thread' do
52
+ s = Blather::Stanza::Message.new
53
+ s.thread.must_be_nil
54
+ s.find('thread').must_be_empty
55
+
56
+ s.thread = {4321 => 1234}
57
+ s.thread.must_equal '1234'
58
+ s.parent_thread.must_equal '4321'
59
+ s.find('thread[@parent="4321"]').wont_be_empty
60
+ end
61
+
62
+ it 'ensures type is one of Blather::Stanza::Message::VALID_TYPES' do
63
+ lambda { Blather::Stanza::Message.new nil, nil, :invalid_type_name }.must_raise(Blather::ArgumentError)
64
+
65
+ Blather::Stanza::Message::VALID_TYPES.each do |valid_type|
66
+ msg = Blather::Stanza::Message.new nil, nil, valid_type
67
+ msg.type.must_equal valid_type
68
+ end
69
+ end
70
+
71
+ Blather::Stanza::Message::VALID_TYPES.each do |valid_type|
72
+ it "provides a helper (#{valid_type}?) for type #{valid_type}" do
73
+ Blather::Stanza::Message.new.must_respond_to :"#{valid_type}?"
74
+ end
75
+ end
76
+
77
+ it 'ensures an html node exists when asked for xhtml_node' do
78
+ search_args = [
79
+ '/message/html_ns:html',
80
+ {:html_ns => Blather::Stanza::Message::HTML_NS}
81
+ ]
82
+ msg = Blather::Stanza::Message.new
83
+ msg.find_first(*search_args).must_be_nil
84
+
85
+ msg.xhtml_node
86
+ msg.find_first(*search_args).wont_be_nil
87
+ end
88
+
89
+ it 'ensures a body node exists when asked for xhtml_node' do
90
+ search_args = [
91
+ '/message/html_ns:html/body_ns:body',
92
+ {:html_ns => Blather::Stanza::Message::HTML_NS,
93
+ :body_ns => Blather::Stanza::Message::HTML_BODY_NS}
94
+ ]
95
+ msg = Blather::Stanza::Message.new
96
+ msg.find_first(*search_args).must_be_nil
97
+
98
+ msg.xhtml_node
99
+ msg.find_first(*search_args).wont_be_nil
100
+ end
101
+
102
+ it 'returns an existing node when asked for xhtml_node' do
103
+ msg = Blather::Stanza::Message.new
104
+ msg << (h = Blather::XMPPNode.new('html', msg.document))
105
+ h.namespace = Blather::Stanza::Message::HTML_NS
106
+ h << (b = Blather::XMPPNode.new('body', msg.document))
107
+ b.namespace = Blather::Stanza::Message::HTML_BODY_NS
108
+
109
+ msg.xhtml_node.must_equal(b)
110
+ end
111
+
112
+ it 'has an xhtml setter' do
113
+ msg = Blather::Stanza::Message.new
114
+ xhtml = "<some>xhtml</some>"
115
+ msg.xhtml = xhtml
116
+ msg.xhtml_node.content.strip.must_equal(xhtml)
117
+ end
118
+
119
+ it 'sets valid xhtml even if the input is not valid' do
120
+ msg = Blather::Stanza::Message.new
121
+ xhtml = "<some>xhtml"
122
+ msg.xhtml = xhtml
123
+ msg.xhtml_node.content.strip.must_equal("<some>xhtml</some>")
124
+ end
125
+
126
+ it 'has an xhtml getter' do
127
+ msg = Blather::Stanza::Message.new
128
+ xhtml = "<some>xhtml</some>"
129
+ msg.xhtml = xhtml
130
+ msg.xhtml.must_equal(xhtml)
131
+ end
132
+ end
@@ -0,0 +1,132 @@
1
+ require File.join(File.dirname(__FILE__), *%w[.. .. .. spec_helper])
2
+
3
+ describe Blather::Stanza::Presence::Status do
4
+ it 'registers itself' do
5
+ Blather::XMPPNode.class_from_registration(:status, nil).must_equal Blather::Stanza::Presence::Status
6
+ end
7
+
8
+ it 'must be importable as unavailable' do
9
+ doc = parse_stanza '<presence type="unavailable"/>'
10
+ Blather::XMPPNode.import(doc.root).must_be_instance_of Blather::Stanza::Presence::Status
11
+ end
12
+
13
+ it 'must be importable as nil' do
14
+ doc = parse_stanza '<presence/>'
15
+ Blather::XMPPNode.import(doc.root).must_be_instance_of Blather::Stanza::Presence::Status
16
+ end
17
+
18
+ it 'can set state on creation' do
19
+ status = Blather::Stanza::Presence::Status.new :away
20
+ status.state.must_equal :away
21
+ end
22
+
23
+ it 'can set a message on creation' do
24
+ status = Blather::Stanza::Presence::Status.new nil, 'Say hello!'
25
+ status.message.must_equal 'Say hello!'
26
+ end
27
+
28
+ it 'ensures type is nil or :unavailable' do
29
+ status = Blather::Stanza::Presence::Status.new
30
+ lambda { status.type = :invalid_type_name }.must_raise(Blather::ArgumentError)
31
+
32
+ [nil, :unavailable].each do |valid_type|
33
+ status.type = valid_type
34
+ status.type.must_equal valid_type
35
+ end
36
+ end
37
+
38
+ it 'ensures state is one of Presence::Status::VALID_STATES' do
39
+ status = Blather::Stanza::Presence::Status.new
40
+ lambda { status.state = :invalid_type_name }.must_raise(Blather::ArgumentError)
41
+
42
+ Blather::Stanza::Presence::Status::VALID_STATES.each do |valid_state|
43
+ status.state = valid_state
44
+ status.state.must_equal valid_state
45
+ end
46
+ end
47
+
48
+ it 'returns :available if state is nil' do
49
+ Blather::Stanza::Presence::Status.new.state.must_equal :available
50
+ end
51
+
52
+ it 'returns :available if <show/> is blank' do
53
+ status = Blather::XMPPNode.import(parse_stanza(<<-NODE).root)
54
+ <presence><show/><presence/>
55
+ NODE
56
+ status.state.must_equal :available
57
+ end
58
+
59
+ it 'returns :unavailable if type is :unavailable' do
60
+ status = Blather::Stanza::Presence::Status.new
61
+ status.type = :unavailable
62
+ status.state.must_equal :unavailable
63
+ end
64
+
65
+ it 'ensures priority is not greater than 127' do
66
+ lambda { Blather::Stanza::Presence::Status.new.priority = 128 }.must_raise(Blather::ArgumentError)
67
+ end
68
+
69
+ it 'ensures priority is not less than -128' do
70
+ lambda { Blather::Stanza::Presence::Status.new.priority = -129 }.must_raise(Blather::ArgumentError)
71
+ end
72
+
73
+ it 'has "attr_accessor" for priority' do
74
+ status = Blather::Stanza::Presence::Status.new
75
+ status.priority.must_equal 0
76
+
77
+ status.priority = 10
78
+ status.children.detect { |n| n.element_name == 'priority' }.wont_be_nil
79
+ status.priority.must_equal 10
80
+ end
81
+
82
+ it 'has "attr_accessor" for message' do
83
+ status = Blather::Stanza::Presence::Status.new
84
+ status.message.must_be_nil
85
+
86
+ status.message = 'new message'
87
+ status.children.detect { |n| n.element_name == 'status' }.wont_be_nil
88
+ status.message.must_equal 'new message'
89
+ end
90
+
91
+ it 'must be comparable by priority' do
92
+ jid = Blather::JID.new 'a@b/c'
93
+
94
+ status1 = Blather::Stanza::Presence::Status.new
95
+ status1.from = jid
96
+
97
+ status2 = Blather::Stanza::Presence::Status.new
98
+ status2.from = jid
99
+
100
+ status1.priority = 1
101
+ status2.priority = -1
102
+ (status1 <=> status2).must_equal 1
103
+ (status2 <=> status1).must_equal -1
104
+
105
+ status2.priority = 1
106
+ (status1 <=> status2).must_equal 0
107
+ end
108
+
109
+ it 'raises an argument error if compared to a status with a different Blather::JID' do
110
+ status1 = Blather::Stanza::Presence::Status.new
111
+ status1.from = 'a@b/c'
112
+
113
+ status2 = Blather::Stanza::Presence::Status.new
114
+ status2.from = 'd@e/f'
115
+
116
+ lambda { status1 <=> status2 }.must_raise(Blather::ArgumentError)
117
+ end
118
+
119
+ ([:available] + Blather::Stanza::Presence::Status::VALID_STATES).each do |valid_state|
120
+ it "provides a helper (#{valid_state}?) for state #{valid_state}" do
121
+ Blather::Stanza::Presence::Status.new.must_respond_to :"#{valid_state}?"
122
+ end
123
+
124
+ it "returns true on call to (#{valid_state}?) if state == #{valid_state}" do
125
+ method = "#{valid_state}?".to_sym
126
+ stat = Blather::Stanza::Presence::Status.new
127
+ stat.state = valid_state
128
+ stat.must_respond_to method
129
+ stat.__send__(method).must_equal true
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,105 @@
1
+ require File.join(File.dirname(__FILE__), *%w[.. .. .. spec_helper])
2
+
3
+ describe Blather::Stanza::Presence::Subscription do
4
+ it 'registers itself' do
5
+ Blather::XMPPNode.class_from_registration(:subscription, nil).must_equal Blather::Stanza::Presence::Subscription
6
+ end
7
+
8
+ [:subscribe, :subscribed, :unsubscribe, :unsubscribed].each do |type|
9
+ it "must be importable as #{type}" do
10
+ doc = parse_stanza "<presence type='#{type}'/>"
11
+ Blather::XMPPNode.import(doc.root).must_be_instance_of Blather::Stanza::Presence::Subscription
12
+ end
13
+ end
14
+
15
+ it 'can set to on creation' do
16
+ sub = Blather::Stanza::Presence::Subscription.new 'a@b'
17
+ sub.to.to_s.must_equal 'a@b'
18
+ end
19
+
20
+ it 'can set a type on creation' do
21
+ sub = Blather::Stanza::Presence::Subscription.new nil, :subscribed
22
+ sub.type.must_equal :subscribed
23
+ end
24
+
25
+ it 'strips Blather::JIDs when setting #to' do
26
+ sub = Blather::Stanza::Presence::Subscription.new 'a@b/c'
27
+ sub.to.to_s.must_equal 'a@b'
28
+ end
29
+
30
+ it 'generates an approval using #approve!' do
31
+ jid = Blather::JID.new 'a@b'
32
+ sub = Blather::Stanza::Presence::Subscription.new
33
+ sub.from = jid
34
+ sub.approve!
35
+ sub.to.must_equal jid
36
+ sub.type.must_equal :subscribed
37
+ end
38
+
39
+ it 'generates a refusal using #refuse!' do
40
+ jid = Blather::JID.new 'a@b'
41
+ sub = Blather::Stanza::Presence::Subscription.new
42
+ sub.from = jid
43
+ sub.refuse!
44
+ sub.to.must_equal jid
45
+ sub.type.must_equal :unsubscribed
46
+ end
47
+
48
+ it 'generates an unsubscript using #unsubscribe!' do
49
+ jid = Blather::JID.new 'a@b'
50
+ sub = Blather::Stanza::Presence::Subscription.new
51
+ sub.from = jid
52
+ sub.unsubscribe!
53
+ sub.to.must_equal jid
54
+ sub.type.must_equal :unsubscribe
55
+ end
56
+
57
+ it 'generates a cancellation using #cancel!' do
58
+ jid = Blather::JID.new 'a@b'
59
+ sub = Blather::Stanza::Presence::Subscription.new
60
+ sub.from = jid
61
+ sub.cancel!
62
+ sub.to.must_equal jid
63
+ sub.type.must_equal :unsubscribed
64
+ end
65
+
66
+ it 'generates a request using #request!' do
67
+ jid = Blather::JID.new 'a@b'
68
+ sub = Blather::Stanza::Presence::Subscription.new
69
+ sub.from = jid
70
+ sub.request!
71
+ sub.to.must_equal jid
72
+ sub.type.must_equal :subscribe
73
+ end
74
+
75
+ it 'has a #request? helper' do
76
+ sub = Blather::Stanza::Presence::Subscription.new
77
+ sub.must_respond_to :request?
78
+ sub.type = :subscribe
79
+ sub.request?.must_equal true
80
+ end
81
+
82
+ it "successfully routes chained actions" do
83
+ from = Blather::JID.new("foo@bar.com")
84
+ to = Blather::JID.new("baz@quux.com")
85
+ sub = Blather::Stanza::Presence::Subscription.new
86
+ sub.from = from
87
+ sub.to = to
88
+ sub.cancel!
89
+ sub.unsubscribe!
90
+ sub.type.must_equal :unsubscribe
91
+ sub.to.must_equal from
92
+ sub.from.must_equal to
93
+ end
94
+
95
+ it "will inherit only another node's attributes" do
96
+ inheritable = Blather::XMPPNode.new 'foo'
97
+ inheritable[:bar] = 'baz'
98
+
99
+ sub = Blather::Stanza::Presence::Subscription.new
100
+ sub.must_respond_to :inherit
101
+
102
+ sub.inherit inheritable
103
+ sub[:bar].must_equal 'baz'
104
+ end
105
+ end
@@ -0,0 +1,66 @@
1
+ require File.join(File.dirname(__FILE__), *%w[.. .. spec_helper])
2
+
3
+ describe Blather::Stanza::Presence do
4
+ it 'registers itself' do
5
+ Blather::XMPPNode.class_from_registration(:presence, nil).must_equal Blather::Stanza::Presence
6
+ end
7
+
8
+ it 'must be importable' do
9
+ doc = parse_stanza '<presence type="probe"/>'
10
+ Blather::XMPPNode.import(doc.root).must_be_instance_of Blather::Stanza::Presence
11
+ end
12
+
13
+ it 'ensures type is one of Blather::Stanza::Presence::VALID_TYPES' do
14
+ presence = Blather::Stanza::Presence.new
15
+ lambda { presence.type = :invalid_type_name }.must_raise(Blather::ArgumentError)
16
+
17
+ Blather::Stanza::Presence::VALID_TYPES.each do |valid_type|
18
+ presence.type = valid_type
19
+ presence.type.must_equal valid_type
20
+ end
21
+ end
22
+
23
+ Blather::Stanza::Presence::VALID_TYPES.each do |valid_type|
24
+ it "provides a helper (#{valid_type}?) for type #{valid_type}" do
25
+ Blather::Stanza::Presence.new.must_respond_to :"#{valid_type}?"
26
+ end
27
+
28
+ it "returns true on call to (#{valid_type}?) if type == #{valid_type}" do
29
+ method = "#{valid_type}?".to_sym
30
+ pres = Blather::Stanza::Presence.new
31
+ pres.type = valid_type
32
+ pres.must_respond_to method
33
+ pres.__send__(method).must_equal true
34
+ end
35
+ end
36
+
37
+ it 'creates a Status object when importing a node with type == nil' do
38
+ s = Blather::Stanza::Presence.import(Blather::XMPPNode.new)
39
+ s.must_be_kind_of Blather::Stanza::Presence::Status
40
+ s.state.must_equal :available
41
+ end
42
+
43
+ it 'creates a Status object when importing a node with type == "unavailable"' do
44
+ n = Blather::XMPPNode.new
45
+ n[:type] = :unavailable
46
+ s = Blather::Stanza::Presence.import(n)
47
+ s.must_be_kind_of Blather::Stanza::Presence::Status
48
+ s.state.must_equal :unavailable
49
+ end
50
+
51
+ it 'creates a Subscription object when importing a node with type == "subscribe"' do
52
+ n = Blather::XMPPNode.new
53
+ n[:type] = :subscribe
54
+ s = Blather::Stanza::Presence.import(n)
55
+ s.must_be_kind_of Blather::Stanza::Presence::Subscription
56
+ s.type.must_equal :subscribe
57
+ end
58
+
59
+ it 'creates a Presence object when importing a node with type equal to something unkown' do
60
+ n = Blather::XMPPNode.new
61
+ n[:type] = :foo
62
+ s = Blather::Stanza::Presence.import(n)
63
+ s.must_be_kind_of Blather::Stanza::Presence
64
+ s.type.must_equal :foo
65
+ end
66
+ end
@@ -0,0 +1,57 @@
1
+ require File.join(File.dirname(__FILE__), *%w[.. .. .. spec_helper])
2
+ require File.join(File.dirname(__FILE__), *%w[.. .. .. fixtures pubsub])
3
+
4
+ def control_affiliations
5
+ { :owner => ['node1', 'node2'],
6
+ :publisher => ['node3'],
7
+ :outcast => ['node4'],
8
+ :member => ['node5'],
9
+ :none => ['node6'] }
10
+ end
11
+
12
+ describe Blather::Stanza::PubSub::Affiliations do
13
+ it 'registers itself' do
14
+ Blather::XMPPNode.class_from_registration(:affiliations, Blather::Stanza::PubSub.registered_ns).must_equal Blather::Stanza::PubSub::Affiliations
15
+ end
16
+
17
+ it 'can be imported' do
18
+ Blather::XMPPNode.import(parse_stanza(affiliations_xml).root).must_be_instance_of Blather::Stanza::PubSub::Affiliations
19
+ end
20
+
21
+ it 'ensures an affiliations node is present on create' do
22
+ affiliations = Blather::Stanza::PubSub::Affiliations.new
23
+ affiliations.find_first('//ns:affiliations', :ns => Blather::Stanza::PubSub.registered_ns).wont_be_nil
24
+ end
25
+
26
+ it 'ensures an affiliations node exists when calling #affiliations' do
27
+ affiliations = Blather::Stanza::PubSub::Affiliations.new
28
+ affiliations.pubsub.remove_children :affiliations
29
+ affiliations.find_first('//ns:affiliations', :ns => Blather::Stanza::PubSub.registered_ns).must_be_nil
30
+
31
+ affiliations.affiliations.wont_be_nil
32
+ affiliations.find_first('//ns:affiliations', :ns => Blather::Stanza::PubSub.registered_ns).wont_be_nil
33
+ end
34
+
35
+ it 'defaults to a get node' do
36
+ Blather::Stanza::PubSub::Affiliations.new.type.must_equal :get
37
+ end
38
+
39
+ it 'sets the host if requested' do
40
+ aff = Blather::Stanza::PubSub::Affiliations.new :get, 'pubsub.jabber.local'
41
+ aff.to.must_equal Blather::JID.new('pubsub.jabber.local')
42
+ end
43
+
44
+ it 'can import an affiliates result node' do
45
+ node = parse_stanza(affiliations_xml).root
46
+
47
+ affiliations = Blather::Stanza::PubSub::Affiliations.new.inherit node
48
+ affiliations.size.must_equal 5
49
+ affiliations.list.must_equal control_affiliations
50
+ end
51
+
52
+ it 'will iterate over each affiliation' do
53
+ Blather::XMPPNode.import(parse_stanza(affiliations_xml).root).each do |type, nodes|
54
+ nodes.must_equal control_affiliations[type]
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,56 @@
1
+ require File.join(File.dirname(__FILE__), *%w[.. .. .. spec_helper])
2
+ require File.join(File.dirname(__FILE__), *%w[.. .. .. fixtures pubsub])
3
+
4
+ describe Blather::Stanza::PubSub::Create do
5
+ it 'registers itself' do
6
+ Blather::XMPPNode.class_from_registration(:create, 'http://jabber.org/protocol/pubsub').must_equal Blather::Stanza::PubSub::Create
7
+ end
8
+
9
+ it 'can be imported' do
10
+ Blather::XMPPNode.import(parse_stanza(<<-NODE).root).must_be_instance_of Blather::Stanza::PubSub::Create
11
+ <iq type='set'
12
+ from='hamlet@denmark.lit/elsinore'
13
+ to='pubsub.shakespeare.lit'
14
+ id='create1'>
15
+ <pubsub xmlns='http://jabber.org/protocol/pubsub'>
16
+ <create node='princely_musings'/>
17
+ <configure/>
18
+ </pubsub>
19
+ </iq>
20
+ NODE
21
+ end
22
+
23
+ it 'ensures a create node is present on create' do
24
+ create = Blather::Stanza::PubSub::Create.new
25
+ create.find('//ns:pubsub/ns:create', :ns => Blather::Stanza::PubSub.registered_ns).wont_be_empty
26
+ end
27
+
28
+ it 'ensures a configure node is present on create' do
29
+ create = Blather::Stanza::PubSub::Create.new
30
+ create.find('//ns:pubsub/ns:configure', :ns => Blather::Stanza::PubSub.registered_ns).wont_be_empty
31
+ end
32
+
33
+ it 'ensures a create node exists when calling #create_node' do
34
+ create = Blather::Stanza::PubSub::Create.new
35
+ create.pubsub.remove_children :create
36
+ create.find('//ns:pubsub/ns:create', :ns => Blather::Stanza::PubSub.registered_ns).must_be_empty
37
+
38
+ create.create_node.wont_be_nil
39
+ create.find('//ns:pubsub/ns:create', :ns => Blather::Stanza::PubSub.registered_ns).wont_be_empty
40
+ end
41
+
42
+ it 'defaults to a set node' do
43
+ create = Blather::Stanza::PubSub::Create.new
44
+ create.type.must_equal :set
45
+ end
46
+
47
+ it 'sets the host if requested' do
48
+ create = Blather::Stanza::PubSub::Create.new :set, 'pubsub.jabber.local'
49
+ create.to.must_equal Blather::JID.new('pubsub.jabber.local')
50
+ end
51
+
52
+ it 'sets the node' do
53
+ create = Blather::Stanza::PubSub::Create.new :set, 'host', 'node-name'
54
+ create.node.must_equal 'node-name'
55
+ end
56
+ end
@@ -0,0 +1,84 @@
1
+ require File.join(File.dirname(__FILE__), *%w[.. .. .. spec_helper])
2
+ require File.join(File.dirname(__FILE__), *%w[.. .. .. fixtures pubsub])
3
+
4
+ describe Blather::Stanza::PubSub::Event do
5
+ it 'registers itself' do
6
+ Blather::XMPPNode.class_from_registration(:event, 'http://jabber.org/protocol/pubsub#event').must_equal Blather::Stanza::PubSub::Event
7
+ end
8
+
9
+ it 'is importable' do
10
+ Blather::XMPPNode.import(parse_stanza(event_notification_xml).root).must_be_instance_of Blather::Stanza::PubSub::Event
11
+ end
12
+
13
+ it 'ensures a query node is present on create' do
14
+ evt = Blather::Stanza::PubSub::Event.new
15
+ evt.find('ns:event', :ns => Blather::Stanza::PubSub::Event.registered_ns).wont_be_empty
16
+ end
17
+
18
+ it 'ensures an event node exists when calling #event_node' do
19
+ evt = Blather::Stanza::PubSub::Event.new
20
+ evt.remove_children :event
21
+ evt.find('*[local-name()="event"]').must_be_empty
22
+
23
+ evt.event_node.wont_be_nil
24
+ evt.find('ns:event', :ns => Blather::Stanza::PubSub::Event.registered_ns).wont_be_empty
25
+ end
26
+
27
+ it 'ensures an items node exists when calling #items_node' do
28
+ evt = Blather::Stanza::PubSub::Event.new
29
+ evt.remove_children :items
30
+ evt.find('*[local-name()="items"]').must_be_empty
31
+
32
+ evt.items_node.wont_be_nil
33
+ evt.find('ns:event/ns:items', :ns => Blather::Stanza::PubSub::Event.registered_ns).wont_be_empty
34
+ end
35
+
36
+ it 'knows the associated node name' do
37
+ evt = Blather::XMPPNode.import(parse_stanza(event_with_payload_xml).root)
38
+ evt.node.must_equal 'princely_musings'
39
+ end
40
+
41
+ it 'ensures newly inherited items are PubSubItem objects' do
42
+ evt = Blather::XMPPNode.import(parse_stanza(event_with_payload_xml).root)
43
+ evt.items?.must_equal true
44
+ evt.retractions?.must_equal false
45
+ evt.items.map { |i| i.class }.uniq.must_equal [Blather::Stanza::PubSub::PubSubItem]
46
+ end
47
+
48
+ it 'will iterate over each item' do
49
+ evt = Blather::XMPPNode.import(parse_stanza(event_with_payload_xml).root)
50
+ evt.items.each { |i| i.class.must_equal Blather::Stanza::PubSub::PubSubItem }
51
+ end
52
+
53
+ it 'handles receiving subscription ids' do
54
+ evt = Blather::XMPPNode.import(parse_stanza(event_subids_xml).root)
55
+ evt.subscription_ids.must_equal ['123-abc', '004-yyy']
56
+ end
57
+
58
+ it 'can have a list of retractions' do
59
+ evt = Blather::XMPPNode.import(parse_stanza(<<-NODE).root)
60
+ <message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'>
61
+ <event xmlns='http://jabber.org/protocol/pubsub#event'>
62
+ <items node='princely_musings'>
63
+ <retract id='ae890ac52d0df67ed7cfdf51b644e901'/>
64
+ </items>
65
+ </event>
66
+ </message>
67
+ NODE
68
+ evt.retractions?.must_equal true
69
+ evt.items?.must_equal false
70
+ evt.retractions.must_equal %w[ae890ac52d0df67ed7cfdf51b644e901]
71
+ end
72
+
73
+ it 'can be a purge' do
74
+ evt = Blather::XMPPNode.import(parse_stanza(<<-NODE).root)
75
+ <message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'>
76
+ <event xmlns='http://jabber.org/protocol/pubsub#event'>
77
+ <purge node='princely_musings'/>
78
+ </event>
79
+ </message>
80
+ NODE
81
+ evt.purge?.wont_be_nil
82
+ evt.node.must_equal 'princely_musings'
83
+ end
84
+ end