require File.dirname(__FILE__) + '/../test_helper'

class UserTest < Test::Unit::TestCase
  include Goldberg::TestHelper

  def setup
    @role = Goldberg::Role.find :first
  end
  
  def test_requires_name
    user = Goldberg::User.new
    assert(!user.valid?)
    assert(user.errors.invalid?(:name))
    assert(!user.save)
  end
  
  
  def test_name_unique
    name_1 = 'NAME1'
    name_2 = 'NAME2'
    name_1.freeze
    name_2.freeze
    
    user_1 = Goldberg::User.new(:name => name_1)
    user_1.role = @role
    user_1.clear_password = 'fred'
    user_2 = Goldberg::User.new(:name => name_2)
    user_2.role = @role
    user_2.clear_password = 'fred'
    
    assert(user_1.save)
    assert(user_2.save)
    
    user_2.name = name_1
    assert(!user_2.save)
    assert(!user_2.valid?)
    assert(user_2.errors.invalid?(:name))
  end
  
  
  def test_password_updated_on_save_when_clear_password_set
    user = Goldberg::User.new(:name => 'name')
    user.role = @role
    user.clear_password = 'fred'
    assert(user.save)
    
    saved_password = user.password
    saved_salt = user.password_salt
    
    user.clear_password = 'test123'
    assert(user.save)
    
    assert_not_equal(saved_password, user.password)
    assert_not_equal(saved_salt, user.password_salt)
    
    saved_password = user.password
    saved_salt = user.password_salt
    
    user.name = 'haha'
    assert(user.name)
    
    assert_equal(saved_password, user.password)
    assert_equal(saved_salt, user.password_salt)
  end
  
  
  def test_clear_password_set_nil_on_save
    new_pass = 'test123'
    new_pass.freeze
    
    user = Goldberg::User.new(:name => 'name')
    user.role = @role
    assert(!user.save)
    
    user.clear_password = new_pass
    assert_equal(new_pass, user.clear_password)
    assert(user.save)
    assert_nil(user.clear_password)
  end
  
  
  def test_check_password
    first_pass = 'test'
    new_pass = 'test1'    
    first_pass.freeze
    new_pass.freeze
    
    assert_not_equal(first_pass, new_pass)
    
    user = Goldberg::User.new(:name => 'user')
    user.role =  @role
    user.clear_password = first_pass
    assert(user.save)
    
    assert(user.check_password(first_pass))
    assert(!user.check_password(new_pass))
    
    user.clear_password = new_pass
    assert(user.save)
    
    assert(user.check_password(new_pass))
    assert(!user.check_password(first_pass))
  end
end