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

context "The Users controller" do
  fixtures :users
  controller_name :users
  
  specify "should be an UsersController" do
    controller.should_be_an_instance_of UsersController
  end
  
  specify "should allow signup" do
    lambda do 
      controller.should_redirect_to 'http://test.host/'
      create_user
    end.should_change(User,:count).by(1)
  end

  specify "should require login on signup" do
    create_user :login => nil 
    response.should_be_success
    assigns(:user).should_have_at_least(1).errors_on(:login)
  end

  specify "should require password on signup" do
    create_user :password => nil 
    response.should_be_success
    assigns(:user).should_have_at_least(1).errors_on(:password)
  end

  specify "should require password confirmation on signup" do
    create_user :password_confirmation => nil 
    response.should_be_success
    assigns(:user).should_have_at_least(1).errors_on(:password_confirmation)
  end

  specify "should require email on signup" do
    create_user :email => nil 
    response.should_be_success
    assigns(:user).should_have_at_least(1).errors_on(:email)
  end

  specify "should enable user on activate with valid activation code" do
    lambda do
      users(:aaron).should_not_be_activated
      controller.should_redirect_to 'http://test.host/'
      get :activate, :activation_code => users(:aaron).activation_code
      flash[:notice].should_not_be_empty
      users(:aaron).reload
      users(:aaron).should_be_activated
    end.should_not_change(User,:count)
  end
  
  specify "should not enable user on activate with invalid activation code" do
    lambda do
      users(:aaron).should_not_be_activated
      controller.should_redirect_to 'http://test.host/'
      get :activate, :activation_code => 'bad_activation_code'
      flash[:notice].should_be_nil
      users(:aaron).should_not_be_activated
    end.should_not_change(User,:count)
  end
  
  protected

  def create_user(options = {})
    post :create, :user => { :login => 'quire', :email => 'quire@example.com', :password => 'quire', :password_confirmation => 'quire' }.merge(options)
  end
end
