vines 0.4.5 → 0.4.6

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 (89) hide show
  1. data/Gemfile +3 -0
  2. data/README.md +48 -0
  3. data/Rakefile +6 -58
  4. data/bin/vines +12 -2
  5. data/conf/certs/ca-bundle.crt +568 -39
  6. data/conf/config.rb +9 -42
  7. data/lib/vines.rb +1 -8
  8. data/lib/vines/command/cert.rb +4 -4
  9. data/lib/vines/command/init.rb +3 -3
  10. data/lib/vines/config.rb +9 -0
  11. data/lib/vines/kit.rb +2 -7
  12. data/lib/vines/storage/local.rb +50 -17
  13. data/lib/vines/store.rb +6 -4
  14. data/lib/vines/stream.rb +1 -1
  15. data/lib/vines/stream/http/session.rb +0 -0
  16. data/lib/vines/stream/http/sessions.rb +0 -0
  17. data/lib/vines/stream/parser.rb +3 -2
  18. data/lib/vines/token_bucket.rb +19 -10
  19. data/lib/vines/version.rb +1 -1
  20. data/test/cluster/publisher_test.rb +45 -33
  21. data/test/cluster/sessions_test.rb +32 -39
  22. data/test/cluster/subscriber_test.rb +93 -78
  23. data/test/config/host_test.rb +2 -4
  24. data/test/config/pubsub_test.rb +132 -126
  25. data/test/config_test.rb +2 -4
  26. data/test/contact_test.rb +80 -66
  27. data/test/error_test.rb +54 -55
  28. data/test/jid_test.rb +1 -2
  29. data/test/kit_test.rb +22 -17
  30. data/test/router_test.rb +187 -146
  31. data/test/stanza/iq/disco_info_test.rb +59 -59
  32. data/test/stanza/iq/disco_items_test.rb +36 -34
  33. data/test/stanza/iq/private_storage_test.rb +138 -143
  34. data/test/stanza/iq/roster_test.rb +198 -175
  35. data/test/stanza/iq/session_test.rb +17 -18
  36. data/test/stanza/iq/vcard_test.rb +117 -116
  37. data/test/stanza/iq/version_test.rb +47 -46
  38. data/test/stanza/iq_test.rb +53 -49
  39. data/test/stanza/message_test.rb +92 -89
  40. data/test/stanza/presence/probe_test.rb +2 -5
  41. data/test/stanza/presence/subscribe_test.rb +67 -54
  42. data/test/stanza/pubsub/create_test.rb +86 -108
  43. data/test/stanza/pubsub/delete_test.rb +141 -114
  44. data/test/stanza/pubsub/publish_test.rb +256 -320
  45. data/test/stanza/pubsub/subscribe_test.rb +169 -150
  46. data/test/stanza/pubsub/unsubscribe_test.rb +111 -142
  47. data/test/stanza_test.rb +61 -54
  48. data/test/storage/ldap_test.rb +1 -2
  49. data/test/storage/local_test.rb +3 -5
  50. data/test/storage/null_test.rb +3 -4
  51. data/test/storage/storage_tests.rb +1 -3
  52. data/test/storage_test.rb +1 -2
  53. data/test/store_test.rb +1 -2
  54. data/test/stream/client/auth_test.rb +61 -63
  55. data/test/stream/client/ready_test.rb +7 -8
  56. data/test/stream/client/session_test.rb +19 -18
  57. data/test/stream/component/handshake_test.rb +40 -37
  58. data/test/stream/component/ready_test.rb +76 -61
  59. data/test/stream/component/start_test.rb +7 -8
  60. data/test/stream/http/auth_test.rb +3 -4
  61. data/test/stream/http/ready_test.rb +52 -60
  62. data/test/stream/http/request_test.rb +1 -3
  63. data/test/stream/http/sessions_test.rb +2 -3
  64. data/test/stream/http/start_test.rb +3 -4
  65. data/test/stream/parser_test.rb +3 -4
  66. data/test/stream/sasl_test.rb +105 -86
  67. data/test/stream/server/auth_test.rb +40 -36
  68. data/test/stream/server/outbound/auth_test.rb +3 -4
  69. data/test/stream/server/ready_test.rb +51 -51
  70. data/test/test_helper.rb +42 -0
  71. data/test/token_bucket_test.rb +38 -18
  72. data/test/user_test.rb +79 -49
  73. data/vines.gemspec +33 -0
  74. data/web/chat/javascripts/app.js +1 -1
  75. data/web/lib/coffeescripts/layout.coffee +1 -1
  76. data/web/lib/javascripts/base.js +10 -10
  77. data/web/lib/javascripts/jquery.js +4 -4
  78. metadata +31 -128
  79. data/README +0 -35
  80. data/lib/vines/storage/couchdb.rb +0 -129
  81. data/lib/vines/storage/mongodb.rb +0 -132
  82. data/lib/vines/storage/redis.rb +0 -127
  83. data/lib/vines/storage/sql.rb +0 -220
  84. data/test/rake_test_loader.rb +0 -17
  85. data/test/storage/couchdb_test.rb +0 -107
  86. data/test/storage/mock_mongo.rb +0 -40
  87. data/test/storage/mongodb_test.rb +0 -81
  88. data/test/storage/redis_test.rb +0 -51
  89. data/test/storage/sql_test.rb +0 -62
@@ -1,78 +1,85 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'tmpdir'
4
- require 'vines'
5
- require 'ext/nokogiri'
6
- require 'minitest/autorun'
7
-
8
- class StanzaTest < MiniTest::Unit::TestCase
9
- def setup
10
- @alice = Vines::JID.new('alice@wonderland.lit/tea')
11
- @romeo = Vines::JID.new('romeo@verona.lit/balcony')
12
- @stream = MiniTest::Mock.new
13
- @config = Vines::Config.new do
3
+ require 'test_helper'
4
+
5
+ describe Vines::Stanza do
6
+ subject { Vines::Stanza::Message.new(xml, stream) }
7
+ let(:alice) { Vines::JID.new('alice@wonderland.lit/tea') }
8
+ let(:romeo) { Vines::JID.new('romeo@verona.lit/balcony') }
9
+ let(:stream) { MiniTest::Mock.new }
10
+ let(:config) do
11
+ Vines::Config.new do
14
12
  host 'wonderland.lit' do
15
13
  storage(:fs) { dir Dir.tmpdir }
16
14
  end
17
15
  end
18
16
  end
19
17
 
20
- def test_validate_missing_addresses
21
- node = node(%Q{<message>hello!</message>})
22
- stanza = Vines::Stanza::Message.new(node, @stream)
23
- assert_nil stanza.validate_to
24
- assert_nil stanza.validate_from
25
- assert @stream.verify
26
- end
18
+ describe 'when stanza contains no addresses' do
19
+ let(:xml) { node(%Q{<message>hello!</message>}) }
27
20
 
28
- def test_validate_valid_addresses
29
- node = node(%Q{<message from="#{@alice}" to="#{@romeo}">hello!</message>})
30
- stanza = Vines::Stanza::Message.new(node, @stream)
31
- assert_equal @romeo, stanza.validate_to
32
- assert_equal @alice, stanza.validate_from
33
- assert @stream.verify
21
+ it 'validates them as nil' do
22
+ subject.validate_to.must_be_nil
23
+ subject.validate_from.must_be_nil
24
+ stream.verify
25
+ end
34
26
  end
35
27
 
36
- def test_validate_invalid_addresses
37
- node = node(%Q{<message from="a lice@wonderland.lit" to="romeo@v erona.lit">hello!</message>})
38
- stanza = Vines::Stanza::Message.new(node, @stream)
39
- assert_raises(Vines::StanzaErrors::JidMalformed) { stanza.validate_to }
40
- assert_raises(Vines::StanzaErrors::JidMalformed) { stanza.validate_from }
41
- assert @stream.verify
28
+ describe 'when stanza contains valid addresses' do
29
+ let(:xml) { node(%Q{<message from="#{alice}" to="#{romeo}">hello!</message>}) }
30
+
31
+ it 'validates and returns JID objects' do
32
+ subject.validate_to.must_equal romeo
33
+ subject.validate_from.must_equal alice
34
+ stream.verify
35
+ end
42
36
  end
43
37
 
44
- def test_non_routable_stanza_is_local
45
- stanza = Vines::Stanza.new(node('<auth/>'), @stream)
46
- assert stanza.local?
47
- assert @stream.verify
38
+ describe 'when stanza contains invalid addresses' do
39
+ let(:xml) { node(%Q{<message from="a lice@wonderland.lit" to="romeo@v erona.lit">hello!</message>}) }
40
+
41
+ it 'raises a jid-malformed stanza error' do
42
+ -> { subject.validate_to }.must_raise Vines::StanzaErrors::JidMalformed
43
+ -> { subject.validate_from }.must_raise Vines::StanzaErrors::JidMalformed
44
+ stream.verify
45
+ end
48
46
  end
49
47
 
50
- def test_stanza_missing_to_is_local
51
- node = node(%Q{<message>hello!</message>})
52
- stanza = Vines::Stanza::Message.new(node, @stream)
53
- assert stanza.local?
54
- assert @stream.verify
48
+ describe 'when receiving a non-routable stanza type' do
49
+ let(:xml) { node('<auth/>') }
50
+
51
+ it 'handles locally rather than routing' do
52
+ subject.local?.must_equal true
53
+ stream.verify
54
+ end
55
55
  end
56
56
 
57
- def test_stanza_with_local_jid_is_local
58
- node = node(%Q{<message to="#{@alice}">hello!</message>})
59
- @stream.expect(:config, @config)
60
- stanza = Vines::Stanza::Message.new(node, @stream)
61
- assert stanza.local?
62
- assert @stream.verify
57
+ describe 'when stanza is missing a to address' do
58
+ let(:xml) { node(%Q{<message>hello!</message>}) }
59
+
60
+ it 'handles locally rather than routing' do
61
+ subject.local?.must_equal true
62
+ stream.verify
63
+ end
63
64
  end
64
65
 
65
- def test_stanza_with_remote_jid_is_not_local
66
- node = node(%Q{<message to="#{@romeo}">hello!</message>})
67
- @stream.expect(:config, @config)
68
- stanza = Vines::Stanza::Message.new(node, @stream)
69
- refute stanza.local?
70
- assert @stream.verify
66
+ describe 'when stanza is addressed to a local jid' do
67
+ let(:xml) { node(%Q{<message to="#{alice}">hello!</message>}) }
68
+
69
+ it 'handles locally rather than routing' do
70
+ stream.expect :config, config
71
+ subject.local?.must_equal true
72
+ stream.verify
73
+ end
71
74
  end
72
75
 
73
- private
76
+ describe 'when stanza is addressed to a remote jid' do
77
+ let(:xml) { node(%Q{<message to="#{romeo}">hello!</message>}) }
74
78
 
75
- def node(xml)
76
- Nokogiri::XML(xml).root
79
+ it 'is not considered a local stanza' do
80
+ stream.expect :config, config
81
+ subject.local?.must_equal false
82
+ stream.verify
83
+ end
77
84
  end
78
85
  end
@@ -1,7 +1,6 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'vines'
4
- require 'minitest/autorun'
3
+ require 'test_helper'
5
4
 
6
5
  describe Vines::Storage::Ldap do
7
6
  ALICE_DN = 'uid=alice@wondlerand.lit,ou=People,dc=wonderland,dc=lit'
@@ -1,11 +1,9 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  require 'storage_tests'
4
- require 'tmpdir'
5
- require 'vines'
6
- require 'minitest/autorun'
4
+ require 'test_helper'
7
5
 
8
- class LocalTest < MiniTest::Unit::TestCase
6
+ describe Vines::Storage::Local do
9
7
  include StorageTests
10
8
 
11
9
  DIR = Dir.mktmpdir
@@ -23,7 +21,7 @@ class LocalTest < MiniTest::Unit::TestCase
23
21
  :bcrypt => "#{DIR}/user/bcrypt_password@wonderland.lit",
24
22
  :full => "#{DIR}/user/full@wonderland.lit",
25
23
  :vcard => "#{DIR}/vcard/full@wonderland.lit",
26
- :fragment => "#{DIR}/fragment/full@wonderland.lit-#{FRAGMENT_ID}"
24
+ :fragment => "#{DIR}/fragment/full@wonderland.lit-#{StorageTests::FRAGMENT_ID}"
27
25
  }
28
26
  File.open(files[:empty], 'w') {|f| f.write('') }
29
27
  File.open(files[:no_pass], 'w') {|f| f.write('foo: bar') }
@@ -1,10 +1,9 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'vines'
4
- require 'minitest/autorun'
3
+ require 'test_helper'
5
4
 
6
- class NullStorageTest < MiniTest::Unit::TestCase
7
- def setup
5
+ describe Vines::Storage::Null do
6
+ before do
8
7
  @storage = Vines::Storage::Null.new
9
8
  @user = Vines::User.new(jid: 'alice@wonderland.lit')
10
9
  end
@@ -1,8 +1,6 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'vines'
4
- require 'ext/nokogiri'
5
- require 'minitest/autorun'
3
+ require 'test_helper'
6
4
 
7
5
  # Mixin methods for storage implementation test classes. The behavioral
8
6
  # tests are the same regardless of implementation so share those methods
@@ -1,8 +1,7 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  require 'storage_tests'
4
- require 'vines'
5
- require 'minitest/autorun'
4
+ require 'test_helper'
6
5
 
7
6
  describe Vines::Storage do
8
7
  ALICE = 'alice@wonderland.lit'.freeze
@@ -1,7 +1,6 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'vines'
4
- require 'minitest/autorun'
3
+ require 'test_helper'
5
4
 
6
5
  describe Vines::Store do
7
6
  before do
@@ -1,7 +1,6 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'vines'
4
- require 'minitest/autorun'
3
+ require 'test_helper'
5
4
 
6
5
  describe Vines::Stream::Client::Auth do
7
6
  # disable logging for tests
@@ -27,113 +26,112 @@ describe Vines::Stream::Client::Auth do
27
26
  end
28
27
  end
29
28
 
30
- before do
31
- @stream = MiniTest::Mock.new
32
- @state = Vines::Stream::Client::Auth.new(@stream)
33
- end
29
+ subject { Vines::Stream::Client::Auth.new(stream) }
30
+ let(:stream) { MiniTest::Mock.new }
34
31
 
35
32
  describe 'error handling' do
36
33
  it 'rejects invalid element' do
37
34
  node = node('<bogus/>')
38
- assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
35
+ -> { subject.node(node) }.must_raise Vines::StreamErrors::NotAuthorized
39
36
  end
40
37
 
41
38
  it 'rejects invalid element in sasl namespace' do
42
39
  node = node(%Q{<bogus xmlns="#{Vines::NAMESPACES[:sasl]}"/>})
43
- assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
40
+ -> { subject.node(node) }.must_raise Vines::StreamErrors::NotAuthorized
44
41
  end
45
42
 
46
43
  it 'rejects auth elements missing sasl namespace' do
47
44
  node = node('<auth/>')
48
- assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
45
+ -> { subject.node(node) }.must_raise Vines::StreamErrors::NotAuthorized
49
46
  end
50
47
 
51
48
  it 'rejects auth element with invalid namespace' do
52
49
  node = node('<auth xmlns="bogus"/>')
53
- assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
50
+ -> { subject.node(node) }.must_raise Vines::StreamErrors::NotAuthorized
54
51
  end
55
52
 
56
53
  it 'rejects valid auth element missing mechanism' do
57
- @stream.expect(:error, nil, [Vines::SaslErrors::InvalidMechanism])
58
- @stream.expect(:authentication_mechanisms, ['PLAIN'])
54
+ stream.expect :error, nil, [Vines::SaslErrors::InvalidMechanism]
55
+ stream.expect :authentication_mechanisms, ['PLAIN']
59
56
  node = node(%Q{<auth xmlns="#{Vines::NAMESPACES[:sasl]}">tokens</auth>})
60
- @state.node(node)
61
- assert @stream.verify
57
+ subject.node(node)
58
+ stream.verify
62
59
  end
63
60
 
64
61
  it 'rejects valid auth element with invalid mechanism' do
65
- @stream.expect(:error, nil, [Vines::SaslErrors::InvalidMechanism])
66
- @stream.expect(:authentication_mechanisms, ['PLAIN'])
62
+ stream.expect :error, nil, [Vines::SaslErrors::InvalidMechanism]
63
+ stream.expect :authentication_mechanisms, ['PLAIN']
67
64
  node = node(%Q{<auth xmlns="#{Vines::NAMESPACES[:sasl]}" mechanism="bogus">tokens</auth>})
68
- @state.node(node)
69
- assert @stream.verify
65
+ subject.node(node)
66
+ stream.verify
70
67
  end
71
68
  end
72
69
 
73
70
  describe 'plain auth' do
74
71
  it 'rejects valid mechanism missing base64 text' do
75
- @stream.expect(:error, nil, [Vines::SaslErrors::MalformedRequest])
76
- node = node(%Q{<auth xmlns="#{Vines::NAMESPACES[:sasl]}" mechanism="PLAIN"></auth>})
77
- @state.node(node)
78
- assert @stream.verify
72
+ stream.expect :error, nil, [Vines::SaslErrors::MalformedRequest]
73
+ node = plain('')
74
+ subject.node(node)
75
+ stream.verify
79
76
  end
80
77
 
81
78
  it 'rejects invalid base64 text' do
82
- @stream.expect(:error, nil, [Vines::SaslErrors::IncorrectEncoding])
83
- @stream.expect(:authentication_mechanisms, ['PLAIN'])
84
- node = node(%Q{<auth xmlns="#{Vines::NAMESPACES[:sasl]}" mechanism="PLAIN">tokens</auth>})
85
- @state.node(node)
86
- assert @stream.verify
79
+ stream.expect :error, nil, [Vines::SaslErrors::IncorrectEncoding]
80
+ stream.expect :authentication_mechanisms, ['PLAIN']
81
+ node = plain('tokens')
82
+ subject.node(node)
83
+ stream.verify
87
84
  end
88
85
 
89
86
  it 'rejects invalid password' do
90
- @stream.expect(:storage, MockStorage.new)
91
- @stream.expect(:domain, 'wonderland.lit')
92
- @stream.expect(:error, nil, [Vines::SaslErrors::NotAuthorized])
93
- @stream.expect(:authentication_mechanisms, ['PLAIN'])
94
- node = node(%Q{<auth xmlns="#{Vines::NAMESPACES[:sasl]}" mechanism="PLAIN">#{Base64.strict_encode64("\x00alice\x00bogus")}</auth>})
95
- @state.node(node)
96
- assert @stream.verify
87
+ stream.expect :storage, MockStorage.new
88
+ stream.expect :domain, 'wonderland.lit'
89
+ stream.expect :error, nil, [Vines::SaslErrors::NotAuthorized]
90
+ stream.expect :authentication_mechanisms, ['PLAIN']
91
+ node = plain(Base64.strict_encode64("\x00alice\x00bogus"))
92
+ subject.node(node)
93
+ stream.verify
97
94
  end
98
95
 
99
96
  it 'passes with valid password' do
100
97
  user = Vines::User.new(jid: 'alice@wonderland.lit')
101
- @stream.expect(:reset, nil)
102
- @stream.expect(:domain, 'wonderland.lit')
103
- @stream.expect(:storage, MockStorage.new)
104
- @stream.expect(:user=, nil, [user])
105
- @stream.expect(:write, nil, [%Q{<success xmlns="#{Vines::NAMESPACES[:sasl]}"/>}])
106
- @stream.expect(:advance, nil, [Vines::Stream::Client::BindRestart])
107
- @stream.expect(:authentication_mechanisms, ['PLAIN'])
108
- node = node(%Q{<auth xmlns="#{Vines::NAMESPACES[:sasl]}" mechanism="PLAIN">#{Base64.strict_encode64("\x00alice\x00secr3t")}</auth>})
109
- @state.node(node)
110
- assert @stream.verify
98
+ stream.expect :reset, nil
99
+ stream.expect :domain, 'wonderland.lit'
100
+ stream.expect :storage, MockStorage.new
101
+ stream.expect :user=, nil, [user]
102
+ stream.expect :write, nil, [%Q{<success xmlns="#{Vines::NAMESPACES[:sasl]}"/>}]
103
+ stream.expect :advance, nil, [Vines::Stream::Client::BindRestart]
104
+ stream.expect :authentication_mechanisms, ['PLAIN']
105
+ node = plain(Base64.strict_encode64("\x00alice\x00secr3t"))
106
+ subject.node(node)
107
+ stream.verify
111
108
  end
112
109
 
113
110
  it 'raises policy-violation after max auth attempts is reached' do
114
- @stream.expect(:domain, 'wonderland.lit')
115
- @stream.expect(:authentication_mechanisms, ['PLAIN'])
116
- @stream.expect(:storage, MockStorage.new)
117
- node = proc do
118
- node(%Q{<auth xmlns="#{Vines::NAMESPACES[:sasl]}" mechanism="PLAIN">#{Base64.strict_encode64("\x00alice\x00bogus")}</auth>})
119
- end
120
-
121
- @stream.expect(:error, nil, [Vines::SaslErrors::NotAuthorized])
122
- @state.node(node.call)
123
- assert @stream.verify
124
-
125
- @state.node(node.call)
126
- assert @stream.verify
127
-
128
- @stream.expect(:error, nil, [Vines::StreamErrors::PolicyViolation])
129
- @state.node(node.call)
130
- assert @stream.verify
111
+ stream.expect :domain, 'wonderland.lit'
112
+ stream.expect :storage, MockStorage.new
113
+ node = -> { plain(Base64.strict_encode64("\x00alice\x00bogus")) }
114
+
115
+ stream.expect :authentication_mechanisms, ['PLAIN']
116
+ stream.expect :error, nil, [Vines::SaslErrors::NotAuthorized]
117
+ subject.node(node.call)
118
+ stream.verify
119
+
120
+ stream.expect :authentication_mechanisms, ['PLAIN']
121
+ stream.expect :error, nil, [Vines::SaslErrors::NotAuthorized]
122
+ subject.node(node.call)
123
+ stream.verify
124
+
125
+ stream.expect :authentication_mechanisms, ['PLAIN']
126
+ stream.expect :error, nil, [Vines::StreamErrors::PolicyViolation]
127
+ subject.node(node.call)
128
+ stream.verify
131
129
  end
132
130
  end
133
131
 
134
132
  private
135
133
 
136
- def node(xml)
137
- Nokogiri::XML(xml).root
134
+ def plain(authzid)
135
+ node(%Q{<auth xmlns="#{Vines::NAMESPACES[:sasl]}" mechanism="PLAIN">#{authzid}</auth>})
138
136
  end
139
137
  end
@@ -1,12 +1,11 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'vines'
4
- require 'minitest/autorun'
3
+ require 'test_helper'
5
4
 
6
- class ClientReadyTest < MiniTest::Unit::TestCase
5
+ describe Vines::Stream::Client::Ready do
7
6
  STANZAS = []
8
7
 
9
- def setup
8
+ before do
10
9
  @stream = MiniTest::Mock.new
11
10
  @state = Vines::Stream::Client::Ready.new(@stream, nil)
12
11
  def @state.to_stanza(node)
@@ -17,24 +16,24 @@ class ClientReadyTest < MiniTest::Unit::TestCase
17
16
  stanza.expect(:process, nil)
18
17
  stanza.expect(:validate_to, nil)
19
18
  stanza.expect(:validate_from, nil)
20
- ClientReadyTest::STANZAS << stanza
19
+ STANZAS << stanza
21
20
  stanza
22
21
  end
23
22
  end
24
23
  end
25
24
 
26
- def teardown
25
+ after do
27
26
  STANZAS.clear
28
27
  end
29
28
 
30
- def test_good_node_processes
29
+ it 'processes a valid node' do
31
30
  node = node('<message/>')
32
31
  @state.node(node)
33
32
  assert_equal 1, STANZAS.size
34
33
  assert STANZAS.map {|s| s.verify }.all?
35
34
  end
36
35
 
37
- def test_unsupported_stanza_type
36
+ it 'raises an unsupported-stanza-type stream error for invalid node' do
38
37
  node = node('<bogus/>')
39
38
  assert_raises(Vines::StreamErrors::UnsupportedStanzaType) { @state.node(node) }
40
39
  assert STANZAS.empty?
@@ -1,26 +1,27 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'vines'
4
- require 'minitest/autorun'
3
+ require 'test_helper'
5
4
 
6
- class ClientSessionTest < MiniTest::Unit::TestCase
7
- def setup
8
- @stream = MiniTest::Mock.new
9
- @stream.expect(:config, nil)
10
- end
11
-
12
- def test_equality
13
- one = Vines::Stream::Client::Session.new(@stream)
14
- two = Vines::Stream::Client::Session.new(@stream)
5
+ describe Vines::Stream::Client::Session do
6
+ subject { Vines::Stream::Client::Session.new(stream) }
7
+ let(:another) { Vines::Stream::Client::Session.new(stream) }
8
+ let(:stream) { OpenStruct.new(config: nil) }
15
9
 
16
- assert_nil one <=> 42
10
+ describe 'session equality checks' do
11
+ it 'uses class in equality check' do
12
+ (subject <=> 42).must_be_nil
13
+ end
17
14
 
18
- assert one == one
19
- assert one.eql?(one)
20
- assert one.hash == one.hash
15
+ it 'is equal to itself' do
16
+ assert subject == subject
17
+ assert subject.eql?(subject)
18
+ assert subject.hash == subject.hash
19
+ end
21
20
 
22
- refute one == two
23
- refute one.eql?(two)
24
- refute one.hash == two.hash
21
+ it 'is not equal to another session' do
22
+ refute subject == another
23
+ refute subject.eql?(another)
24
+ refute subject.hash == another.hash
25
+ end
25
26
  end
26
27
  end