requests are made on invite but perhaps they should be made on signup so that we have a person
This commit is contained in:
parent
4341b85a12
commit
4a7c4e0848
4 changed files with 63 additions and 23 deletions
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
Loading…
Reference in a new issue