468 lines
20 KiB
Ruby
468 lines
20 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe ActiveMusicSession do
|
|
|
|
before(:each) do
|
|
ActiveMusicSession.delete_all
|
|
IcecastServer.delete_all
|
|
IcecastMount.delete_all
|
|
end
|
|
|
|
it 'can grant access to valid user' do
|
|
|
|
user1 = FactoryGirl.create(:user) # in the jam session
|
|
user2 = FactoryGirl.create(:user) # in the jam session
|
|
user3 = FactoryGirl.create(:user) # not in the jam session
|
|
|
|
music_session = FactoryGirl.create(:active_music_session, :creator => user1, :musician_access => false)
|
|
FactoryGirl.create(:connection, :user => user1, :music_session => music_session)
|
|
FactoryGirl.create(:connection, :user => user2, :music_session => music_session)
|
|
|
|
|
|
music_session.access?(user1).should == true
|
|
music_session.access?(user2).should == true
|
|
music_session.access?(user3).should == false
|
|
end
|
|
|
|
it 'anyone can join a open music session' do
|
|
|
|
user1 = FactoryGirl.create(:user) # in the jam session
|
|
user2 = FactoryGirl.create(:user) # in the jam session
|
|
user3 = FactoryGirl.create(:user) # not in the jam session
|
|
|
|
music_session = FactoryGirl.create(:active_music_session, :creator => user1, :musician_access => true)
|
|
|
|
music_session.can_join?(user1, true).should == true
|
|
music_session.can_join?(user2, true).should == true
|
|
music_session.can_join?(user3, true).should == true
|
|
end
|
|
|
|
it 'no one but invited people can join closed music session' do
|
|
user1 = FactoryGirl.create(:user) # in the jam session
|
|
user2 = FactoryGirl.create(:user) # in the jam session
|
|
user3 = FactoryGirl.create(:user) # not in the jam session
|
|
|
|
music_session = FactoryGirl.create(:active_music_session, :creator => user1, :musician_access => false)
|
|
FactoryGirl.create(:connection, :user => user1, :music_session => music_session)
|
|
|
|
music_session.can_join?(user1, true).should == true
|
|
music_session.can_join?(user2, true).should == false
|
|
music_session.can_join?(user3, true).should == false
|
|
|
|
# invite user 2
|
|
FactoryGirl.create(:friendship, :user => user1, :friend => user2)
|
|
FactoryGirl.create(:friendship, :user => user2, :friend => user1)
|
|
FactoryGirl.create(:invitation, :sender => user1, :receiver => user2, :music_session => music_session.music_session)
|
|
|
|
music_session.can_join?(user1, true).should == true
|
|
music_session.can_join?(user2, true).should == true
|
|
music_session.can_join?(user3, true).should == false
|
|
end
|
|
|
|
it 'no one but invited people can see closed music session' do
|
|
user1 = FactoryGirl.create(:user) # in the jam session
|
|
user2 = FactoryGirl.create(:user) # in the jam session
|
|
user3 = FactoryGirl.create(:user) # not in the jam session
|
|
|
|
music_session = FactoryGirl.create(:active_music_session, :creator => user1, :musician_access => false, :fan_access => false)
|
|
FactoryGirl.create(:connection, :user => user1, :music_session => music_session)
|
|
|
|
music_session.can_see?(user1).should == true
|
|
music_session.can_see?(user2).should == false
|
|
music_session.can_see?(user3).should == false
|
|
|
|
# invite user 2
|
|
FactoryGirl.create(:friendship, :user => user1, :friend => user2)
|
|
FactoryGirl.create(:friendship, :user => user2, :friend => user1)
|
|
FactoryGirl.create(:invitation, :sender => user1, :receiver => user2, :music_session => music_session.music_session)
|
|
|
|
music_session.can_see?(user1).should == true
|
|
music_session.can_see?(user2).should == true
|
|
music_session.can_see?(user3).should == false
|
|
end
|
|
|
|
describe "index" do
|
|
it "orders two sessions by created_at starting with most recent" do
|
|
creator = FactoryGirl.create(:user)
|
|
creator2 = FactoryGirl.create(:user)
|
|
|
|
earlier_session = FactoryGirl.create(:active_music_session, :creator => creator, :description => "Earlier Session")
|
|
FactoryGirl.create(:connection, :user => creator, :music_session => earlier_session)
|
|
|
|
later_session = FactoryGirl.create(:active_music_session, :creator => creator2, :description => "Later Session")
|
|
FactoryGirl.create(:connection, :user => creator2, :music_session => later_session)
|
|
|
|
user = FactoryGirl.create(:user)
|
|
|
|
#ActiveRecord::Base.logger = Logger.new(STDOUT)
|
|
music_sessions = ActiveMusicSession.index(user)
|
|
music_sessions.length.should == 2
|
|
music_sessions.first.id.should == later_session.id
|
|
end
|
|
|
|
it "orders sessions with inviteds first, even if created first" do
|
|
creator1 = FactoryGirl.create(:user)
|
|
creator2 = FactoryGirl.create(:user)
|
|
|
|
earlier_session = FactoryGirl.create(:active_music_session, :creator => creator1, :description => "Earlier Session")
|
|
FactoryGirl.create(:connection, :user => creator1, :music_session => earlier_session)
|
|
later_session = FactoryGirl.create(:active_music_session, :creator => creator2, :description => "Later Session")
|
|
FactoryGirl.create(:connection, :user => creator2, :music_session => later_session)
|
|
user = FactoryGirl.create(:user)
|
|
FactoryGirl.create(:connection, :user => creator1, :music_session => earlier_session)
|
|
FactoryGirl.create(:friendship, :user => creator1, :friend => user)
|
|
FactoryGirl.create(:friendship, :user => user, :friend => creator1)
|
|
FactoryGirl.create(:invitation, :sender => creator1, :receiver => user, :music_session => earlier_session.music_session)
|
|
|
|
music_sessions = ActiveMusicSession.index(user)
|
|
music_sessions.length.should == 2
|
|
music_sessions.first.id.should == earlier_session.id
|
|
end
|
|
|
|
|
|
it "orders sessions with friends in the session first, even if created first" do
|
|
|
|
creator1 = FactoryGirl.create(:user)
|
|
creator2 = FactoryGirl.create(:user)
|
|
earlier_session = FactoryGirl.create(:active_music_session, :creator => creator1, :description => "Earlier Session")
|
|
FactoryGirl.create(:connection, :user => creator1, :music_session => earlier_session)
|
|
later_session = FactoryGirl.create(:active_music_session, :creator => creator2, :description => "Later Session")
|
|
FactoryGirl.create(:connection, :user => creator2, :music_session => later_session)
|
|
|
|
user = FactoryGirl.create(:user)
|
|
FactoryGirl.create(:friendship, :user => creator1, :friend => user)
|
|
FactoryGirl.create(:friendship, :user => user, :friend => creator1)
|
|
FactoryGirl.create(:connection, :user => creator1, :music_session => earlier_session)
|
|
FactoryGirl.create(:connection, :user => creator2, :music_session => earlier_session)
|
|
|
|
music_sessions = ActiveMusicSession.index(user)
|
|
music_sessions.length.should == 2
|
|
music_sessions.first.id.should == earlier_session.id
|
|
end
|
|
|
|
it "doesn't list a session if musician_access is set to false" do
|
|
creator = FactoryGirl.create(:user)
|
|
session = FactoryGirl.create(:active_music_session, :creator => creator, :description => "Session", :musician_access => false)
|
|
user = FactoryGirl.create(:user)
|
|
|
|
music_sessions = ActiveMusicSession.index(user)
|
|
music_sessions.length.should == 0
|
|
end
|
|
|
|
it "does list a session if musician_access is set to false but user was invited" do
|
|
creator = FactoryGirl.create(:user)
|
|
session = FactoryGirl.create(:active_music_session, :creator => creator, :description => "Session", :musician_access => false)
|
|
user = FactoryGirl.create(:user)
|
|
FactoryGirl.create(:connection, :user => creator, :music_session => session)
|
|
FactoryGirl.create(:friendship, :user => creator, :friend => user)
|
|
FactoryGirl.create(:friendship, :user => user, :friend => creator)
|
|
FactoryGirl.create(:invitation, :sender => creator, :receiver => user, :music_session => session.music_session)
|
|
|
|
music_sessions = ActiveMusicSession.index(user)
|
|
music_sessions.length.should == 1
|
|
end
|
|
|
|
it "lists a session if the genre matches" do
|
|
creator = FactoryGirl.create(:user)
|
|
genre = FactoryGirl.create(:genre)
|
|
session = FactoryGirl.create(:active_music_session, :creator => creator, :description => "Session", :genre => genre)
|
|
FactoryGirl.create(:connection, :user => creator, :music_session => session)
|
|
user = FactoryGirl.create(:user)
|
|
|
|
music_sessions = ActiveMusicSession.index(user, genres: [genre.id])
|
|
music_sessions.length.should == 1
|
|
end
|
|
|
|
it "does not list a session if the genre fails to match" do
|
|
creator = FactoryGirl.create(:user)
|
|
genre1 = FactoryGirl.create(:genre)
|
|
genre2 = FactoryGirl.create(:genre)
|
|
session = FactoryGirl.create(:active_music_session, :creator => creator, :description => "Session", :genre => genre1)
|
|
user = FactoryGirl.create(:user)
|
|
|
|
music_sessions = ActiveMusicSession.index(user, genres: [genre2.id])
|
|
music_sessions.length.should == 0
|
|
end
|
|
|
|
it "does not list a session if friends_only is set and no friends are in it" do
|
|
creator = FactoryGirl.create(:user)
|
|
session = FactoryGirl.create(:active_music_session, :creator => creator, :description => "Session")
|
|
user = FactoryGirl.create(:user)
|
|
|
|
music_sessions = ActiveMusicSession.index(user, friends_only: true)
|
|
music_sessions.length.should == 0
|
|
end
|
|
|
|
it "lists a session properly if a friend is in it" do
|
|
creator = FactoryGirl.create(:user)
|
|
session = FactoryGirl.create(:active_music_session, :creator => creator, :description => "Session")
|
|
user = FactoryGirl.create(:user)
|
|
FactoryGirl.create(:friendship, :user => creator, :friend => user)
|
|
FactoryGirl.create(:friendship, :user => user, :friend => creator)
|
|
FactoryGirl.create(:connection, :user => creator, :music_session => session)
|
|
|
|
music_sessions = ActiveMusicSession.index(user)
|
|
music_sessions.length.should == 1
|
|
music_sessions = ActiveMusicSession.index(user, friends_only: true)
|
|
music_sessions.length.should == 1
|
|
music_sessions = ActiveMusicSession.index(user, friends_only: false, my_bands_only: true)
|
|
music_sessions.length.should == 0
|
|
music_sessions = ActiveMusicSession.index(user, friends_only: true, my_bands_only: true)
|
|
music_sessions.length.should == 1
|
|
end
|
|
|
|
it "does not list a session if it has no participants" do
|
|
# it's a design goal that there should be no sessions with 0 connections;
|
|
# however, this bug continually crops up so the .index method will protect against this common bug
|
|
|
|
creator = FactoryGirl.create(:user)
|
|
session = FactoryGirl.create(:active_music_session, :creator => creator, :description => "Session")
|
|
session.connections.delete_all # should leave a bogus, 0 participant session around
|
|
|
|
music_sessions = ActiveMusicSession.index(creator)
|
|
music_sessions.length.should == 0
|
|
|
|
end
|
|
|
|
it "does not list a session if my_bands_only is set and it's not my band" do
|
|
creator = FactoryGirl.create(:user)
|
|
session = FactoryGirl.create(:active_music_session, :creator => creator, :description => "Session")
|
|
user = FactoryGirl.create(:user)
|
|
|
|
music_sessions = ActiveMusicSession.index(user, friends_only: false, my_bands_only: true)
|
|
music_sessions.length.should == 0
|
|
end
|
|
|
|
it "lists a session properly if it's my band's session" do
|
|
band = FactoryGirl.create(:band)
|
|
creator = FactoryGirl.create(:user)
|
|
session = FactoryGirl.create(:active_music_session, :creator => creator, :description => "Session", :band => band)
|
|
FactoryGirl.create(:connection, :user => creator, :music_session => session)
|
|
user = FactoryGirl.create(:user)
|
|
FactoryGirl.create(:band_musician, :band => band, :user => creator)
|
|
FactoryGirl.create(:band_musician, :band => band, :user => user)
|
|
|
|
music_sessions = ActiveMusicSession.index(user)
|
|
music_sessions.length.should == 1
|
|
music_sessions = ActiveMusicSession.index(user, friends_only: true)
|
|
music_sessions.length.should == 0
|
|
music_sessions = ActiveMusicSession.index(user, friends_only: false, my_bands_only: true)
|
|
music_sessions.length.should == 1
|
|
music_sessions = ActiveMusicSession.index(user, friends_only: true, my_bands_only: true)
|
|
music_sessions.length.should == 1
|
|
end
|
|
|
|
describe "index(as_musician: false)" do
|
|
let(:fan_access) { true }
|
|
let(:creator) { FactoryGirl.create(:user) }
|
|
let(:session) { FactoryGirl.create(:active_music_session, creator: creator, fan_access: fan_access ) }
|
|
let(:connection) { FactoryGirl.create(:connection, user: creator, :music_session => session) }
|
|
|
|
let(:user) {FactoryGirl.create(:user) }
|
|
|
|
describe "no mount" do
|
|
|
|
before(:each) do
|
|
session.mount.should be_nil
|
|
end
|
|
|
|
it "no session listed if mount is nil" do
|
|
connection.touch
|
|
sessions = ActiveMusicSession.index(user, as_musician: false)
|
|
sessions.length.should == 0
|
|
end
|
|
end
|
|
|
|
describe "with mount" do
|
|
let(:session_with_mount) { FactoryGirl.create(:active_music_session_with_mount) }
|
|
let(:connection_with_mount) { FactoryGirl.create(:connection, user: creator, :music_session => session_with_mount) }
|
|
|
|
|
|
before(:each) {
|
|
session_with_mount.mount.should_not be_nil
|
|
}
|
|
|
|
it "no session listed if icecast_server config hasn't been updated" do
|
|
connection_with_mount.touch
|
|
sessions = ActiveMusicSession.index(user, as_musician: false)
|
|
sessions.length.should == 0
|
|
end
|
|
|
|
it "session listed if icecast_server config has been updated" do
|
|
connection_with_mount.touch
|
|
session_with_mount.created_at = 2.minutes.ago
|
|
session_with_mount.save!(:validate => false)
|
|
session_with_mount.mount.server.config_updated_at = 1.minute.ago
|
|
session_with_mount.mount.server.save!(:validate => false)
|
|
sessions = ActiveMusicSession.index(user, as_musician: false)
|
|
sessions.length.should == 1
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
describe "nindex" do
|
|
it "nindex orders two sessions by created_at starting with most recent" do
|
|
creator = FactoryGirl.create(:user)
|
|
creator2 = FactoryGirl.create(:user)
|
|
|
|
earlier_session = FactoryGirl.create(:active_music_session, :creator => creator, :description => "Earlier Session")
|
|
c1 = FactoryGirl.create(:connection, user: creator, music_session: earlier_session, addr: 0x01020304, locidispid: 1)
|
|
|
|
later_session = FactoryGirl.create(:active_music_session, :creator => creator2, :description => "Later Session")
|
|
c2 = FactoryGirl.create(:connection, user: creator2, music_session: later_session, addr: 0x21020304, locidispid: 2)
|
|
|
|
user = FactoryGirl.create(:user)
|
|
c3 = FactoryGirl.create(:connection, user: user, locidispid: 3)
|
|
|
|
Score.createx(c1.locidispid, c1.client_id, c1.addr, c3.locidispid, c3.client_id, c3.addr, 20, nil);
|
|
Score.createx(c2.locidispid, c2.client_id, c2.addr, c3.locidispid, c3.client_id, c3.addr, 30, nil);
|
|
|
|
# scores!
|
|
|
|
#ActiveRecord::Base.logger = Logger.new(STDOUT)
|
|
music_sessions = ActiveMusicSession.nindex(user, client_id: c3.client_id).take(100)
|
|
#music_sessions = MusicSession.index(user).take(100)
|
|
#ActiveRecord::Base.logger = nil
|
|
|
|
music_sessions.length.should == 2
|
|
music_sessions[0].id.should == later_session.id
|
|
music_sessions[1].id.should == earlier_session.id
|
|
end
|
|
end
|
|
|
|
|
|
it 'uninvited users cant join approval-required sessions without invitation' do
|
|
user1 = FactoryGirl.create(:user) # in the jam session
|
|
user2 = FactoryGirl.create(:user) # in the jam session
|
|
|
|
music_session = FactoryGirl.create(:active_music_session, :creator => user1, :musician_access => true, :approval_required => true)
|
|
|
|
connection1 = FactoryGirl.create(:connection, :user => user1, :music_session => music_session)
|
|
expect { FactoryGirl.create(:connection, :user => user2, :music_session => music_session, :joining_session => true) }.to raise_error(ActiveRecord::RecordInvalid)
|
|
|
|
end
|
|
|
|
|
|
it "is_recording? returns false if not recording" do
|
|
user1 = FactoryGirl.create(:user)
|
|
music_session = FactoryGirl.build(:active_music_session, :creator => user1)
|
|
music_session.is_recording?.should be_false
|
|
end
|
|
|
|
describe "recordings" do
|
|
|
|
before(:each) do
|
|
@user1 = FactoryGirl.create(:user)
|
|
@connection = FactoryGirl.create(:connection, :user => @user1)
|
|
@instrument = FactoryGirl.create(:instrument, :description => 'a great instrument')
|
|
@track = FactoryGirl.create(:track, :connection => @connection, :instrument => @instrument)
|
|
@music_session = FactoryGirl.create(:active_music_session, :creator => @user1, :musician_access => true)
|
|
# @music_session.connections << @connection
|
|
@music_session.save!
|
|
@connection.join_the_session(@music_session, true, nil)
|
|
end
|
|
|
|
describe "not recording" do
|
|
it "stop_recording should return nil if not recording" do
|
|
@music_session.stop_recording.should be_nil
|
|
end
|
|
end
|
|
|
|
describe "currently recording" do
|
|
before(:each) do
|
|
@recording = FactoryGirl.create(:recording, :music_session => @music_session, :owner => @user1)
|
|
end
|
|
|
|
it "is_recording? returns true if recording" do
|
|
@music_session.is_recording?.should be_true
|
|
end
|
|
|
|
it "stop_recording should return recording object if recording" do
|
|
@music_session.stop_recording.should == @recording
|
|
end
|
|
end
|
|
|
|
describe "claim a recording" do
|
|
|
|
before(:each) do
|
|
@recording = Recording.start(@music_session, @user1)
|
|
@recording.errors.any?.should be_false
|
|
@recording.stop
|
|
@recording.reload
|
|
@claimed_recording = @recording.claim(@user1, "name", "description", Genre.first, true)
|
|
@claimed_recording.errors.any?.should be_false
|
|
end
|
|
|
|
it "allow a claimed recording to be associated" do
|
|
@music_session.claimed_recording_start(@user1, @claimed_recording)
|
|
@music_session.errors.any?.should be_false
|
|
@music_session.reload
|
|
@music_session.claimed_recording.should == @claimed_recording
|
|
@music_session.claimed_recording_initiator.should == @user1
|
|
end
|
|
|
|
it "allow a claimed recording to be removed" do
|
|
@music_session.claimed_recording_start(@user1, @claimed_recording)
|
|
@music_session.errors.any?.should be_false
|
|
@music_session.claimed_recording_stop
|
|
@music_session.errors.any?.should be_false
|
|
@music_session.reload
|
|
@music_session.claimed_recording.should be_nil
|
|
@music_session.claimed_recording_initiator.should be_nil
|
|
end
|
|
|
|
it "disallow a claimed recording to be started when already started by someone else" do
|
|
@user2 = FactoryGirl.create(:user)
|
|
@music_session.claimed_recording_start(@user1, @claimed_recording)
|
|
@music_session.errors.any?.should be_false
|
|
@music_session.claimed_recording_start(@user2, @claimed_recording)
|
|
@music_session.errors.any?.should be_true
|
|
@music_session.errors[:claimed_recording] == [ValidationMessages::CLAIMED_RECORDING_ALREADY_IN_PROGRESS]
|
|
end
|
|
|
|
it "allow a claimed recording to be started when already started by self" do
|
|
@user2 = FactoryGirl.create(:user)
|
|
@claimed_recording2 = @recording.claim(@user1, "name", "description", Genre.first, true)
|
|
@music_session.claimed_recording_start(@user1, @claimed_recording)
|
|
@music_session.errors.any?.should be_false
|
|
@music_session.claimed_recording_start(@user1, @claimed_recording2)
|
|
@music_session.errors.any?.should be_false
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "get_connection_ids" do
|
|
before(:each) do
|
|
@user1 = FactoryGirl.create(:user)
|
|
@user2 = FactoryGirl.create(:user)
|
|
@music_session = FactoryGirl.create(:active_music_session, :creator => @user1, :musician_access => true)
|
|
@connection1 = FactoryGirl.create(:connection, :user => @user1, :music_session => @music_session, :as_musician => true)
|
|
@connection2 = FactoryGirl.create(:connection, :user => @user2, :music_session => @music_session, :as_musician => false)
|
|
|
|
end
|
|
|
|
it "get all connections" do
|
|
@music_session.get_connection_ids().should == [@connection1.client_id, @connection2.client_id]
|
|
end
|
|
|
|
it "exclude non-musicians" do
|
|
@music_session.get_connection_ids(as_musician: true).should == [@connection1.client_id]
|
|
end
|
|
|
|
it "exclude musicians" do
|
|
@music_session.get_connection_ids(as_musician: false).should == [@connection2.client_id]
|
|
end
|
|
|
|
it "exclude particular client" do
|
|
@music_session.get_connection_ids(exclude_client_id: @connection1.client_id).should == [@connection2.client_id]
|
|
end
|
|
|
|
it "exclude particular client and exclude non-musicians" do
|
|
@music_session.get_connection_ids(exclude_client_id: @connection2.client_id, as_musician: true).should == [@connection1.client_id]
|
|
end
|
|
end
|
|
end
|
|
|