From 8e7de0e4dc54e7d1c7fdd5cd2acb43de139e2c95 Mon Sep 17 00:00:00 2001 From: Rodrigo Souto Date: Tue, 15 May 2012 16:40:15 -0300 Subject: [PATCH] [stoa] Making invitation works only once --- plugins/stoa/lib/ext/person.rb | 7 ++++++- plugins/stoa/test/unit/person.rb | 17 +++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/plugins/stoa/lib/ext/person.rb b/plugins/stoa/lib/ext/person.rb index d8aacb2..49c1ed5 100644 --- a/plugins/stoa/lib/ext/person.rb +++ b/plugins/stoa/lib/ext/person.rb @@ -6,8 +6,13 @@ class Person validate :usp_id_or_invitation, :if => lambda { |person| person.environment && person.environment.plugin_enabled?(StoaPlugin)} def usp_id_or_invitation - if usp_id.blank? && (invitation_code.blank? || !Task.pending.find(:first, :conditions => {:code => invitation_code})) + if usp_id.blank? && (invitation_code.blank? || !invitation_task) errors.add(:usp_id, "can't register without usp_id or invitation") end end + + def invitation_task + Task.pending.find(:first, :conditions => {:code => invitation_code}) || + Task.finished.find(:first, :conditions => {:code => invitation_code, :target_id => id}) + end end diff --git a/plugins/stoa/test/unit/person.rb b/plugins/stoa/test/unit/person.rb index a395e08..9f87d78 100644 --- a/plugins/stoa/test/unit/person.rb +++ b/plugins/stoa/test/unit/person.rb @@ -39,8 +39,8 @@ class StoaPlugin::Person < ActiveSupport::TestCase assert !person.errors.invalid?(:usp_id) end - should 'not allow person register with a finished task' do - t = Task.create!(:code => 87654321) + should 'not allow person to be saved with a finished invitation that is not his own' do + t = Task.create!(:code => 87654321, :target_id => 1) t.finish person = Person.new(:environment => environment, :invitation_code => 87654321) person.valid? @@ -48,5 +48,18 @@ class StoaPlugin::Person < ActiveSupport::TestCase assert person.errors.invalid?(:usp_id) end + should 'allow person to be saved with a finished invitation if it is his own' do + t = Task.create!(:code => 87654321) + user = User.new(:login => 'some-person', :email => 'some-person@example.com', :password => 'test', :password_confirmation => 'test', :person_data => {:environment => environment, :invitation_code => 87654321}) + user.save! + person = user.person + t.target_id = person.id + t.finish + + person.valid? + assert !person.errors.invalid?(:usp_id) + end + + end -- libgit2 0.21.2