require File.dirname(__FILE__) + '/../spec_helper'
def login_as(user)
request.session[:user] = user ? users(user).id : nil
end
def create_user(options = {})
post :signup, :user => { :login => 'quire', :email => 'quire@example.com',
:password => 'quire', :password_confirmation => 'quire' }.merge(options)
end
def auth_token(token)
CGI::Cookie.new('name' => 'auth_token', 'value' => token)
end
def cookie_for(user)
auth_token users(user).remember_token
end
context "The AccountController" do
fixtures :users
controller_name :account
specify "should be a AccountController" do
controller.should_be_an_instance_of AccountController
end
specify "should redirect after successful login" do
post :login, :login => 'quentin', :password => 'test'
session[:user].should_not_be_nil
response.should_be_redirect
end
specify "should not redirect after failed login" do
post :login, :login => 'quentin', :password => 'bad password'
session[:user].should_be_nil
response.should_be_success
end
specify "should allow signup" do
expected_users = User.count + 1
create_user
response.should_be_redirect
User.count.should == expected_users
end
specify "should require login on signup" do
expected_users = User.count
create_user(:login => nil)
assigns(:user).errors.on(:login).should_not_be_nil
response.should_be_success
end
specify "should require password on signup" do
expected_users = User.count
create_user(:password => nil)
assigns(:user).errors.on(:password).should_not_be_nil
response.should_be_success
end
specify "should require password confirmation on signup" do
expected_users = User.count
create_user(:password_confirmation => nil)
assigns(:user).errors.on(:password_confirmation).should_not_be_nil
response.should_be_success
end
specify "should require email on signup" do
expected_users = User.count
create_user(:email => nil)
assigns(:user).errors.on(:email).should_not_be_nil
response.should_be_success
end
specify "should log out when requested" do
login_as :quentin
get :logout
session[:user].should_not_be_nil
response.should_be_redirect
end
specify "should remember me" do
post :login, :login => 'quentin', :password => 'test', :remember_me => '1'
response.cookies["auth_token"].should_not_be_nil
end
specify "should not remember me" do
post :login, :login => 'quentin', :password => 'test', :remember_me => '0'
response.cookies["auth_token"].should_be_nil
end
specify "should delete auth token on logout" do
login_as :quentin
get :logout
response.cookies["auth_token"].should == []
end
specify "should login with cookie" do
users(:quentin).remember_me
request.cookies["auth_token"] = cookie_for(:quentin)
get :index
controller.should.satisfy {|c| c.send(:logged_in?)}
end
specify "should fail to login with expired cookie" do
users(:quentin).remember_me
users(:quentin).update_attribute :remember_token_expires_at, 15.minutes.ago
request.cookies["auth_token"] = cookie_for(:quentin)
get :index
controller.should_not.satisfy {|c| c.send(:logged_in?)}
end
specify "should fail to login with invalid cookie" do
users(:quentin).remember_me
request.cookies["auth_token"] = auth_token('invalid_auth_token')
get :index
controller.should_not.satisfy {|c| c.send(:logged_in?)}
end
end