vines 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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