Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master' into core
Browse files Browse the repository at this point in the history
Conflicts:
	README.md
	test/storage/couchdb_test.rb
	test/storage/ldap_test.rb
	test/storage/mongodb_test.rb
	test/storage/redis_test.rb
	test/storage/sql_test.rb
	vines.gemspec
  • Loading branch information
jbarnette committed Sep 21, 2012
2 parents bf16b2c + 2de02ad commit fbfdf53
Show file tree
Hide file tree
Showing 46 changed files with 1,518 additions and 1,444 deletions.
3 changes: 1 addition & 2 deletions test/cluster/publisher_test.rb
@@ -1,7 +1,6 @@
# encoding: UTF-8

require 'vines'
require 'minitest/autorun'
require 'test_helper'

class ClusterPublisherTest < MiniTest::Unit::TestCase
def setup
Expand Down
71 changes: 32 additions & 39 deletions test/cluster/sessions_test.rb
@@ -1,53 +1,46 @@
# encoding: UTF-8

require 'vines'
require 'ext/nokogiri'
require 'test_helper'
require 'storage/storage_tests'
require 'storage/mock_redis'
require 'minitest/autorun'

class ClusterSessionsTest < MiniTest::Unit::TestCase
def setup
@connection = MockRedis.new
@cluster = MiniTest::Mock.new
@cluster.expect(:connection, @connection)
end
describe Vines::Cluster::Sessions do
subject { Vines::Cluster::Sessions.new(cluster) }
let(:connection) { MockRedis.new }
let(:cluster) { OpenStruct.new(id: 'abc', connection: connection) }
let(:jid1) { 'alice@wonderland.lit/tea' }
let(:jid2) { 'alice@wonderland.lit/cake' }

def test_save
StorageTests::EMLoop.new do
@cluster.expect(:id, 'abc')
jid1 = 'alice@wonderland.lit/tea'
jid2 = 'alice@wonderland.lit/cake'
sessions = Vines::Cluster::Sessions.new(@cluster)
sessions.save(jid1, {available: true, interested: true})
sessions.save(jid2, {available: false, interested: false})
EM.next_tick do
session1 = {node: 'abc', available: true, interested: true}
session2 = {node: 'abc', available: false, interested: false}
assert_equal 2, @connection.db["sessions:alice@wonderland.lit"].size
assert_equal session1.to_json, @connection.db["sessions:alice@wonderland.lit"]['tea']
assert_equal session2.to_json, @connection.db["sessions:alice@wonderland.lit"]['cake']
assert_equal [jid1, jid2], @connection.db["cluster:nodes:abc"].to_a
assert @cluster.verify
describe 'when saving to the cluster' do
it 'writes to a redis hash' do
StorageTests::EMLoop.new do
subject.save(jid1, {available: true, interested: true})
subject.save(jid2, {available: false, interested: false})
EM.next_tick do
session1 = {node: 'abc', available: true, interested: true}
session2 = {node: 'abc', available: false, interested: false}
connection.db["sessions:alice@wonderland.lit"].size.must_equal 2
connection.db["sessions:alice@wonderland.lit"]['tea'].must_equal session1.to_json
connection.db["sessions:alice@wonderland.lit"]['cake'].must_equal session2.to_json
connection.db["cluster:nodes:abc"].to_a.must_equal [jid1, jid2]
end
end
end
end

def test_delete
StorageTests::EMLoop.new do
jid1 = 'alice@wonderland.lit/tea'
jid2 = 'alice@wonderland.lit/cake'
@connection.db["sessions:alice@wonderland.lit"] = {}
@connection.db["sessions:alice@wonderland.lit"]['tea'] = {node: 'abc', available: true}.to_json
@connection.db["sessions:alice@wonderland.lit"]['cake'] = {node: 'abc', available: true}.to_json
@connection.db["cluster:nodes:abc"] = Set.new([jid1, jid2])
describe 'when deleting from the cluster' do
it 'removes from a redis hash' do
StorageTests::EMLoop.new do
connection.db["sessions:alice@wonderland.lit"] = {}
connection.db["sessions:alice@wonderland.lit"]['tea'] = {node: 'abc', available: true}.to_json
connection.db["sessions:alice@wonderland.lit"]['cake'] = {node: 'abc', available: true}.to_json
connection.db["cluster:nodes:abc"] = Set.new([jid1, jid2])

sessions = Vines::Cluster::Sessions.new(@cluster)
sessions.delete(jid1)
EM.next_tick do
assert_equal 1, @connection.db["sessions:alice@wonderland.lit"].size
assert_equal [jid2], @connection.db["cluster:nodes:abc"].to_a
assert @cluster.verify
subject.delete(jid1)
EM.next_tick do
connection.db["sessions:alice@wonderland.lit"].size.must_equal 1
connection.db["cluster:nodes:abc"].to_a.must_equal [jid2]
end
end
end
end
Expand Down
4 changes: 1 addition & 3 deletions test/cluster/subscriber_test.rb
@@ -1,8 +1,6 @@
# encoding: UTF-8

require 'vines'
require 'ext/nokogiri'
require 'minitest/autorun'
require 'test_helper'

class ClusterSubscriberTest < MiniTest::Unit::TestCase
def setup
Expand Down
4 changes: 1 addition & 3 deletions test/config/host_test.rb
@@ -1,8 +1,6 @@
# encoding: UTF-8

require 'tmpdir'
require 'vines'
require 'minitest/autorun'
require 'test_helper'

class HostTest < MiniTest::Unit::TestCase
def test_missing_storage
Expand Down
5 changes: 1 addition & 4 deletions test/config/pubsub_test.rb
@@ -1,9 +1,6 @@
# encoding: UTF-8

require 'tmpdir'
require 'vines'
require 'ext/nokogiri'
require 'minitest/autorun'
require 'test_helper'

class ConfigPubSubTest < MiniTest::Unit::TestCase
def setup
Expand Down
4 changes: 1 addition & 3 deletions test/config_test.rb
@@ -1,8 +1,6 @@
# encoding: UTF-8

require 'tmpdir'
require 'vines'
require 'minitest/autorun'
require 'test_helper'

class ConfigTest < MiniTest::Unit::TestCase
def test_missing_host
Expand Down
146 changes: 80 additions & 66 deletions test/contact_test.rb
@@ -1,88 +1,102 @@
# encoding: UTF-8

require 'vines'
require 'ext/nokogiri'
require 'minitest/autorun'

class ContactTest < MiniTest::Unit::TestCase
def test_equality
alice = Vines::Contact.new(:jid => 'alice@wonderland.lit')
alice2 = Vines::Contact.new(:jid => 'alice@wonderland.lit')
hatter = Vines::Contact.new(:jid => 'hatter@wonderland.lit')

assert_nil alice <=> 42

assert alice == alice2
assert alice.eql?(alice2)
assert alice.hash == alice2.hash

refute alice == hatter
refute alice.eql?(hatter)
refute alice.hash == hatter.hash
require 'test_helper'

describe Vines::Contact do
subject do
Vines::Contact.new(
jid: 'alice@wonderland.lit',
name: "Alice",
groups: %w[Friends Buddies],
subscription: 'from')
end

def test_initialize_missing_jid_raises
assert_raises(ArgumentError) { Vines::Contact.new }
assert_raises(ArgumentError) { Vines::Contact.new(:jid => '') }
end
describe 'contact equality checks' do
let(:alice) { Vines::Contact.new(jid: 'alice@wonderland.lit') }
let(:hatter) { Vines::Contact.new(jid: 'hatter@wonderland.lit') }

def test_initialize_domain_only_jid_does_not_raise
contact = Vines::Contact.new(:jid => 'tea.wonderland.lit')
assert_equal 'tea.wonderland.lit', contact.jid.to_s
end
it 'uses class in equality check' do
(subject <=> 42).must_be_nil
end

def test_to_roster_xml_sorts_groups
contact = Vines::Contact.new(
:jid => 'a@wonderland.lit',
:name => "Contact 1",
:groups => %w[B A])
it 'is equal to itself' do
assert subject == subject
assert subject.eql?(subject)
assert subject.hash == subject.hash
end

expected = %q{
<item jid="a@wonderland.lit" name="Contact 1" subscription="none">
<group>A</group>
<group>B</group>
</item>
}.strip.gsub(/\n/, '').gsub(/\s{2,}/, '')
it 'is equal to another contact with the same jid' do
assert subject == alice
assert subject.eql?(alice)
assert subject.hash == alice.hash
end

assert_equal expected, contact.to_roster_xml.to_xml(:indent => 0).gsub(/\n/, '')
it 'is not equal to a different jid' do
refute subject == hatter
refute subject.eql?(hatter)
refute subject.hash == hatter.hash
end
end

def test_send_roster_push
contact = Vines::Contact.new(
:jid => 'alice@wonderland.lit',
:name => "Alice",
:groups => %w[Friends Buddies],
:subscription => 'from')

recipient = MiniTest::Mock.new
recipient.expect(:user, Vines::User.new(:jid => 'hatter@wonderland.lit'))
def recipient.nodes; @nodes; end
def recipient.write(node)
@nodes ||= []
@nodes << node
describe 'initialize' do
it 'raises when not given a jid' do
-> { Vines::Contact.new }.must_raise ArgumentError
-> { Vines::Contact.new(jid: '') }.must_raise ArgumentError
end

contact.send_roster_push(recipient)
assert recipient.verify
assert_equal 1, recipient.nodes.size
it 'accepts a domain-only jid' do
contact = Vines::Contact.new(jid: 'tea.wonderland.lit')
contact.jid.to_s.must_equal 'tea.wonderland.lit'
end
end

expected = node(%q{
<iq to="hatter@wonderland.lit" type="set">
<query xmlns="jabber:iq:roster">
describe '#to_roster_xml' do
let(:expected) do
node(%q{
<item jid="alice@wonderland.lit" name="Alice" subscription="from">
<group>Buddies</group>
<group>Friends</group>
</item>
</query>
</iq>
}.strip.gsub(/\n/, '').gsub(/\s{2,}/, ''))
recipient.nodes[0].remove_attribute('id') # id is random
assert_equal expected, recipient.nodes[0]
})
end

it 'sorts group names' do
subject.to_roster_xml.must_equal expected
end
end

private
describe '#send_roster_push' do
let(:recipient) { MiniTest::Mock.new }
let(:expected) do
node(%q{
<iq to="hatter@wonderland.lit" type="set">
<query xmlns="jabber:iq:roster">
<item jid="alice@wonderland.lit" name="Alice" subscription="from">
<group>Buddies</group>
<group>Friends</group>
</item>
</query>
</iq>
})
end

def node(xml)
Nokogiri::XML(xml).root
before do
recipient.expect :user, Vines::User.new(jid: 'hatter@wonderland.lit')
class << recipient
attr_accessor :nodes
def write(node)
@nodes ||= []
@nodes << node
end
end
end

it '' do
subject.send_roster_push(recipient)
recipient.verify
recipient.nodes.size.must_equal 1
recipient.nodes.first.remove_attribute('id') # id is random
recipient.nodes.first.must_equal expected
end
end
end

0 comments on commit fbfdf53

Please sign in to comment.