shingara-blather 0.4.9 → 0.4.14
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +15 -1
- data/lib/blather.rb +5 -0
- data/lib/blather/core_ext/nokogiri.rb +2 -0
- data/lib/blather/roster.rb +3 -3
- data/lib/blather/roster_item.rb +14 -3
- data/lib/blather/stanza/disco/disco_info.rb +20 -2
- data/lib/blather/stanza/disco/disco_items.rb +10 -1
- data/lib/blather/stanza/iq/command.rb +324 -0
- data/lib/blather/stanza/iq/vcard.rb +147 -0
- data/lib/blather/stanza/message.rb +49 -5
- data/lib/blather/stanza/presence/status.rb +11 -3
- data/lib/blather/stanza/pubsub.rb +9 -21
- data/lib/blather/stanza/x.rb +398 -0
- data/lib/blather/stream.rb +3 -2
- data/lib/blather/stream/parser.rb +6 -5
- data/lib/blather/xmpp_node.rb +1 -1
- data/spec/blather/roster_item_spec.rb +39 -1
- data/spec/blather/stanza/discos/disco_info_spec.rb +23 -0
- data/spec/blather/stanza/discos/disco_items_spec.rb +11 -0
- data/spec/blather/stanza/iq/command_spec.rb +206 -0
- data/spec/blather/stanza/iq/vcard_query_spec.rb +96 -0
- data/spec/blather/stanza/message_spec.rb +89 -14
- data/spec/blather/stanza/pubsub/retract_spec.rb +1 -1
- data/spec/blather/stanza/pubsub_spec.rb +0 -5
- data/spec/blather/stanza/x_spec.rb +235 -0
- data/spec/blather/stream/client_spec.rb +14 -1
- data/spec/blather/stream/parser_spec.rb +6 -0
- data/spec/blather/xmpp_node_spec.rb +4 -3
- data/spec/spec_helper.rb +28 -0
- metadata +35 -5
@@ -1,21 +1,28 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), *%w[.. .. spec_helper])
|
2
2
|
|
3
|
+
def message_xml
|
4
|
+
<<-XML
|
5
|
+
<message
|
6
|
+
to='romeo@example.net'
|
7
|
+
from='juliet@example.com/balcony'
|
8
|
+
type='chat'
|
9
|
+
xml:lang='en'>
|
10
|
+
<body>Wherefore art thou, Romeo?</body>
|
11
|
+
<x xmlns='jabber:x:data' type='form'>
|
12
|
+
<field var='field-name' type='text-single' label='description' />
|
13
|
+
</x>
|
14
|
+
<paused xmlns="http://jabber.org/protocol/chatstates"/>
|
15
|
+
</message>
|
16
|
+
XML
|
17
|
+
end
|
18
|
+
|
3
19
|
describe Blather::Stanza::Message do
|
4
20
|
it 'registers itself' do
|
5
21
|
Blather::XMPPNode.class_from_registration(:message, nil).must_equal Blather::Stanza::Message
|
6
22
|
end
|
7
23
|
|
8
24
|
it 'must be importable' do
|
9
|
-
|
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
|
25
|
+
Blather::XMPPNode.import(parse_stanza(message_xml).root).must_be_instance_of Blather::Stanza::Message
|
19
26
|
end
|
20
27
|
|
21
28
|
it 'provides "attr_accessor" for body' do
|
@@ -103,8 +110,9 @@ describe Blather::Stanza::Message do
|
|
103
110
|
msg = Blather::Stanza::Message.new
|
104
111
|
msg << (h = Blather::XMPPNode.new('html', msg.document))
|
105
112
|
h.namespace = Blather::Stanza::Message::HTML_NS
|
106
|
-
|
113
|
+
b = Blather::XMPPNode.new('body', msg.document)
|
107
114
|
b.namespace = Blather::Stanza::Message::HTML_BODY_NS
|
115
|
+
h << b
|
108
116
|
|
109
117
|
msg.xhtml_node.must_equal(b)
|
110
118
|
end
|
@@ -113,14 +121,21 @@ describe Blather::Stanza::Message do
|
|
113
121
|
msg = Blather::Stanza::Message.new
|
114
122
|
xhtml = "<some>xhtml</some>"
|
115
123
|
msg.xhtml = xhtml
|
116
|
-
msg.xhtml_node.
|
124
|
+
msg.xhtml_node.inner_html.strip.must_equal(xhtml)
|
117
125
|
end
|
118
126
|
|
119
127
|
it 'sets valid xhtml even if the input is not valid' do
|
120
128
|
msg = Blather::Stanza::Message.new
|
121
129
|
xhtml = "<some>xhtml"
|
122
130
|
msg.xhtml = xhtml
|
123
|
-
msg.xhtml_node.
|
131
|
+
msg.xhtml_node.inner_html.strip.must_equal("<some>xhtml</some>")
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'sets xhtml with more than one root node' do
|
135
|
+
msg = Blather::Stanza::Message.new
|
136
|
+
xhtml = "<i>xhtml</i> more xhtml"
|
137
|
+
msg.xhtml = xhtml
|
138
|
+
msg.xhtml_node.inner_html.strip.must_equal("<i>xhtml</i> more xhtml")
|
124
139
|
end
|
125
140
|
|
126
141
|
it 'has an xhtml getter' do
|
@@ -129,4 +144,64 @@ describe Blather::Stanza::Message do
|
|
129
144
|
msg.xhtml = xhtml
|
130
145
|
msg.xhtml.must_equal(xhtml)
|
131
146
|
end
|
132
|
-
|
147
|
+
|
148
|
+
it 'has a chat state setter' do
|
149
|
+
msg = Blather::Stanza::Message.new
|
150
|
+
msg.chat_state = :composing
|
151
|
+
msg.xpath('ns:composing', :ns => Blather::Stanza::Message::CHAT_STATE_NS).wont_be_empty
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'will only add one chat state at a time' do
|
155
|
+
msg = Blather::Stanza::Message.new
|
156
|
+
msg.chat_state = :composing
|
157
|
+
msg.chat_state = :paused
|
158
|
+
|
159
|
+
msg.xpath('ns:*', :ns => Blather::Stanza::Message::CHAT_STATE_NS).size.must_equal(1)
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'ensures chat state setter accepts strings' do
|
163
|
+
msg = Blather::Stanza::Message.new
|
164
|
+
msg.chat_state = "gone"
|
165
|
+
msg.xpath('ns:gone', :ns => Blather::Stanza::Message::CHAT_STATE_NS).wont_be_empty
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'ensures chat state is one of Blather::Stanza::Message::VALID_CHAT_STATES' do
|
169
|
+
lambda do
|
170
|
+
msg = Blather::Stanza::Message.new
|
171
|
+
msg.chat_state = :invalid_chat_state
|
172
|
+
end.must_raise(Blather::ArgumentError)
|
173
|
+
|
174
|
+
Blather::Stanza::Message::VALID_CHAT_STATES.each do |valid_chat_state|
|
175
|
+
msg = Blather::Stanza::Message.new
|
176
|
+
msg.chat_state = valid_chat_state
|
177
|
+
msg.chat_state.must_equal valid_chat_state
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
it 'has a chat state getter' do
|
182
|
+
msg = Blather::Stanza::Message.new
|
183
|
+
msg.chat_state = :paused
|
184
|
+
msg.chat_state.must_equal(:paused)
|
185
|
+
end
|
186
|
+
|
187
|
+
it 'imports correct chat state' do
|
188
|
+
Blather::XMPPNode.import(parse_stanza(message_xml).root).chat_state.must_equal :paused
|
189
|
+
end
|
190
|
+
|
191
|
+
it 'makes a form child available' do
|
192
|
+
n = Blather::XMPPNode.import(parse_stanza(message_xml).root)
|
193
|
+
n.form.fields.size.must_equal 1
|
194
|
+
n.form.fields.map { |f| f.class }.uniq.must_equal [Blather::Stanza::X::Field]
|
195
|
+
n.form.must_be_instance_of Blather::Stanza::X
|
196
|
+
|
197
|
+
r = Blather::Stanza::Message.new
|
198
|
+
r.form.type = :form
|
199
|
+
r.form.type.must_equal :form
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'ensures the form child is a direct child' do
|
203
|
+
r = Blather::Stanza::Message.new
|
204
|
+
r.form
|
205
|
+
r.xpath('ns:x', :ns => Blather::Stanza::X.registered_ns).wont_be_empty
|
206
|
+
end
|
207
|
+
end
|
@@ -69,7 +69,7 @@ describe Blather::Stanza::PubSub::Retract do
|
|
69
69
|
|
70
70
|
it 'will iterate over each retraction' do
|
71
71
|
Blather::XMPPNode.import(parse_stanza(retract_xml).root).each do |i|
|
72
|
-
i.must_include
|
72
|
+
i.must_include "ae890ac52d0df67ed7cfdf51b644e901"
|
73
73
|
end
|
74
74
|
end
|
75
75
|
end
|
@@ -59,9 +59,4 @@ describe Blather::Stanza::PubSub::PubSubItem do
|
|
59
59
|
item.payload = nil
|
60
60
|
item.payload.must_be_nil
|
61
61
|
end
|
62
|
-
|
63
|
-
it 'must have an entry child to item' do
|
64
|
-
item = Blather::Stanza::PubSub::Items::PubSubItem.new 'foo', 'payload'
|
65
|
-
item.find_first('ns:entry', :ns => 'http://www.w3.org/2005/Atom').wont_be_nil
|
66
|
-
end
|
67
62
|
end
|
@@ -0,0 +1,235 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), *%w[.. .. spec_helper])
|
2
|
+
|
3
|
+
def x_xml
|
4
|
+
<<-XML
|
5
|
+
<x xmlns='jabber:x:data'
|
6
|
+
type='form'>
|
7
|
+
<title/>
|
8
|
+
<instructions/>
|
9
|
+
<field var='field-name'
|
10
|
+
type='text-single'
|
11
|
+
label='description' />
|
12
|
+
<field var='field-name2'
|
13
|
+
type='text-single'
|
14
|
+
label='description' />
|
15
|
+
<field var='field-name3'
|
16
|
+
type='text-single'
|
17
|
+
label='description' />
|
18
|
+
<field var='field-name4'
|
19
|
+
type='list-multi'
|
20
|
+
label='description'>
|
21
|
+
<desc/>
|
22
|
+
<required/>
|
23
|
+
<value>field-value4</value>
|
24
|
+
<option label='option-label'><value>option-value</value></option>
|
25
|
+
<option label='option-label'><value>option-value</value></option>
|
26
|
+
</field>
|
27
|
+
</x>
|
28
|
+
XML
|
29
|
+
end
|
30
|
+
|
31
|
+
describe Blather::Stanza::X do
|
32
|
+
|
33
|
+
it 'can be created from an XML string' do
|
34
|
+
x = Blather::Stanza::X.new parse_stanza(x_xml).root
|
35
|
+
x.type.must_equal :form
|
36
|
+
x.must_be_instance_of Blather::Stanza::X
|
37
|
+
end
|
38
|
+
|
39
|
+
[:cancel, :form, :result, :submit].each do |type|
|
40
|
+
it "type can be set as \"#{type}\"" do
|
41
|
+
x = Blather::Stanza::X.new type
|
42
|
+
x.type.must_equal type
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'is constructed properly' do
|
47
|
+
n = Blather::Stanza::X.new :form
|
48
|
+
n.find("/ns:x[@type='form']", :ns => Blather::Stanza::X.registered_ns).wont_be_empty
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'has an action attribute' do
|
52
|
+
n = Blather::Stanza::X.new :form
|
53
|
+
n.type.must_equal :form
|
54
|
+
n.type = :submit
|
55
|
+
n.type.must_equal :submit
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'has a title attribute' do
|
59
|
+
n = Blather::Stanza::X.new :form
|
60
|
+
n.title.must_equal nil
|
61
|
+
n.title = "Hello World!"
|
62
|
+
n.title.must_equal "Hello World!"
|
63
|
+
n.title = "goodbye"
|
64
|
+
n.title.must_equal "goodbye"
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'has an instructions attribute' do
|
68
|
+
n = Blather::Stanza::X.new :form
|
69
|
+
n.instructions.must_equal nil
|
70
|
+
n.instructions = "Please fill in this form"
|
71
|
+
n.instructions.must_equal "Please fill in this form"
|
72
|
+
n.instructions = "goodbye"
|
73
|
+
n.instructions.must_equal "goodbye"
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'inherits a list of fields' do
|
77
|
+
n = Blather::Stanza::Iq::Command.new
|
78
|
+
n.command << parse_stanza(x_xml).root
|
79
|
+
r = Blather::Stanza::X.new.inherit n.form
|
80
|
+
r.fields.size.must_equal 4
|
81
|
+
r.fields.map { |f| f.class }.uniq.must_equal [Blather::Stanza::X::Field]
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'returns a field object for a particular var' do
|
85
|
+
x = Blather::Stanza::X.new parse_stanza(x_xml).root
|
86
|
+
f = x.field 'field-name4'
|
87
|
+
f.must_be_instance_of Blather::Stanza::X::Field
|
88
|
+
f.value.must_equal 'field-value4'
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'takes a list of hashes for fields' do
|
92
|
+
fields = [
|
93
|
+
{:label => 'label', :type => 'text-single', :var => 'var'},
|
94
|
+
{:label => 'label1', :type => 'text-single', :var => 'var1'},
|
95
|
+
]
|
96
|
+
|
97
|
+
control = [ Blather::Stanza::X::Field.new(*%w[var text-single label]),
|
98
|
+
Blather::Stanza::X::Field.new(*%w[var1 text-single label1])]
|
99
|
+
|
100
|
+
di = Blather::Stanza::X.new nil, fields
|
101
|
+
di.fields.size.must_equal 2
|
102
|
+
di.fields.each { |f| control.include?(f).must_equal true }
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'takes a list of Field objects as fields' do
|
106
|
+
control = [ Blather::Stanza::X::Field.new(*%w[var text-single label1]),
|
107
|
+
Blather::Stanza::X::Field.new(*%w[var1 text-single label1])]
|
108
|
+
|
109
|
+
di = Blather::Stanza::X.new nil, control
|
110
|
+
di.fields.size.must_equal 2
|
111
|
+
di.fields.each { |f| control.include?(f).must_equal true }
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'takes a mix of hashes and field objects as fields' do
|
115
|
+
fields = [
|
116
|
+
{:label => 'label', :type => 'text-single', :var => 'var'},
|
117
|
+
Blather::Stanza::X::Field.new(*%w[var1 text-single label1]),
|
118
|
+
]
|
119
|
+
|
120
|
+
control = [ Blather::Stanza::X::Field.new(*%w[var text-single label]),
|
121
|
+
Blather::Stanza::X::Field.new(*%w[var1 text-single label1])]
|
122
|
+
|
123
|
+
di = Blather::Stanza::X.new nil, fields
|
124
|
+
di.fields.size.must_equal 2
|
125
|
+
di.fields.each { |f| control.include?(f).must_equal true }
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'allows adding of fields' do
|
129
|
+
di = Blather::Stanza::X.new nil
|
130
|
+
di.fields.size.must_equal 0
|
131
|
+
di.fields = [{:label => 'label', :type => 'text-single', :var => 'var', :required => true}]
|
132
|
+
di.fields.size.must_equal 1
|
133
|
+
di.fields += [Blather::Stanza::X::Field.new(*%w[var1 text-single label1])]
|
134
|
+
di.fields.size.must_equal 2
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
describe Blather::Stanza::X::Field do
|
140
|
+
it 'will auto-inherit nodes' do
|
141
|
+
n = parse_stanza "<field type='text-single' var='music' label='Music from the time of Shakespeare' />"
|
142
|
+
i = Blather::Stanza::X::Field.new n.root
|
143
|
+
i.type.must_equal 'text-single'
|
144
|
+
i.var.must_equal 'music'
|
145
|
+
i.label.must_equal 'Music from the time of Shakespeare'
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'has a type attribute' do
|
149
|
+
n = Blather::Stanza::X::Field.new 'var', 'text-single'
|
150
|
+
n.type.must_equal 'text-single'
|
151
|
+
n.type = 'hidden'
|
152
|
+
n.type.must_equal 'hidden'
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'has a var attribute' do
|
156
|
+
n = Blather::Stanza::X::Field.new 'name', 'text-single'
|
157
|
+
n.var.must_equal 'name'
|
158
|
+
n.var = 'email'
|
159
|
+
n.var.must_equal 'email'
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'has a label attribute' do
|
163
|
+
n = Blather::Stanza::X::Field.new 'subject', 'text-single', 'Music from the time of Shakespeare'
|
164
|
+
n.label.must_equal 'Music from the time of Shakespeare'
|
165
|
+
n.label = 'Books by and about Shakespeare'
|
166
|
+
n.label.must_equal 'Books by and about Shakespeare'
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'has a desc attribute' do
|
170
|
+
n = Blather::Stanza::X::Field.new 'subject', 'text-single', 'Music from the time of Shakespeare'
|
171
|
+
n.desc.must_equal nil
|
172
|
+
n.desc = 'Books by and about Shakespeare'
|
173
|
+
n.desc.must_equal 'Books by and about Shakespeare'
|
174
|
+
n.desc = 'goodbye'
|
175
|
+
n.desc.must_equal 'goodbye'
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'has a required? attribute' do
|
179
|
+
n = Blather::Stanza::X::Field.new 'subject', 'text-single', 'Music from the time of Shakespeare'
|
180
|
+
n.required?.must_equal false
|
181
|
+
n.required = true
|
182
|
+
n.required?.must_equal true
|
183
|
+
n.required = false
|
184
|
+
n.required?.must_equal false
|
185
|
+
end
|
186
|
+
|
187
|
+
it 'has a value attribute' do
|
188
|
+
n = Blather::Stanza::X::Field.new 'subject', 'text-single', 'Music from the time of Shakespeare'
|
189
|
+
n.value.must_equal nil
|
190
|
+
n.value = 'book1'
|
191
|
+
n.value.must_equal 'book1'
|
192
|
+
n.value = 'book2'
|
193
|
+
n.value.must_equal 'book2'
|
194
|
+
end
|
195
|
+
|
196
|
+
# Option child elements
|
197
|
+
it 'allows adding of options' do
|
198
|
+
di = Blather::Stanza::X::Field.new nil
|
199
|
+
di.options.size.must_equal 0
|
200
|
+
di.options += [{:label => 'Person', :value => 'person'}]
|
201
|
+
di.options.size.must_equal 1
|
202
|
+
di.options += [Blather::Stanza::X::Field::Option.new(*%w[person1 Person1])]
|
203
|
+
di.options.size.must_equal 2
|
204
|
+
end
|
205
|
+
|
206
|
+
it 'raises an error when compared against a non X::Field' do
|
207
|
+
a = Blather::Stanza::X::Field.new('secret_message', 'hidden')
|
208
|
+
lambda { a == 'test' }.must_raise RuntimeError
|
209
|
+
end
|
210
|
+
|
211
|
+
it 'can determine equality' do
|
212
|
+
a = Blather::Stanza::X::Field.new('subject', 'text-single')
|
213
|
+
a.must_equal Blather::Stanza::X::Field.new('subject', 'text-single')
|
214
|
+
a.wont_equal Blather::Stanza::X::Field.new('subject1', 'text-single')
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
describe Blather::Stanza::X::Field::Option do
|
219
|
+
|
220
|
+
it 'has a value attribute' do
|
221
|
+
n = Blather::Stanza::X::Field::Option.new 'person1', 'Person 1'
|
222
|
+
n.value.must_equal 'person1'
|
223
|
+
n.value = 'book1'
|
224
|
+
n.value.must_equal 'book1'
|
225
|
+
end
|
226
|
+
|
227
|
+
it 'has a label attribute' do
|
228
|
+
n = Blather::Stanza::X::Field::Option.new 'person1', 'Person 1'
|
229
|
+
n.label.must_equal 'Person 1'
|
230
|
+
n.label = 'Book 1'
|
231
|
+
n.label.must_equal 'Book 1'
|
232
|
+
n.label = 'Book 2'
|
233
|
+
n.label.must_equal 'Book 2'
|
234
|
+
end
|
235
|
+
end
|
@@ -45,7 +45,7 @@ describe Blather::Stream::Client do
|
|
45
45
|
|
46
46
|
it 'attempts to find the SRV record if a host is not provided' do
|
47
47
|
dns = mock(:sort! => nil, :empty? => false)
|
48
|
-
dns.expects(:
|
48
|
+
dns.expects(:detect).yields(mock({
|
49
49
|
:target => 'd',
|
50
50
|
:port => 5222
|
51
51
|
}))
|
@@ -1008,4 +1008,17 @@ describe Blather::Stream::Client do
|
|
1008
1008
|
comp.expects(:send_data).with { |s| s.wont_match(/^<message[^>]*from=/); true }
|
1009
1009
|
comp.send msg
|
1010
1010
|
end
|
1011
|
+
|
1012
|
+
it 'sends xml without formatting' do
|
1013
|
+
client = mock()
|
1014
|
+
client.stubs(:jid)
|
1015
|
+
client.stubs(:jid=)
|
1016
|
+
|
1017
|
+
msg = Blather::Stanza::Message.new 'to@jid.com', 'body'
|
1018
|
+
msg.xhtml = '<i>xhtml</i> body'
|
1019
|
+
|
1020
|
+
comp = Blather::Stream::Client.new nil, client, 'node@jid.com/resource', 'pass'
|
1021
|
+
comp.expects(:send_data).with { |s| s.wont_match(/\n/); true }
|
1022
|
+
comp.send msg
|
1023
|
+
end
|
1011
1024
|
end
|
@@ -89,6 +89,12 @@ describe Blather::Stream::Parser do
|
|
89
89
|
@client.data[0].xpath('//*[namespace-uri()="urn:ietf:params:xml:ns:xmpp-stanzas"]').size.must_equal 2
|
90
90
|
end
|
91
91
|
|
92
|
+
it 'handles not absolute namespaces' do
|
93
|
+
assert_nothing_raised do
|
94
|
+
@parser.receive_data '<iq type="result" id="blather0007" to="n@d/r"><vCard xmlns="vcard-temp"/></iq>'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
92
98
|
it 'responds with stream:stream as a separate response' do
|
93
99
|
data = [
|
94
100
|
'<stream:stream xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" to="example.com" version="1.0">',
|
@@ -135,10 +135,11 @@ describe Blather::XMPPNode do
|
|
135
135
|
c.namespace = 'foo:bar'
|
136
136
|
n << c
|
137
137
|
|
138
|
-
n.find(:bar).size.must_equal 2
|
139
|
-
n.remove_child 'bar', 'foo:bar'
|
140
138
|
n.find(:bar).size.must_equal 1
|
141
|
-
n.find(:bar).
|
139
|
+
n.find('//xmlns:bar', :xmlns => 'foo:bar').size.must_equal 1
|
140
|
+
n.remove_child '//xmlns:bar', :xmlns => 'foo:bar'
|
141
|
+
n.find(:bar).size.must_equal 1
|
142
|
+
n.find('//xmlns:bar', :xmlns => 'foo:bar').size.must_equal 0
|
142
143
|
end
|
143
144
|
|
144
145
|
it 'will remove all child elements' do
|