vines 0.2.1 → 0.3.0

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 (96) hide show
  1. data/README +1 -1
  2. data/Rakefile +10 -10
  3. data/conf/certs/ca-bundle.crt +112 -378
  4. data/conf/config.rb +18 -9
  5. data/lib/vines.rb +8 -1
  6. data/lib/vines/command/cert.rb +2 -1
  7. data/lib/vines/command/init.rb +11 -0
  8. data/lib/vines/command/ldap.rb +6 -3
  9. data/lib/vines/command/schema.rb +1 -1
  10. data/lib/vines/config.rb +57 -146
  11. data/lib/vines/config/host.rb +85 -0
  12. data/lib/vines/config/port.rb +111 -0
  13. data/lib/vines/contact.rb +1 -1
  14. data/lib/vines/jid.rb +26 -4
  15. data/lib/vines/kit.rb +6 -0
  16. data/lib/vines/log.rb +24 -0
  17. data/lib/vines/router.rb +70 -38
  18. data/lib/vines/stanza.rb +45 -8
  19. data/lib/vines/stanza/iq.rb +3 -3
  20. data/lib/vines/stanza/iq/disco_info.rb +5 -1
  21. data/lib/vines/stanza/iq/disco_items.rb +3 -0
  22. data/lib/vines/stanza/iq/private_storage.rb +9 -5
  23. data/lib/vines/stanza/iq/roster.rb +11 -12
  24. data/lib/vines/stanza/iq/vcard.rb +4 -4
  25. data/lib/vines/stanza/iq/version.rb +25 -0
  26. data/lib/vines/stanza/message.rb +4 -5
  27. data/lib/vines/stanza/presence.rb +20 -18
  28. data/lib/vines/stanza/presence/probe.rb +3 -4
  29. data/lib/vines/stanza/presence/subscribe.rb +4 -3
  30. data/lib/vines/stanza/presence/subscribed.rb +6 -5
  31. data/lib/vines/stanza/presence/unsubscribe.rb +4 -4
  32. data/lib/vines/stanza/presence/unsubscribed.rb +4 -3
  33. data/lib/vines/storage/couchdb.rb +3 -3
  34. data/lib/vines/storage/ldap.rb +19 -8
  35. data/lib/vines/storage/local.rb +23 -12
  36. data/lib/vines/storage/redis.rb +3 -3
  37. data/lib/vines/storage/sql.rb +5 -5
  38. data/lib/vines/stream.rb +40 -6
  39. data/lib/vines/stream/client.rb +5 -6
  40. data/lib/vines/stream/client/auth.rb +3 -2
  41. data/lib/vines/stream/client/bind.rb +2 -2
  42. data/lib/vines/stream/client/bind_restart.rb +1 -2
  43. data/lib/vines/stream/client/ready.rb +2 -0
  44. data/lib/vines/stream/client/session.rb +13 -4
  45. data/lib/vines/stream/client/tls.rb +1 -0
  46. data/lib/vines/stream/component.rb +6 -5
  47. data/lib/vines/stream/component/ready.rb +5 -6
  48. data/lib/vines/stream/http.rb +10 -4
  49. data/lib/vines/stream/http/request.rb +23 -2
  50. data/lib/vines/stream/server.rb +13 -11
  51. data/lib/vines/stream/server/outbound/auth_result.rb +1 -0
  52. data/lib/vines/stream/server/outbound/tls_result.rb +1 -0
  53. data/lib/vines/stream/server/ready.rb +2 -2
  54. data/lib/vines/user.rb +2 -1
  55. data/lib/vines/version.rb +1 -1
  56. data/test/config/host_test.rb +292 -0
  57. data/test/config_test.rb +244 -103
  58. data/test/contact_test.rb +7 -1
  59. data/test/jid_test.rb +48 -0
  60. data/test/router_test.rb +16 -47
  61. data/test/stanza/iq/disco_info_test.rb +76 -0
  62. data/test/stanza/iq/disco_items_test.rb +47 -0
  63. data/test/stanza/iq/private_storage_test.rb +33 -10
  64. data/test/stanza/iq/roster_test.rb +15 -5
  65. data/test/stanza/iq/vcard_test.rb +8 -25
  66. data/test/stanza/iq/version_test.rb +62 -0
  67. data/test/stanza/iq_test.rb +13 -10
  68. data/test/stanza/message_test.rb +16 -24
  69. data/test/stanza/presence/probe_test.rb +52 -0
  70. data/test/stanza/presence/subscribe_test.rb +1 -5
  71. data/test/stanza_test.rb +77 -0
  72. data/test/stream/client/auth_test.rb +1 -0
  73. data/test/stream/client/ready_test.rb +2 -0
  74. data/test/stream/client/session_test.rb +7 -2
  75. data/test/stream/component/ready_test.rb +19 -36
  76. data/test/stream/http/request_test.rb +22 -2
  77. data/test/stream/server/ready_test.rb +14 -21
  78. data/web/404.html +9 -3
  79. data/web/chat/index.html +2 -2
  80. data/web/chat/javascripts/app.js +1 -1
  81. data/web/chat/stylesheets/chat.css +4 -9
  82. data/web/lib/coffeescripts/layout.coffee +2 -2
  83. data/web/{chat → lib}/coffeescripts/logout.coffee +0 -0
  84. data/web/lib/coffeescripts/notification.coffee +14 -0
  85. data/web/lib/coffeescripts/session.coffee +28 -24
  86. data/web/lib/coffeescripts/transfer.coffee +37 -34
  87. data/web/lib/javascripts/base.js +8 -8
  88. data/web/lib/javascripts/icons.js +3 -0
  89. data/web/lib/javascripts/jquery.js +4 -18
  90. data/web/lib/javascripts/layout.js +2 -2
  91. data/web/{chat → lib}/javascripts/logout.js +0 -0
  92. data/web/lib/javascripts/notification.js +26 -0
  93. data/web/lib/javascripts/session.js +20 -16
  94. data/web/lib/javascripts/transfer.js +45 -55
  95. data/web/lib/stylesheets/base.css +45 -9
  96. metadata +31 -15
@@ -48,6 +48,20 @@ class RosterTest < MiniTest::Unit::TestCase
48
48
  assert @stream.verify
49
49
  end
50
50
 
51
+ def test_roster_get_with_invalid_to_address
52
+ alice = Vines::User.new(:jid => 'alice@wonderland.lit/tea')
53
+ @stream.expect(:user, alice)
54
+
55
+ node = node(%q{
56
+ <iq id="42" type="get" to="romeo@verona.lit">
57
+ <query xmlns="jabber:iq:roster"/>
58
+ </iq>}.strip.gsub(/\n|\s{2,}/, ''))
59
+
60
+ stanza = Vines::Stanza::Iq::Roster.new(node, @stream)
61
+ assert_raises(Vines::StanzaErrors::Forbidden) { stanza.process }
62
+ assert @stream.verify
63
+ end
64
+
51
65
  def test_roster_set_with_invalid_to_address
52
66
  alice = Vines::User.new(:jid => 'alice@wonderland.lit/tea')
53
67
  @stream.expect(:user, alice)
@@ -150,12 +164,9 @@ class RosterTest < MiniTest::Unit::TestCase
150
164
  @nodes << node
151
165
  end
152
166
 
153
- router = MiniTest::Mock.new
154
- router.expect(:interested_resources, [recipient], [alice.jid])
155
-
156
167
  @stream.expect(:user, alice)
168
+ @stream.expect(:interested_resources, [recipient], [alice.jid])
157
169
  @stream.expect(:update_user_streams, nil, [alice])
158
- @stream.expect(:router, router)
159
170
  @stream.expect(:domain, 'wonderland.lit')
160
171
  @stream.expect(:storage, storage, ['wonderland.lit'])
161
172
  expected = node(%q{<iq id="42" type="result"/>})
@@ -174,7 +185,6 @@ class RosterTest < MiniTest::Unit::TestCase
174
185
  stanza.process
175
186
  assert @stream.verify
176
187
  assert storage.verify
177
- assert router.verify
178
188
 
179
189
  expected = node(%q{
180
190
  <iq to="alice@wonderland.lit/tea" type="set">
@@ -7,6 +7,11 @@ require 'minitest/autorun'
7
7
  class VcardTest < MiniTest::Unit::TestCase
8
8
  def setup
9
9
  @stream = MiniTest::Mock.new
10
+ @config = Vines::Config.new do
11
+ host 'wonderland.lit' do
12
+ storage(:fs) { dir '.' }
13
+ end
14
+ end
10
15
  end
11
16
 
12
17
  def test_vcard_get_on_remote_jid_routes
@@ -14,9 +19,9 @@ class VcardTest < MiniTest::Unit::TestCase
14
19
  node = node(%q{<iq id="42" to="romeo@verona.lit" type="get"><vCard xmlns="vcard-temp"/></iq>})
15
20
 
16
21
  router = MiniTest::Mock.new
17
- router.expect(:local?, false, [node])
18
22
  router.expect(:route, nil, [node])
19
23
 
24
+ @stream.expect(:config, @config)
20
25
  @stream.expect(:user, alice)
21
26
  @stream.expect(:router, router)
22
27
 
@@ -30,16 +35,12 @@ class VcardTest < MiniTest::Unit::TestCase
30
35
  alice = Vines::User.new(:jid => 'alice@wonderland.lit/tea')
31
36
  node = node(%q{<iq id="42" type="get"><vCard xmlns="vcard-temp"/></iq>})
32
37
 
33
- router = MiniTest::Mock.new
34
- router.expect(:local?, true, [node])
35
-
36
38
  card = node(%q{<vCard xmlns="vcard-temp"><FN>Alice in Wonderland</FN></vCard>})
37
39
 
38
40
  storage = MiniTest::Mock.new
39
41
  storage.expect(:find_vcard, card, [alice.jid.bare])
40
42
 
41
43
  @stream.expect(:user, alice)
42
- @stream.expect(:router, router)
43
44
  @stream.expect(:domain, 'wonderland.lit')
44
45
  @stream.expect(:storage, storage, ['wonderland.lit'])
45
46
  expected = node(%q{
@@ -53,7 +54,6 @@ class VcardTest < MiniTest::Unit::TestCase
53
54
  stanza = Vines::Stanza::Iq::Vcard.new(node, @stream)
54
55
  stanza.process
55
56
  assert @stream.verify
56
- assert router.verify
57
57
  assert storage.verify
58
58
  end
59
59
 
@@ -61,16 +61,13 @@ class VcardTest < MiniTest::Unit::TestCase
61
61
  alice = Vines::User.new(:jid => 'alice@wonderland.lit/tea')
62
62
  node = node(%q{<iq id="42" to="hatter@wonderland.lit" type="get"><vCard xmlns="vcard-temp"/></iq>})
63
63
 
64
- router = MiniTest::Mock.new
65
- router.expect(:local?, true, [node])
66
-
67
64
  card = node(%q{<vCard xmlns="vcard-temp"><FN>Mad Hatter</FN></vCard>})
68
65
 
69
66
  storage = MiniTest::Mock.new
70
67
  storage.expect(:find_vcard, card, [Vines::JID.new('hatter@wonderland.lit')])
71
68
 
69
+ @stream.expect(:config, @config)
72
70
  @stream.expect(:user, alice)
73
- @stream.expect(:router, router)
74
71
  @stream.expect(:domain, 'wonderland.lit')
75
72
  @stream.expect(:storage, storage, ['wonderland.lit'])
76
73
  expected = node(%q{
@@ -84,7 +81,6 @@ class VcardTest < MiniTest::Unit::TestCase
84
81
  stanza = Vines::Stanza::Iq::Vcard.new(node, @stream)
85
82
  stanza.process
86
83
  assert @stream.verify
87
- assert router.verify
88
84
  assert storage.verify
89
85
  end
90
86
 
@@ -92,21 +88,16 @@ class VcardTest < MiniTest::Unit::TestCase
92
88
  alice = Vines::User.new(:jid => 'alice@wonderland.lit/tea')
93
89
  node = node(%q{<iq id="42" type="get"><vCard xmlns="vcard-temp"/></iq>})
94
90
 
95
- router = MiniTest::Mock.new
96
- router.expect(:local?, true, [node])
97
-
98
91
  storage = MiniTest::Mock.new
99
92
  storage.expect(:find_vcard, nil, [alice.jid.bare])
100
93
 
101
94
  @stream.expect(:user, alice)
102
- @stream.expect(:router, router)
103
95
  @stream.expect(:domain, 'wonderland.lit')
104
96
  @stream.expect(:storage, storage, ['wonderland.lit'])
105
97
 
106
98
  stanza = Vines::Stanza::Iq::Vcard.new(node, @stream)
107
99
  assert_raises(Vines::StanzaErrors::ItemNotFound) { stanza.process }
108
100
  assert @stream.verify
109
- assert router.verify
110
101
  assert storage.verify
111
102
  end
112
103
 
@@ -114,11 +105,8 @@ class VcardTest < MiniTest::Unit::TestCase
114
105
  alice = Vines::User.new(:jid => 'alice@wonderland.lit/tea')
115
106
  node = node(%q{<iq id="42" to="hatter@wonderland.lit" type="set"><vCard xmlns="vcard-temp"><FN>Alice</FN></vCard></iq>})
116
107
 
117
- router = MiniTest::Mock.new
118
- router.expect(:local?, true, [node])
119
-
108
+ @stream.expect(:config, @config)
120
109
  @stream.expect(:user, alice)
121
- @stream.expect(:router, router)
122
110
 
123
111
  stanza = Vines::Stanza::Iq::Vcard.new(node, @stream)
124
112
  assert_raises(Vines::StanzaErrors::Forbidden) { stanza.process }
@@ -130,14 +118,10 @@ class VcardTest < MiniTest::Unit::TestCase
130
118
  node = node(%q{<iq id="42" type="set"><vCard xmlns="vcard-temp"><FN>Alice</FN></vCard></iq>})
131
119
  card = node(%q{<vCard xmlns="vcard-temp"><FN>Alice</FN></vCard>})
132
120
 
133
- router = MiniTest::Mock.new
134
- router.expect(:local?, true, [node])
135
-
136
121
  storage = MiniTest::Mock.new
137
122
  storage.expect(:save_vcard, nil, [alice.jid, card])
138
123
 
139
124
  @stream.expect(:user, alice)
140
- @stream.expect(:router, router)
141
125
  @stream.expect(:domain, 'wonderland.lit')
142
126
  @stream.expect(:storage, storage, ['wonderland.lit'])
143
127
  expected = node(%q{<iq id="42" to="alice@wonderland.lit/tea" type="result"/>})
@@ -146,7 +130,6 @@ class VcardTest < MiniTest::Unit::TestCase
146
130
  stanza = Vines::Stanza::Iq::Vcard.new(node, @stream)
147
131
  stanza.process
148
132
  assert @stream.verify
149
- assert router.verify
150
133
  assert storage.verify
151
134
  end
152
135
 
@@ -0,0 +1,62 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'vines'
4
+ require 'ext/nokogiri'
5
+ require 'minitest/autorun'
6
+
7
+ class VersionTest < MiniTest::Unit::TestCase
8
+ def setup
9
+ @stream = MiniTest::Mock.new
10
+ @config = Vines::Config.new do
11
+ host 'wonderland.lit' do
12
+ storage(:fs) { dir '.' }
13
+ end
14
+ end
15
+ end
16
+
17
+ def test_to_address_routes
18
+ alice = Vines::User.new(:jid => 'alice@wonderland.lit/tea')
19
+ node = node(%q{<iq id="42" to="romeo@verona.lit" type="get"><query xmlns="jabber:iq:version"/></iq>})
20
+
21
+ router = MiniTest::Mock.new
22
+ router.expect(:route, nil, [node])
23
+
24
+ @stream.expect(:domain, 'wonderland.lit')
25
+ @stream.expect(:config, @config)
26
+ @stream.expect(:user, alice)
27
+ @stream.expect(:router, router)
28
+
29
+ stanza = Vines::Stanza::Iq::Version.new(node, @stream)
30
+ stanza.process
31
+ assert @stream.verify
32
+ assert router.verify
33
+ end
34
+
35
+ def test_version_get_returns_result
36
+ alice = Vines::User.new(:jid => 'alice@wonderland.lit/tea')
37
+ node = node(%q{<iq id="42" type="get"><query xmlns="jabber:iq:version"/></iq>})
38
+
39
+ @stream.expect(:user, alice)
40
+ @stream.expect(:domain, 'wonderland.lit')
41
+
42
+ expected = node(%Q{
43
+ <iq from="wonderland.lit" id="42" to="alice@wonderland.lit/tea" type="result">
44
+ <query xmlns="jabber:iq:version">
45
+ <name>Vines</name>
46
+ <version>#{Vines::VERSION}</version>
47
+ </query>
48
+ </iq>}.strip.gsub(/\n|\s{2,}/, ''))
49
+
50
+ @stream.expect(:write, nil, [expected])
51
+
52
+ stanza = Vines::Stanza::Iq::Version.new(node, @stream)
53
+ stanza.process
54
+ assert @stream.verify
55
+ end
56
+
57
+ private
58
+
59
+ def node(xml)
60
+ Nokogiri::XML(xml).root
61
+ end
62
+ end
@@ -8,8 +8,13 @@ class IqTest < MiniTest::Unit::TestCase
8
8
  def setup
9
9
  @stream = MiniTest::Mock.new
10
10
  @stream.expect(:domain, 'wonderland.lit')
11
+ @config = Vines::Config.new do
12
+ host 'wonderland.lit' do
13
+ storage(:fs) { dir '.' }
14
+ end
15
+ end
11
16
  end
12
-
17
+
13
18
  def test_allow_other_iq_to_route
14
19
  alice = Vines::User.new(:jid => 'alice@wonderland.lit/tea')
15
20
  hatter = Vines::User.new(:jid => 'hatter@wonderland.lit/crumpets')
@@ -30,31 +35,29 @@ class IqTest < MiniTest::Unit::TestCase
30
35
  </x>
31
36
  </feature>
32
37
  </si>
33
- </iq>}.strip.gsub(/\n|\s{2,}/, ''))
38
+ </iq>
39
+ }.strip.gsub(/\n|\s{2,}/, ''))
34
40
 
35
41
  recipient = MiniTest::Mock.new
36
42
  recipient.expect(:write, nil, [node])
37
43
 
38
- router = MiniTest::Mock.new
39
- router.expect(:available_resources, [recipient], [alice.jid])
40
- router.expect(:local?, true, [node])
41
-
44
+ @stream.expect(:config, @config)
42
45
  @stream.expect(:user, hatter)
43
- @stream.expect(:router, router)
44
46
  @stream.expect(:domain, 'wonderland.lit')
47
+ @stream.expect(:available_resources, [recipient], [alice.jid.to_s])
45
48
 
46
49
  stanza = Vines::Stanza::Iq.new(node, @stream)
47
50
  stanza.process
48
51
  assert @stream.verify
49
52
  assert recipient.verify
50
53
  end
51
-
54
+
52
55
  def test_feature_not_implemented
53
- node = node('<iq type="set" id="42">')
56
+ node = node('<iq type="set" id="42"/>')
54
57
  stanza = Vines::Stanza::Iq.new(node, @stream)
55
58
  assert_raises(Vines::StanzaErrors::FeatureNotImplemented) { stanza.process }
56
59
  end
57
-
60
+
58
61
  private
59
62
 
60
63
  def node(xml)
@@ -7,6 +7,11 @@ require 'minitest/autorun'
7
7
  class MessageTest < MiniTest::Unit::TestCase
8
8
  def setup
9
9
  @stream = MiniTest::Mock.new
10
+ @config = Vines::Config.new do
11
+ host 'wonderland.lit' do
12
+ storage(:fs) { dir '.' }
13
+ end
14
+ end
10
15
  end
11
16
 
12
17
  def test_bad_type_returns_error
@@ -23,17 +28,12 @@ class MessageTest < MiniTest::Unit::TestCase
23
28
  recipient.expect(:user, alice)
24
29
  recipient.expect(:write, nil, [node])
25
30
 
26
- router = MiniTest::Mock.new
27
- router.expect(:local?, true, [node])
28
- router.expect(:connected_resources, [recipient], [alice.jid.bare])
29
-
30
- @stream.expect(:router, router)
31
31
  @stream.expect(:user, alice)
32
+ @stream.expect(:connected_resources, [recipient], [alice.jid.bare])
32
33
 
33
34
  stanza = Vines::Stanza::Message.new(node, @stream)
34
35
  stanza.process
35
36
  assert @stream.verify
36
- assert router.verify
37
37
  assert recipient.verify
38
38
  end
39
39
 
@@ -41,20 +41,16 @@ class MessageTest < MiniTest::Unit::TestCase
41
41
  bogus = Vines::JID.new('bogus@wonderland.lit/cake')
42
42
  node = node(%Q{<message to="#{bogus}">hello!</message>})
43
43
 
44
- router = MiniTest::Mock.new
45
- router.expect(:local?, true, [node])
46
- router.expect(:connected_resources, [], [bogus])
47
-
48
44
  storage = MiniTest::Mock.new
49
45
  storage.expect(:find_user, nil, [bogus])
50
46
 
51
- @stream.expect(:router, router)
47
+ @stream.expect(:config, @config)
52
48
  @stream.expect(:storage, storage, [bogus.domain])
49
+ @stream.expect(:connected_resources, [], [bogus])
53
50
 
54
51
  stanza = Vines::Stanza::Message.new(node, @stream)
55
52
  stanza.process
56
53
  assert @stream.verify
57
- assert router.verify
58
54
  assert storage.verify
59
55
  end
60
56
 
@@ -62,20 +58,16 @@ class MessageTest < MiniTest::Unit::TestCase
62
58
  hatter = Vines::User.new(:jid => 'hatter@wonderland.lit/cake')
63
59
  node = node(%Q{<message to="#{hatter.jid}">hello!</message>})
64
60
 
65
- router = MiniTest::Mock.new
66
- router.expect(:local?, true, [node])
67
- router.expect(:connected_resources, [], [hatter.jid])
68
-
69
61
  storage = MiniTest::Mock.new
70
62
  storage.expect(:find_user, hatter, [hatter.jid])
71
63
 
72
- @stream.expect(:router, router)
64
+ @stream.expect(:config, @config)
73
65
  @stream.expect(:storage, storage, [hatter.jid.domain])
66
+ @stream.expect(:connected_resources, [], [hatter.jid])
74
67
 
75
68
  stanza = Vines::Stanza::Message.new(node, @stream)
76
69
  assert_raises(Vines::StanzaErrors::ServiceUnavailable) { stanza.process }
77
70
  assert @stream.verify
78
- assert router.verify
79
71
  assert storage.verify
80
72
  end
81
73
 
@@ -89,17 +81,17 @@ class MessageTest < MiniTest::Unit::TestCase
89
81
  recipient.expect(:user, romeo)
90
82
  recipient.expect(:write, nil, [expected])
91
83
 
92
- router = MiniTest::Mock.new
93
- router.expect(:local?, true, [node])
94
- router.expect(:connected_resources, [recipient], [romeo.jid])
84
+ @config.host 'verona.lit' do
85
+ storage(:fs) { dir '.' }
86
+ end
95
87
 
96
- @stream.expect(:router, router)
88
+ @stream.expect(:config, @config)
97
89
  @stream.expect(:user, alice)
90
+ @stream.expect(:connected_resources, [recipient], [romeo.jid])
98
91
 
99
92
  stanza = Vines::Stanza::Message.new(node, @stream)
100
93
  stanza.process
101
94
  assert @stream.verify
102
- assert router.verify
103
95
  assert recipient.verify
104
96
  end
105
97
 
@@ -110,7 +102,7 @@ class MessageTest < MiniTest::Unit::TestCase
110
102
  expected = node(%Q{<message to="#{romeo.jid}" from="#{alice.jid}">hello!</message>})
111
103
 
112
104
  router = MiniTest::Mock.new
113
- router.expect(:local?, false, [node])
105
+ @stream.expect(:config, @config)
114
106
  router.expect(:route, nil, [expected])
115
107
 
116
108
  @stream.expect(:router, router)
@@ -0,0 +1,52 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'vines'
4
+ require 'ext/nokogiri'
5
+ require 'minitest/autorun'
6
+
7
+ class ProbeTest < MiniTest::Unit::TestCase
8
+ def setup
9
+ @alice = Vines::JID.new('alice@wonderland.lit/tea')
10
+ @stream = MiniTest::Mock.new
11
+ @config = Vines::Config.new do
12
+ host 'wonderland.lit' do
13
+ storage(:fs) { dir '.' }
14
+ end
15
+ end
16
+ end
17
+
18
+ def test_missing_to_address_raises
19
+ node = node(%q{<presence id="42" type="probe"/>})
20
+ stanza = Vines::Stanza::Presence::Probe.new(node, @stream)
21
+ def stanza.inbound?; false; end
22
+
23
+ @stream.expect(:user, Vines::User.new(jid: @alice))
24
+
25
+ assert_raises(Vines::StanzaErrors::BadRequest) { stanza.process }
26
+ assert @stream.verify
27
+ end
28
+
29
+ def test_to_remote_address_routes
30
+ node = node(%q{<presence id="42" to="romeo@verona.lit" type="probe"/>})
31
+ stanza = Vines::Stanza::Presence::Probe.new(node, @stream)
32
+ def stanza.inbound?; false; end
33
+
34
+ expected = node(%Q{<presence id="42" to="romeo@verona.lit" type="probe" from="#{@alice}"/>})
35
+ router = MiniTest::Mock.new
36
+ router.expect(:route, nil, [expected])
37
+
38
+ @stream.expect(:router, router)
39
+ @stream.expect(:user, Vines::User.new(jid: @alice))
40
+ @stream.expect(:config, @config)
41
+
42
+ stanza.process
43
+ assert @stream.verify
44
+ assert router.verify
45
+ end
46
+
47
+ private
48
+
49
+ def node(xml)
50
+ Nokogiri::XML(xml).root
51
+ end
52
+ end