283 lines
9.2 KiB
Ruby
283 lines
9.2 KiB
Ruby
require 'spec_helper'
|
|
|
|
# these tests avoid the use of ActiveRecord and FactoryGirl to do blackbox, non test-instrumented tests
|
|
describe ConnectionManager do
|
|
|
|
before do
|
|
|
|
@conn = PG::Connection.new(:dbname => SpecDb::TEST_DB_NAME, :user => "postgres", :password => "postgres", :host => "localhost")
|
|
@connman = ConnectionManager.new(@conn)
|
|
@message_factory = MessageFactory.new
|
|
end
|
|
|
|
def create_user(name, email)
|
|
@conn.exec("INSERT INTO users (name, email, password_digest) VALUES ($1, $2, $3) RETURNING id", [name, email, '1']) do |result|
|
|
return result.getvalue(0, 0)
|
|
end
|
|
end
|
|
|
|
def create_music_session(user_id)
|
|
description = "some session"
|
|
@conn.exec("INSERT INTO music_sessions (user_id, description) VALUES ($1, $2) RETURNING id", [user_id, description]) do |result|
|
|
return result.getvalue(0, 0)
|
|
end
|
|
end
|
|
|
|
def assert_num_connections(client_id, expected_num_connections)
|
|
# make sure the connection is still there
|
|
@conn.exec("SELECT count(*) FROM connections where client_id = $1", [client_id]) do |result|
|
|
result.getvalue(0, 0).to_i.should == expected_num_connections
|
|
end
|
|
end
|
|
|
|
def assert_session_exists(music_session_id, exists)
|
|
@conn.exec("SELECT count(*) FROM music_sessions where id = $1", [music_session_id]) do |result|
|
|
if exists
|
|
result.getvalue(0, 0).should == "1"
|
|
else
|
|
result.getvalue(0, 0).should == "0"
|
|
end
|
|
end
|
|
end
|
|
|
|
it "can't create bogus user_id" do
|
|
|
|
expect { @connman.create_connection("aeonuthaoentuh", "client_id", "1.1.1.1") }.to raise_error(PG::Error)
|
|
end
|
|
|
|
it "can't create two client_ids of same value" do
|
|
|
|
client_id = "client_id1"
|
|
user_id = create_user("user1", "user1@jamkazam.com")
|
|
@connman.create_connection(user_id, client_id, "1.1.1.1")
|
|
expect { @connman.create_connection(user_id, client_id, "1.1.1.1") }.to raise_error(PG::Error)
|
|
|
|
end
|
|
|
|
it "create connection then delete it" do
|
|
|
|
client_id = "client_id2"
|
|
user_id = create_user("user2", "user2@jamkazam.com")
|
|
@connman.create_connection(user_id, client_id, "1.1.1.1")
|
|
|
|
# make sure the connection is seen
|
|
@conn.exec("SELECT count(*) FROM connections where user_id = $1", [user_id]) do |result|
|
|
result.getvalue(0, 0).should == "1"
|
|
end
|
|
|
|
@connman.delete_connection(client_id)
|
|
@conn.exec("SELECT count(*) FROM connections where user_id = $1", [user_id]) do |result|
|
|
result.getvalue(0, 0).should == "0"
|
|
end
|
|
end
|
|
|
|
it "create connection creates user joined message appropriately" do
|
|
|
|
client_id = "client_id3"
|
|
client_id2 = "client_id3_1"
|
|
|
|
user_id = create_user("user3", "user3@jamkazam.com")
|
|
|
|
# we should get a message saying that this user is online
|
|
friend_update = @message_factory.friend_update(user_id, true)
|
|
@connman.mq_router.should_receive(:publish_to_friends).with([], friend_update, user_id)
|
|
|
|
@connman.create_connection(user_id, client_id, "1.1.1.1")
|
|
|
|
|
|
# but a second connection from the same user should cause no such message
|
|
@connman.should_receive(:publish_to_friends).exactly(0).times
|
|
|
|
@connman.create_connection(user_id, client_id2, "1.1.1.1")
|
|
|
|
end
|
|
|
|
|
|
it "deletes connection creates user left message appropriately" do
|
|
|
|
client_id = "client_id4"
|
|
client_id2 = "client_id4_1"
|
|
|
|
user_id = create_user("user4", "user4@jamkazam.com")
|
|
|
|
# we should get a message saying that this user is online
|
|
|
|
@connman.create_connection(user_id, client_id, "1.1.1.1")
|
|
@connman.create_connection(user_id, client_id2, "1.1.1.1")
|
|
|
|
# deleting one of the two connections should cause no messages
|
|
@connman.should_receive(:publish_to_friends).exactly(0).times
|
|
|
|
@connman.delete_connection(client_id)
|
|
|
|
# but deleting the final connection should cause a left message
|
|
friend_update = @message_factory.friend_update(user_id, false)
|
|
@connman.mq_router.should_receive(:publish_to_friends).with([], friend_update, user_id)
|
|
|
|
@connman.delete_connection(client_id2)
|
|
|
|
end
|
|
|
|
it "lookup of friends should find mutual friends only" do
|
|
|
|
def create_friend(user_id, friend_id)
|
|
@conn.exec("INSERT INTO friendships(user_id, friend_id) VALUES ($1, $2)", [user_id, friend_id])
|
|
end
|
|
|
|
def delete_friend(user_id, friend_id)
|
|
@conn.exec("DELETE FROM friendships WHERE user_id = $1 AND friend_id = $2", [user_id, friend_id])
|
|
end
|
|
|
|
client_id = "client_id5"
|
|
|
|
user_id1 = create_user("user5", "user5@jamkazam.com")
|
|
user_id2 = create_user("user6", "user6@jamkazam.com")
|
|
user_id3 = create_user("user7", "user7@jamkazam.com")
|
|
|
|
@connman.gather_friends(@conn, user_id1).should == []
|
|
@connman.gather_friends(@conn, user_id2).should == []
|
|
@connman.gather_friends(@conn, user_id3).should == []
|
|
|
|
# create one-way link
|
|
create_friend(user_id1, user_id2)
|
|
|
|
@connman.gather_friends(@conn, user_id1).should == []
|
|
@connman.gather_friends(@conn, user_id2).should == []
|
|
@connman.gather_friends(@conn, user_id3).should == []
|
|
|
|
# create one-way link back the other way
|
|
create_friend(user_id2, user_id1)
|
|
|
|
@connman.gather_friends(@conn, user_id1).should == [user_id2]
|
|
@connman.gather_friends(@conn, user_id2).should == [user_id1]
|
|
@connman.gather_friends(@conn, user_id3).should == []
|
|
|
|
# make sure a new link to user 1 > user 3 doesn't disrupt anything
|
|
create_friend(user_id1, user_id3)
|
|
|
|
@connman.gather_friends(@conn, user_id1).should == [user_id2]
|
|
@connman.gather_friends(@conn, user_id2).should == [user_id1]
|
|
@connman.gather_friends(@conn, user_id3).should == []
|
|
|
|
# make sure a new link to user 1 > user 3 doesn't disrupt anything
|
|
create_friend(user_id3, user_id1)
|
|
|
|
@connman.gather_friends(@conn, user_id1).should =~ [user_id2, user_id3]
|
|
@connman.gather_friends(@conn, user_id2).should == [user_id1]
|
|
@connman.gather_friends(@conn, user_id3).should == [user_id1]
|
|
end
|
|
|
|
it "remove stale connection" do
|
|
|
|
client_id = "client_id8"
|
|
|
|
user_id = create_user("user8", "user8@jamkazam.com")
|
|
|
|
@connman.create_connection(user_id, client_id, "1.1.1.1")
|
|
|
|
@connman.remove_stale_connections(60)
|
|
|
|
assert_num_connections(client_id, 1)
|
|
|
|
sleep(1)
|
|
|
|
# this should remove the stale connection
|
|
@connman.remove_stale_connections(1)
|
|
|
|
assert_num_connections(client_id, 0)
|
|
end
|
|
|
|
it "connections with music_sessions associated" do
|
|
|
|
client_id = "client_id9"
|
|
user_id = create_user("user9", "user9@jamkazam.com")
|
|
music_session_id = create_music_session(user_id)
|
|
|
|
@connman.create_connection(user_id, client_id, "1.1.1.1")
|
|
@connman.join_music_session(user_id, client_id, music_session_id)
|
|
|
|
assert_session_exists(music_session_id, true)
|
|
|
|
@conn.exec("SELECT music_session_id FROM connections WHERE client_id = $1", [client_id]) do |result|
|
|
result.getvalue(0, 0).should == music_session_id
|
|
end
|
|
|
|
@connman.delete_connection(client_id)
|
|
|
|
assert_num_connections(client_id, 0)
|
|
|
|
assert_session_exists(music_session_id, false)
|
|
end
|
|
|
|
it "join_music_session fails if no connection" do
|
|
|
|
client_id = "client_id10"
|
|
user_id = create_user("user10", "user10@jamkazam.com")
|
|
music_session_id = create_music_session(user_id)
|
|
|
|
expect { @connman.join_music_session(user_id, client_id, music_session_id)}.to raise_error(JamRuby::StateError)
|
|
end
|
|
|
|
it "join_music_session fails if no music_session" do
|
|
|
|
client_id = "client_id11"
|
|
user_id = create_user("user11", "user11@jamkazam.com")
|
|
|
|
@connman.create_connection(user_id, client_id, "1.1.1.1")
|
|
|
|
expect { @connman.join_music_session(user_id, client_id, "some_bogus_music_session_id")}.to raise_error(JamRuby::StateError)
|
|
end
|
|
|
|
it "leave_music_session fails if no music_session" do
|
|
|
|
client_id = "client_id12"
|
|
user_id = create_user("user12", "user12@jamkazam.com")
|
|
|
|
@connman.create_connection(user_id, client_id, "1.1.1.1")
|
|
|
|
expect { @connman.leave_music_session(user_id, client_id, "some_bogus_music_session_id")}.to raise_error(JamRuby::StateError)
|
|
end
|
|
|
|
it "leave_music_session fails if in different music_session" do
|
|
|
|
client_id = "client_id13"
|
|
user_id = create_user("user13", "user13@jamkazam.com")
|
|
music_session_id = create_music_session(user_id)
|
|
|
|
@connman.create_connection(user_id, client_id, "1.1.1.1")
|
|
@connman.join_music_session(user_id, client_id, music_session_id)
|
|
|
|
expect { @connman.leave_music_session(user_id, client_id, "some_bogus_music_session_id")}.to raise_error(JamRuby::StateError)
|
|
end
|
|
|
|
it "leave_music_session works" do
|
|
|
|
client_id = "client_id14"
|
|
user_id = create_user("user14", "user14@jamkazam.com")
|
|
music_session_id = create_music_session(user_id)
|
|
|
|
@connman.create_connection(user_id, client_id, "1.1.1.1")
|
|
@connman.join_music_session(user_id, client_id, music_session_id)
|
|
|
|
assert_session_exists(music_session_id, true)
|
|
|
|
@conn.exec("SELECT music_session_id FROM connections WHERE client_id = $1", [client_id]) do |result|
|
|
result.getvalue(0, 0).should == music_session_id
|
|
end
|
|
|
|
@connman.leave_music_session(user_id, client_id, music_session_id)
|
|
|
|
@conn.exec("SELECT music_session_id FROM connections WHERE client_id = $1", [client_id]) do |result|
|
|
result.getvalue(0, 0).should == nil
|
|
end
|
|
|
|
assert_session_exists(music_session_id, false)
|
|
|
|
@connman.delete_connection(client_id)
|
|
|
|
assert_num_connections(client_id, 0)
|
|
|
|
end
|
|
end
|
|
|