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

describe User do
  # Be sure to include AuthenticatedTestHelper in test/test_helper.rb instead.
  # Then, you can remove it from this and the functional test.
  include AuthenticatedTestHelper
  fixtures :users
  
  before do
    @user = nil
  end

  it 'should create user' do
    lambda {@user = create_user}.should change(User, :count).by(1)
    @user.should_not be_new_record
  end

  it 'should require login' do
    lambda {@user = create_user(:login => nil)}.should_not change(User, :count)
    @user.errors.on(:login).should_not be_nil
  end
    
  it 'should require password' do
    lambda {@user = create_user(:password => nil)}.should_not change(User, :count)
    @user.errors.on(:password).should_not be_nil
  end
     
  it 'should require password confirmation' do
    lambda {@user = create_user(:password_confirmation => nil)}.should_not change(User, :count)
    @user.errors.on(:password_confirmation).should_not be_nil
  end
  
  it 'should require password confirmation' do
    lambda {@user = create_user(:email => nil)}.should_not change(User, :count)
    @user.errors.on(:email).should_not be_nil
  end

  it 'should reset password' do
    users(:quentin).update_attributes(:password => 'new password', :password_confirmation => 'new password')
    User.authenticate('quentin', 'new password').should == users(:quentin)
  end
  
  it 'should not rehash password' do
    users(:quentin).update_attributes(:login => 'quentin2')
    User.authenticate('quentin2', 'test').should == users(:quentin)
  end
  
  it 'should authenticate user' do
    User.authenticate('quentin', 'test').should == users(:quentin)
  end
  
  it 'should set remember token' do
    users(:quentin).remember_me
    users(:quentin).remember_token.should_not be_nil
    users(:quentin).remember_token_expires_at.should_not be_nil
  end
  
  it 'should unset remember token' do
    users(:quentin).remember_me
    users(:quentin).remember_token.should_not be_nil
    users(:quentin).forget_me
    users(:quentin).remember_token.should be_nil
  end
  
  it 'should remember me for one week' do
    before = 1.week.from_now.utc
    users(:quentin).remember_me_for 1.week
    after = 1.week.from_now.utc
    users(:quentin).remember_token.should_not be_nil
    users(:quentin).remember_token_expires_at.should_not be_nil
    assert users(:quentin).remember_token_expires_at.between?(before, after)
  end
  
  it 'should remember me until one week' do
    time = 1.week.from_now.utc
    users(:quentin).remember_me_until time
    users(:quentin).remember_token.should_not be_nil
    users(:quentin).remember_token_expires_at.should_not be_nil
    users(:quentin).remember_token_expires_at.should == time
  end
  
  it 'should remember me default two weeks' do
    before = 2.weeks.from_now.utc
    users(:quentin).remember_me
    after = 2.weeks.from_now.utc
    users(:quentin).remember_token.should_not be_nil
    users(:quentin).remember_token_expires_at.should_not be_nil
    users(:quentin).remember_token_expires_at.should be_between(before, after)
  end
 
  protected
    def create_user(options = {})
      User.create({ :login => 'quire', :email => 'quire@example.com', :password => 'quire', :password_confirmation => 'quire' }.merge(options))
    end
end

