diff options
| -rw-r--r-- | app/models/account.rb | 26 | ||||
| -rw-r--r-- | test/unit/account_test.rb | 11 | 
2 files changed, 26 insertions, 11 deletions
| diff --git a/app/models/account.rb b/app/models/account.rb index 4442a68..4db69e8 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -34,31 +34,25 @@ class Account      user.save      # this is not very atomic, but we do the best we can: -    if !user.is_tmp? && user.persisted? +    return user unless user.persisted? +    if !user.is_tmp?        identity = user.identity        identity.user_id = user.id        identity.save        identity.errors.each do |attr, msg|          user.errors.add(attr, msg)        end -      if user.invite_required? -        user_invite_code = InviteCode.find_by_invite_code user.invite_code -        if user.is_test? && user_invite_code.max_uses == 1 -          user_invite_code.destroy -        else -          user_invite_code.invite_count += 1 -          user_invite_code.save -        end -      end      end +    consume_invite_code_for_user(user) if user.invite_required? +    return user    rescue VALIDATION_FAILED => ex      user.errors.add(:base, ex.to_s) if user +    return user    ensure      if creation_problem?(user, identity)        user.destroy     if user     && user.persisted?        identity.destroy if identity && identity.persisted?      end -    return user    end    def update(attrs) @@ -113,6 +107,16 @@ class Account    protected +  def self.consume_invite_code_for_user(user) +    invite_code = InviteCode.find_by_invite_code user.invite_code +    if user.is_test? && invite_code.max_uses == 1 +      invite_code.destroy +    else +      invite_code.invite_count += 1 +      invite_code.save +    end +  end +    def update_login(login)      return unless login.present?      @old_identity = Identity.for(@user) diff --git a/test/unit/account_test.rb b/test/unit/account_test.rb index f81764d..61b40b5 100644 --- a/test/unit/account_test.rb +++ b/test/unit/account_test.rb @@ -153,6 +153,17 @@ class AccountTest < ActiveSupport::TestCase      end    end +  test "Single use invite code is destroyed when used by tmp user" do +    with_config invite_required: true do +      attrs = user_attributes invite_code: @testcode.invite_code +      attrs[:login] = 'tmp_user_' + attrs[:login] +      user = Account.create(attrs) +      user.save +      assert user.persisted?, user.errors.inspect +      assert_nil InviteCode.find_by_invite_code user.invite_code +    end +  end +    test "Invite code stays zero when invite code is not used" do      #user = Account.create(user_attributes( :invite_code => @testcode.invite_code))      invalid_user = FactoryGirl.build(:user, :invite_code => @testcode.invite_code) | 
