jam-cloud/ruby/spec/jam_ruby/models/music_session_spec.rb

485 lines
21 KiB
Ruby
Raw Normal View History

require 'spec_helper'
describe MusicSession do
2012-11-02 06:51:52 +00:00
before(:each) do
MusicSession.delete_all
end
it 'can grant access to valid user' do
2012-11-02 06:51:52 +00:00
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
2012-11-02 06:51:52 +00:00
music_session = FactoryGirl.create(: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
2012-11-02 06:51:52 +00:00
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(:music_session, :creator => user1, :musician_access => true)
2012-11-18 03:41:12 +00:00
music_session.can_join?(user1, true).should == true
music_session.can_join?(user2, true).should == true
music_session.can_join?(user3, true).should == true
2012-11-02 06:51:52 +00:00
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(:music_session, :creator => user1, :musician_access => false)
FactoryGirl.create(:connection, :user => user1, :music_session => music_session)
2012-11-18 03:41:12 +00:00
music_session.can_join?(user1, true).should == true
music_session.can_join?(user2, true).should == false
music_session.can_join?(user3, true).should == false
2012-11-02 06:51:52 +00:00
# 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)
2012-11-18 03:41:12 +00:00
music_session.can_join?(user1, true).should == true
music_session.can_join?(user2, true).should == true
music_session.can_join?(user3, true).should == false
2012-11-02 06:51:52 +00:00
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(:music_session, :creator => user1, :musician_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.can_see?(user1).should == true
music_session.can_see?(user2).should == true
music_session.can_see?(user3).should == false
end
2012-12-04 02:12:56 +00:00
it "orders two sessions by created_at starting with most recent" do
creator = FactoryGirl.create(:user)
creator2 = FactoryGirl.create(:user)
2012-12-04 02:12:56 +00:00
earlier_session = FactoryGirl.create(:music_session, :creator => creator, :description => "Earlier Session")
FactoryGirl.create(:connection, :user => creator, :music_session => earlier_session)
later_session = FactoryGirl.create(:music_session, :creator => creator2, :description => "Later Session")
FactoryGirl.create(:connection, :user => creator2, :music_session => later_session)
2012-12-04 02:12:56 +00:00
user = FactoryGirl.create(:user)
2012-12-06 01:56:12 +00:00
#ActiveRecord::Base.logger = Logger.new(STDOUT)
2012-12-04 02:12:56 +00:00
music_sessions = MusicSession.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(:music_session, :creator => creator1, :description => "Earlier Session")
FactoryGirl.create(:connection, :user => creator1, :music_session => earlier_session)
later_session = FactoryGirl.create(: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_sessions = MusicSession.index(user)
music_sessions.length.should == 2
music_sessions.first.id.should == earlier_session.id
end
2012-12-04 02:12:56 +00:00
2012-12-05 19:10:58 +00:00
it "orders sessions with friends in the session first, even if created first" do
2012-12-04 02:12:56 +00:00
creator1 = FactoryGirl.create(:user)
creator2 = FactoryGirl.create(:user)
earlier_session = FactoryGirl.create(:music_session, :creator => creator1, :description => "Earlier Session")
FactoryGirl.create(:connection, :user => creator1, :music_session => earlier_session)
2012-12-04 02:12:56 +00:00
later_session = FactoryGirl.create(:music_session, :creator => creator2, :description => "Later Session")
FactoryGirl.create(:connection, :user => creator2, :music_session => later_session)
2012-12-04 02:12:56 +00:00
user = FactoryGirl.create(:user)
FactoryGirl.create(:friendship, :user => creator1, :friend => user)
FactoryGirl.create(:friendship, :user => user, :friend => creator1)
2012-12-05 19:10:58 +00:00
FactoryGirl.create(:connection, :user => creator1, :music_session => earlier_session)
FactoryGirl.create(:connection, :user => creator2, :music_session => earlier_session)
2012-12-04 02:12:56 +00:00
music_sessions = MusicSession.index(user)
music_sessions.length.should == 2
music_sessions.first.id.should == earlier_session.id
2012-12-05 19:10:58 +00:00
end
it "doesn't list a session if musician_access is set to false" do
creator = FactoryGirl.create(:user)
session = FactoryGirl.create(:music_session, :creator => creator, :description => "Session", :musician_access => false)
user = FactoryGirl.create(:user)
music_sessions = MusicSession.index(user)
music_sessions.length.should == 0
2012-12-04 02:12:56 +00:00
end
2012-12-05 19:10:58 +00:00
it "does list a session if musician_access is set to false but user was invited" do
creator = FactoryGirl.create(:user)
session = FactoryGirl.create(: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_sessions = MusicSession.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)
2012-12-06 01:56:12 +00:00
session = FactoryGirl.create(:music_session, :creator => creator, :description => "Session", :genres => [genre])
FactoryGirl.create(:connection, :user => creator, :music_session => session)
2012-12-05 19:10:58 +00:00
user = FactoryGirl.create(:user)
music_sessions = MusicSession.index(user, nil, [genre.id])
2012-12-05 19:10:58 +00:00
music_sessions.length.should == 1
end
2012-12-06 01:56:12 +00:00
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(:music_session, :creator => creator, :description => "Session", :genres => [genre1])
user = FactoryGirl.create(:user)
music_sessions = MusicSession.index(user, nil, [genre2.id])
2012-12-06 01:56:12 +00:00
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(:music_session, :creator => creator, :description => "Session")
user = FactoryGirl.create(:user)
music_sessions = MusicSession.index(user, nil, nil, true)
2012-12-06 01:56:12 +00:00
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(: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 = MusicSession.index(user, nil, nil)
2012-12-06 01:56:12 +00:00
music_sessions.length.should == 1
music_sessions = MusicSession.index(user, nil, nil, true)
2012-12-06 01:56:12 +00:00
music_sessions.length.should == 1
music_sessions = MusicSession.index(user, nil, nil, false, true)
2012-12-06 01:56:12 +00:00
music_sessions.length.should == 0
music_sessions = MusicSession.index(user, nil, nil, true, true)
2012-12-06 01:56:12 +00:00
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(:music_session, :creator => creator, :description => "Session")
session.connections.delete_all # should leave a bogus, 0 participant session around
music_sessions = MusicSession.index(creator, nil, nil)
music_sessions.length.should == 0
end
2012-12-06 01:56:12 +00:00
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(:music_session, :creator => creator, :description => "Session")
user = FactoryGirl.create(:user)
music_sessions = MusicSession.index(user, nil, nil, false, true)
2012-12-06 01:56:12 +00:00
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(:music_session, :creator => creator, :description => "Session", :band => band)
FactoryGirl.create(:connection, :user => creator, :music_session => session)
2012-12-06 01:56:12 +00:00
user = FactoryGirl.create(:user)
FactoryGirl.create(:band_musician, :band => band, :user => creator)
FactoryGirl.create(:band_musician, :band => band, :user => user)
music_sessions = MusicSession.index(user, nil, nil)
2012-12-06 01:56:12 +00:00
music_sessions.length.should == 1
music_sessions = MusicSession.index(user, nil, nil, true)
2012-12-06 01:56:12 +00:00
music_sessions.length.should == 0
music_sessions = MusicSession.index(user, nil, nil, false, true)
2012-12-06 01:56:12 +00:00
music_sessions.length.should == 1
music_sessions = MusicSession.index(user, nil, nil, true, true)
2012-12-06 01:56:12 +00:00
music_sessions.length.should == 1
end
2012-12-05 19:10:58 +00:00
2012-12-11 22:59:37 +00:00
it "updates the fields of a music session properly" do
genre1 = FactoryGirl.create(:genre)
genre2 = FactoryGirl.create(:genre)
genre3 = FactoryGirl.create(:genre)
genre4 = FactoryGirl.create(:genre)
creator = FactoryGirl.create(:user)
session = FactoryGirl.create(:music_session, :creator => creator, :description => "Session", :genres => [genre3,genre4])
session.update_attributes({:description => "Session2", :genre => [genre1, genre2]})
session.genres = [genre1, genre2]
session.reload
session.description.should == "Session2"
session.genres.length.should == 2
session.genres[0].id.should == genre1.id
end
2012-12-04 07:00:32 +00:00
=begin
# mslemmer:
# I'm going to clean this up into smaller tasks.
2012-11-02 06:51:52 +00:00
it 'can list sessions with appropriate sort order' do
user1 = FactoryGirl.create(:user)
user2 = FactoryGirl.create(:user)
user3 = FactoryGirl.create(:user)
user4 = FactoryGirl.create(:user)
user5 = FactoryGirl.create(:user)
music_session = FactoryGirl.create(:music_session, :creator => user1, :musician_access => false)
FactoryGirl.create(:connection, :user => user1, :music_session => music_session)
music_sessions = MusicSession.index(user2)
music_sessions.length.should == 0
music_session2 = FactoryGirl.create(:music_session, :creator => user3, :musician_access => true)
FactoryGirl.create(:connection, :user => user3, :music_session => music_session2)
music_sessions = MusicSession.index(user2)
music_sessions.length.should == 1
music_sessions[0].connections[0].user.friends.length == 0
# users 1 and 5 are friends
FactoryGirl.create(:friendship, :user => user1, :friend => user5)
FactoryGirl.create(:friendship, :user => user5, :friend => user1)
# users 1 and 2 are friends
FactoryGirl.create(:friendship, :user => user1, :friend => user2)
FactoryGirl.create(:friendship, :user => user2, :friend => user1)
# users 2 and 4 are friends
FactoryGirl.create(:friendship, :user => user2, :friend => user4)
FactoryGirl.create(:friendship, :user => user4, :friend => user2)
# user 2 should now be able to see this session, because his friend is in the session
music_sessions = MusicSession.index(user2)
music_sessions.length.should == 2
music_sessions[0].id.should == music_session.id
music_sessions[0].connections[0].user.id.should == user1.id
music_sessions[0].connections[0].user.friends.length == 1
music_sessions[1].id.should == music_session2.id
FactoryGirl.create(:invitation, :sender => user1, :receiver => user2, :music_session => music_session)
music_sessions = MusicSession.index(user2)
music_sessions.length.should == 2
music_sessions[0].id.should == music_session.id
music_sessions[1].id.should == music_session2.id
# create another, but friendy usic session with user 4
music_session3 = FactoryGirl.create(:music_session, :creator => user4, :musician_access => false, :created_at => 1.week.ago)
FactoryGirl.create(:connection, :user => user4, :music_session => music_session3)
music_sessions = MusicSession.index(user2)
music_sessions.length.should == 3
music_sessions[0].id.should == music_session.id
music_sessions[1].id.should == music_session3.id
music_sessions[2].id.should == music_session2.id
# verify we can inspect the data
music_session.invitations.length.should == 1
music_session4 = FactoryGirl.create(:music_session, :creator => user5, :musician_access => false, :created_at => 2.week.ago)
FactoryGirl.create(:connection, :user => user5, :music_session => music_session4)
music_sessions = MusicSession.index(user2)
music_sessions.length.should == 3
# make this session public now
music_session4.musician_access = true
music_session4.save
music_sessions = MusicSession.index(user2)
music_sessions.length.should == 4
music_sessions[0].id.should == music_session.id
music_sessions[1].id.should == music_session3.id
music_sessions[2].id.should == music_session2.id
music_sessions[3].id.should == music_session4.id
# ok let's make the public session that we just made, become a 'friendy' one
# make user2/5 friends
FactoryGirl.create(:friendship, :user => user2, :friend => user5)
FactoryGirl.create(:friendship, :user => user5, :friend => user2)
music_sessions = MusicSession.index(user2)
music_sessions.length.should == 4
music_sessions[0].id.should == music_session.id
music_sessions[1].id.should == music_session3.id
music_sessions[2].id.should == music_session4.id
music_sessions[3].id.should == music_session2.id
# and finally make it an invite
FactoryGirl.create(:invitation, :sender => user5, :receiver => user2, :music_session => music_session4 )
music_sessions = MusicSession.index(user2)
music_sessions.length.should == 4
music_sessions[0].id.should == music_session.id
music_sessions[1].id.should == music_session4.id
music_sessions[2].id.should == music_session3.id
music_sessions[3].id.should == music_session2.id
end
2012-12-04 07:00:32 +00:00
=end
2012-11-02 06:51:52 +00:00
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(: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 "must have legal_terms accepted" do
user1 = FactoryGirl.create(:user)
music_session = FactoryGirl.build(:music_session, :creator => user1, :legal_terms=> false)
music_session.save
music_session.valid?.should be_false
music_session.errors["legal_terms"].should == ["is not included in the list"]
end
2013-07-26 08:07:24 +00:00
it "cannot have profanity in the description" do
user1 = FactoryGirl.create(:user)
music_session = FactoryGirl.build(:music_session, :creator => user1, :legal_terms=> false, :description => "fuck you")
music_session.save
music_session.valid?.should be_false
end
it "is_recording? returns false if not recording" do
user1 = FactoryGirl.create(:user)
music_session = FactoryGirl.build(: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(:music_session, :creator => @user1, :musician_access => true)
@music_session.connections << @connection
@music_session.save
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
2014-01-05 03:47:23 +00:00
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, 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
2014-01-05 03:47:23 +00:00
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, 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
end
2013-07-26 08:07:24 +00:00