From 9ab04a7e74eafed574bff43923123621a1192f5b Mon Sep 17 00:00:00 2001 From: Seth Call Date: Fri, 26 Oct 2012 05:33:39 -0500 Subject: [PATCH] * invitatations table and model build and tested --- lib/jam_ruby.rb | 1 + lib/jam_ruby/models/friendship.rb | 4 +-- lib/jam_ruby/models/invitation.rb | 25 ++++++++++++++++ lib/jam_ruby/models/music_session.rb | 2 ++ lib/jam_ruby/models/user.rb | 9 ++++-- spec/factories.rb | 8 +++++ spec/jam_ruby/models/invitation_spec.rb | 39 +++++++++++++++++++++++++ 7 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 lib/jam_ruby/models/invitation.rb create mode 100644 spec/jam_ruby/models/invitation_spec.rb diff --git a/lib/jam_ruby.rb b/lib/jam_ruby.rb index 55d61a0ea..e13da46a6 100644 --- a/lib/jam_ruby.rb +++ b/lib/jam_ruby.rb @@ -17,6 +17,7 @@ require "jam_ruby/models/band" require "jam_ruby/models/connection" require "jam_ruby/models/friendship" require "jam_ruby/models/music_session" +require "jam_ruby/models/invitation" require "jam_ruby/models/friend_request" include Jampb diff --git a/lib/jam_ruby/models/friendship.rb b/lib/jam_ruby/models/friendship.rb index 924e01c76..e8a54f23a 100644 --- a/lib/jam_ruby/models/friendship.rb +++ b/lib/jam_ruby/models/friendship.rb @@ -3,8 +3,8 @@ module JamRuby self.primary_key = 'id' - belongs_to :user, :class_name => "JamRuby::User" - belongs_to :friend, :class_name => "JamRuby::User" + belongs_to :user, :class_name => "JamRuby::User", :foreign_key => "user_id", :inverse_of => :inverse_friendships + belongs_to :friend, :class_name => "JamRuby::User", :foreign_key => "friend_id", :inverse_of => :friendships end end \ No newline at end of file diff --git a/lib/jam_ruby/models/invitation.rb b/lib/jam_ruby/models/invitation.rb new file mode 100644 index 000000000..e636fd418 --- /dev/null +++ b/lib/jam_ruby/models/invitation.rb @@ -0,0 +1,25 @@ +module JamRuby + class Invitation < ActiveRecord::Base + + FRIENDSHIP_REQUIRED_VALIDATION_ERROR = "You can only invite friends" + + self.primary_key = 'id' + belongs_to :sender, :inverse_of => :sent_invitations, :class_name => "JamRuby::User", :foreign_key => "sender_id" + belongs_to :receiver, :inverse_of => :received_invitations, :class_name => "JamRuby::User", :foreign_key => "receiver_id" + belongs_to :music_session, :inverse_of => :invitations, :class_name => "JamRuby::MusicSession" + + validates :sender, :presence => true + validates :receiver, :presence => true + validates :music_session, :presence => true + + validate :require_are_friends + + private + + def require_are_friends + unless receiver.friends.exists? sender + errors.add(:receiver, FRIENDSHIP_REQUIRED_VALIDATION_ERROR) + end + end + end +end diff --git a/lib/jam_ruby/models/music_session.rb b/lib/jam_ruby/models/music_session.rb index 07bcf28f4..af65a24f8 100644 --- a/lib/jam_ruby/models/music_session.rb +++ b/lib/jam_ruby/models/music_session.rb @@ -8,6 +8,8 @@ module JamRuby has_many :users, :through => :connections, :class_name => "JamRuby::User" has_and_belongs_to_many :genres, :class_name => "::JamRuby::Genre", :join_table => "genres_music_sessions" + has_many :invitations, :foreign_key => "music_session_id", :inverse_of => :music_session, :class_name => "JamRuby::Invitation" + after_save :require_at_least_one_genre, :limit_to_three_genres # Verifies that the specified user can join this jam session diff --git a/lib/jam_ruby/models/user.rb b/lib/jam_ruby/models/user.rb index 38b796d3c..ae4e448a4 100644 --- a/lib/jam_ruby/models/user.rb +++ b/lib/jam_ruby/models/user.rb @@ -13,14 +13,17 @@ module JamRuby has_many :friend_requests, :class_name => "JamRuby::FriendRequest" - has_many :friendships, :class_name => "JamRuby::Friendship" - has_many :friends, :through => :friendships, :class_name => "JamRuby::Friend" + has_many :friendships, :class_name => "JamRuby::Friendship", :foreign_key => "user_id" + has_many :friends, :through => :friendships, :class_name => "JamRuby::User" has_many :inverse_friendships, :class_name => "JamRuby::Friendship", :foreign_key => "friend_id" - has_many :inverse_friends, :through => :inverse_friendships, :source => :user, :class_name => "JamRuby::Friend" + has_many :inverse_friends, :through => :inverse_friendships, :source => :user, :class_name => "JamRuby::User" has_many :music_session_clients, :class_name => "JamRuby::MusicSessionClient" has_many :created_music_sessions, :foreign_key => "user_id", :inverse_of => :user, :class_name => "JamRuby::MusicSession" # sessions *created* by the user has_many :music_sessions, :through => :music_session_clients, :class_name => "JamRuby::MusicSession" + + has_many :received_invitations, :foreign_key => "receiver_id", :inverse_of => :receiver, :class_name => "JamRuby::Invitation" + has_many :sent_invitations, :foreign_key => "sender_id", :inverse_of => :sender, :class_name => "JamRuby::Invitation" has_secure_password diff --git a/spec/factories.rb b/spec/factories.rb index 75e7f1be2..c30720f96 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -17,4 +17,12 @@ FactoryGirl.define do factory :connection, :class => JamRuby::Connection do end + + factory :invitation, :class => JamRuby::Invitation do + + end + + factory :friendship, :class => JamRuby::Friendship do + + end end \ No newline at end of file diff --git a/spec/jam_ruby/models/invitation_spec.rb b/spec/jam_ruby/models/invitation_spec.rb new file mode 100644 index 000000000..0a6721a97 --- /dev/null +++ b/spec/jam_ruby/models/invitation_spec.rb @@ -0,0 +1,39 @@ +require 'spec_helper' + +describe MusicSession do + + it 'cant create invitation to non-friend' 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) + + music_session_member1 = FactoryGirl.create(:connection, :user => user1, :music_session => music_session, :ip_address => "1.1.1.1", :client_id => "1") + music_session_member2 = FactoryGirl.create(:connection, :user => user2, :music_session => music_session, :ip_address => "2.2.2.2", :client_id => "2") + + invitation = Invitation.new(:sender => user1, :receiver => user2, :music_session => music_session) + + invitation.save.should == false + invitation.errors.size.should == 1 + invitation.errors.get(:receiver).should == [Invitation::FRIENDSHIP_REQUIRED_VALIDATION_ERROR] + end + + it 'can create invitation to friend' 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) + + music_session_member1 = FactoryGirl.create(:connection, :user => user1, :music_session => music_session, :ip_address => "1.1.1.1", :client_id => "1") + music_session_member2 = FactoryGirl.create(:connection, :user => user2, :music_session => music_session, :ip_address => "2.2.2.2", :client_id => "2") + + FactoryGirl.create(:friendship, :user => user1, :friend => user2) + FactoryGirl.create(:friendship, :user => user2, :friend => user1) + + invitation = Invitation.new(:sender => user1, :receiver => user2, :music_session => music_session) + + invitation.save.should == true + end +end