From 4a7c4e0848ead659076f4aad7794a9def380f51d Mon Sep 17 00:00:00 2001 From: ilya Date: Thu, 14 Oct 2010 18:12:18 -0700 Subject: [PATCH] requests are made on invite but perhaps they should be made on signup so that we have a person --- app/models/request.rb | 1 - app/models/user.rb | 21 ++++++++++- app/views/invitations/_new.haml | 1 + spec/models/user/invite_spec.rb | 63 ++++++++++++++++++++++----------- 4 files changed, 63 insertions(+), 23 deletions(-) diff --git a/app/models/request.rb b/app/models/request.rb index d910cfaa2..a6efdc987 100644 --- a/app/models/request.rb +++ b/app/models/request.rb @@ -27,7 +27,6 @@ class Request before_validation :clean_link scope :for_user, lambda{ |user| where(:destination_url => user.person.receive_url) } - scope :from_user, lambda{ |user| where(:destination_url.ne => user.person.receive_url) } def self.instantiate(options = {}) person = options[:from] diff --git a/app/models/user.rb b/app/models/user.rb index 795d610cb..ec7107fc3 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -268,8 +268,24 @@ class User ###Invitations############ def invite_user( opts = {} ) if self.invites > 0 - invited_user = User.invite!(:email => opts[:email], :inviter => self) + + aspect_id = opts.delete(:aspect_id) + if aspect_id == nil + raise "Must invite into aspect" + elsif !(self.aspects.find_by_id(aspect_id)) + raise "Must invite to your aspect" + end + request = Request.instantiate( + :to => "http://local_request.example.com", + :from => self.person, + :into => aspect_id + ) + + invited_user = User.invite!(:email => opts[:email], :request => request, :inviter => self) + self.invites = self.invites - 1 + self.pending_requests << request + request.save self.save! invited_user else @@ -279,11 +295,14 @@ class User def self.invite!(attributes={}) inviter = attributes.delete(:inviter) + request = attributes.delete(:request) + invitable = find_or_initialize_with_error_by(:email, attributes.delete(:email)) invitable.attributes = attributes if invitable.inviters.include?(inviter) raise "You already invited this person" else + invitable.pending_requests << request invitable.inviters << inviter end diff --git a/app/views/invitations/_new.haml b/app/views/invitations/_new.haml index 208e77640..f53882567 100644 --- a/app/views/invitations/_new.haml +++ b/app/views/invitations/_new.haml @@ -4,5 +4,6 @@ %p = f.label :email = f.text_field :email + = f.hidden_field :aspect_id, :value => @aspect.id %p= f.submit "Send an invitation" /= link_to "Home", after_sign_in_path_for(resource_name) diff --git a/spec/models/user/invite_spec.rb b/spec/models/user/invite_spec.rb index 180b2d874..7190c9b23 100644 --- a/spec/models/user/invite_spec.rb +++ b/spec/models/user/invite_spec.rb @@ -6,58 +6,79 @@ require 'spec_helper' describe User do let(:inviter) {Factory.create :user} + let(:aspect) {inviter.aspect(:name => "awesome")} + let(:another_user) {Factory.create :user} + let(:wrong_aspect) {another_user.aspect(:name => "super")} let(:inviter_with_3_invites) {Factory.create :user, :invites => 3} - let!(:invited_user) { create_user_with_invitation("abc", :email => "email@example.com", :inviter => inviter)} - let(:invited_user1) { create_user_with_invitation("abc", :email => "email@example.com", :inviter => inviter_with_3_invites)} - let(:invited_user2) { create_user_with_invitation("abc", :email => "email@example.com", :inviter => inviter_with_3_invites)} - let(:invited_user3) { create_user_with_invitation("abc", :email => "email@example.com", :inviter => inviter_with_3_invites)} + let(:aspect2) {inviter_with_3_invites.aspect(:name => "Jersey Girls")} + let!(:invited_user1) { create_user_with_invitation("abc", :email => "email@example.com", :inviter => inviter)} + + before do + deliverable = Object.new + deliverable.stub!(:deliver) + ::Devise.mailer.stub!(:invitation).and_return(deliverable) + end context "creating invites" do - before do - deliverable = Object.new - deliverable.stub!(:deliver) - ::Devise.mailer.stub!(:invitation).and_return(deliverable) + + it 'requires an apect' do + proc{inviter.invite_user(:email => "maggie@example.com")}.should raise_error /Must invite into aspect/ + end + + it 'requires your aspect' do + proc{inviter.invite_user(:email => "maggie@example.com", :aspect_id => wrong_aspect.id)}.should raise_error /Must invite to your aspect/ end it 'creates a user' do + inviter lambda { - inviter.invite_user(:email => "joe@example.com") + inviter.invite_user(:email => "joe@example.com", :aspect_id => aspect.id ) }.should change(User, :count).by(1) end it 'sends email to the invited user' do ::Devise.mailer.should_receive(:invitation).once - inviter.invite_user(:email => "ian@example.com") + inviter.invite_user(:email => "ian@example.com", :aspect_id => aspect.id) end it 'adds the inviter to the invited_user' do - invited_user = inviter.invite_user(:email => "marcy@example.com") + invited_user = inviter.invite_user(:email => "marcy@example.com", :aspect_id => aspect.id) invited_user.reload invited_user.inviters.include?(inviter).should be_true end + + + it 'adds a pending request to the invited user' do + invited_user = inviter.invite_user(:email => "marcy@example.com", :aspect_id => aspect.id) + invited_user.reload + invited_user.pending_requests.find_by_callback_url(inviter.receive_url).nil?.should == false + end + + it 'adds a pending request to the inviter' do + inviter.invite_user(:email => "marcy@example.com", :aspect_id => aspect.id) + inviter.reload + inviter.pending_requests.find_by_callback_url(inviter.receive_url).nil?.should == false + end end context "limit on invites" do it 'does not invite users after 3 invites' do - User.stub!(:invite!).and_return(invited_user1,invited_user2,invited_user3) - inviter_with_3_invites.invite_user(:email => "email1@example.com") - inviter_with_3_invites.invite_user(:email => "email2@example.com") - inviter_with_3_invites.invite_user(:email => "email3@example.com") - proc{inviter_with_3_invites.invite_user(:email => "email4@example.com")}.should raise_error /You have no invites/ + inviter_with_3_invites.invite_user(:email => "email1@example.com", :aspect_id => aspect2.id) + inviter_with_3_invites.invite_user(:email => "email2@example.com", :aspect_id => aspect2.id) + inviter_with_3_invites.invite_user(:email => "email3@example.com", :aspect_id => aspect2.id) + proc{inviter_with_3_invites.invite_user(:email => "email4@example.com", :aspect_id => aspect2.id)}.should raise_error /You have no invites/ end it 'does not invite people I already invited' do - pending "this is really weird to test without the actual method working" - User.stub!(:invite!).and_return(invited_user1,invited_user1) - inviter_with_3_invites.invite_user(:email => "email1@example.com") - proc{inviter_with_3_invites.invite_user(:email => "email1@example.com")}.should raise_error /You already invited that person/ + inviter_with_3_invites.invite_user(:email => "email1@example.com", :aspect_id => aspect2.id) + proc{inviter_with_3_invites.invite_user(:email => "email1@example.com", :aspect_id => aspect2.id)}.should raise_error /You already invited this person/ end end context "the acceptance of an invitation" do it "should create the person with the passed in params" do person_count = Person.count - u = invited_user.accept_invitation!(:invitation_token => "abc", + u = invited_user1.accept_invitation!(:invitation_token => "abc", :username => "user", :password => "secret", :password_confirmation => "secret",