blob: 5e8fb125abc862587a4b598eae8bfbd36268e9f4 [file] [log] [blame]
require "#{File.dirname(__FILE__)}/../test_helper"
#--######################################################################
# Copyright (c) 2006 Logica
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v10.html
#
# Contributors:
#
# Onno van der Straaten:: initial implementation
#++######################################################################
# {Copyright (c) 2006 Logica}[link:files/COPYRIGHT.html]
class SetupAndSignInTest < ActionController::IntegrationTest
fixtures :users
# If there are no users:
# * all request are redirected to the new page
# * the new page can be used to create the central admin account
# After the first user is created (User.count > 0) it is not possible to create the central admin user
def test_signup_central_admin
User.destroy_all
assert_equal 0, User.count
get "login/login"
assert_redirected_to :action => 'new_cadmin'
# fields cannot be null
post "login/new_cadmin"
assert_response :success
assert_errors
assert_equal 0, User.count
# no password confirmation
post "login/new_cadmin", :user => {:name => "cadmin", :email => "cadmin@logicacmg.com", :password => "cadmin"}
assert_response :success
#assert nil, @response.body
assert_equal "Password confirmation can't be blank",assigns(:user).errors.full_messages.join(', ')
assert_equal 0, User.count
assert_errors
# passwords don't match
post "login/new_cadmin", :user => {:name => "cadmin", :email => "cadmin@logicacmg.com", :password => "cadmin", :password_confirmation => ""}
assert_equal "Password confirmation can't be blank, Password doesn't match confirmation",assigns(:user).errors.full_messages.join(', ')
assert_response :success #302?
assert_equal 0, User.count
assert_errors
# passwords should be present
post "login/new_cadmin", :user => {:name => "cadmin", :email => "cadmin@logicacmg.com"}
assert_equal "Password confirmation can't be blank, Password can't be blank",assigns(:user).errors.full_messages.join(', ')
assert_equal 0, User.count
assert_response :success
assert_errors
post "login/new_cadmin", :user => {:name => "cadmin", :email => "cadmin@logicacmg.com", :password => "cadmin", :password_confirmation => "cadmin"}
assert_equal "",assigns(:user).errors.full_messages.join(', ')
assert_equal 1, User.count
cadmin = User.find_central_admin
assert_not_nil cadmin
assert_redirected_to :action => 'login'
post "login/new_cadmin", :user => {:name => "cadmin", :email => "cadmin@logicacmg.com", :password => "cadmin", :password_confirmation => "cadmin"}
assert_equal LoginController::FLASH_CENTRAL_ADMIN_ALREADY_CREATED, flash['error']
assert_equal 1, User.count
assert_redirected_to :action => 'login'
end
# if ENV['EPFWIKI_DOMAINS'] is set sign-up is restricted to those domains
def test_sign_up
@emails = ActionMailer::Base::deliveries
@emails.clear
user_count = User.count
# 1 . sign with domain restriction
get "login/sign_up"
assert_field("user_email")
assert_field("user_name")
assert_field("user_password")
assert_field("user_password_confirmation")
assert_tag :tag => "select", :attributes => {:name => "user[email_extension]"}
@html_document = nil # workaround for bug in assert_tag used in assert_errors
post "login/sign_up", :user => {:name => "user1", :email => "user1", :email_extension => "@somedomain.nl", :password => 'mypassword', :password_confirmation => 'mypassword'} # , :i_agree_to_the_terms_of_use => '1'
assert_errors
# assert_tag :tag => "div", :attributes => { :class => "fieldWithErrors" }
assert_response :success
assert_equal user_count, User.count
user = assigns(:user)
assert_equal "Email domain not valid",user.errors.full_messages.join(', ')
# this domain is allowed, the user is created
post "login/sign_up", :user => {:name => "user1", :email=>"user1", :email_extension => "@epf.eclipse.org", :password => 'mypassword', :password_confirmation => 'mypassword'} # , :i_agree_to_the_terms_of_use => '1'
user = assigns(:user)
assert_no_errors(user)
assert_redirected_to :action => 'login'
assert_equal user_count + 1 , User.count
assert_equal 1, @emails.size
email = @emails.first
assert_equal("[#{ENV['EPFWIKI_APP_NAME']}] Welcome", email.subject)
assert_equal("user1@epf.eclipse.org", email.to[0])
assert_equal([ENV['EPFWIKI_REPLY_ADDRESS']], email.from)
assert_redirected_to :action => 'login'
assert_equal LoginController::FLASH_PW_CONFIRMATION_EMAIL_SENT, flash['success']
# cannot sign up with already taken name, email
@html_document = nil
post "login/sign_up", :user => {:name => "user1", :email => "user1", :email_extension => "@epf.eclipse.org", :password => 'mypassword', :password_confirmation => 'mypassword'} # , :i_agree_to_the_terms_of_use => '1'
assert_equal "Name has already been taken, Email has already been taken",assigns(:user).errors.full_messages.join(', ')
# sign up without domain restriction
ENV['EPFWIKI_DOMAINS'] = nil
get "login/sign_up"
assert_field("user_email")
assert_field("user_name")
assert_field("user_password")
assert_field("user_password_confirmation")
assert_no_tag :tag => "select", :attributes => {:name => "email_extension"}
user_count = User.count
@html_document = nil
post "login/sign_up", :user => {:name => "user3", :email => "user2@xyz.com", :password => 'mypassword', :password_confirmation => 'mypassword'} # , :i_agree_to_the_terms_of_use => '1'
assert_no_errors(assigns(:user))
assert_equal user_count + 1, User.count
assert_redirected_to :controller => 'login', :action => 'login'
#assert_equal "Name has already been taken, Email has already been taken",assigns(:user).errors.full_messages.join(', ')
@html_document = nil
get "login/sign_up"
assert_field("user_email")
assert_field("user_name")
assert_field("user_password")
assert_field("user_password_confirmation")
assert_no_tag :tag => "select", :attributes => {:name => "email_extension"}
user_count = User.count
# user exists
@html_document = nil
post "login/sign_up", :user => {:name => "user2", :email => "user2@xyz.com"} # , :i_agree_to_the_terms_of_use => '1'
assert_equal "Name has already been taken, Password confirmation can't be blank, Password can't be blank, Email has already been taken",assigns(:user).errors.full_messages.join(', ')
assert_equal user_count, User.count
assert_errors
# creating user3
@html_document = nil
post "login/sign_up", :user => {:name => "user4", :email => "user4@xyz.com", :password => 'user4', :password_confirmation => 'user4'} # , :i_agree_to_the_terms_of_use => '1'
assert_no_errors(assigns(:user))
assert_equal LoginController::FLASH_PW_CONFIRMATION_EMAIL_SENT, flash['success']
assert_equal "",assigns(:user).errors.full_messages.join(', ')
assert_equal user_count + 1, User.count
assert_redirected_to :action => 'login'
assert_equal Digest::SHA1.hexdigest('user4'), assigns(:user).hashed_password
get "login/login"
assert_response :success
# assert_field("user_email")# TODO Rails bug?
# assert_field("user_password") # TODO Rails bug?
# user3 cannot sign-in, it needs to be confirmed
user3 = User.find_by_name('user4')
post "login/login" , :user => {:email => 'user4@epf.org', :password => 'user3'}
assert_equal LoginController::FLASH_INVALID_PW, flash['notice']
# cannot confirm with wrong token
# ? log reports a RunTimeError but then the assert says there is no runtime error! assert_raise(RuntimeError){ get "login/confirm_account", :id => user3.id, :tk => "anystring"}
get "login/confirm_account", :id => user3.id, :tk => "anystring"
user3 = User.find_by_name('user4')
assert_equal nil, user3.confirmed_on
# can confirm with right token
get "login/confirm_account", :id => user3.id, :tk => Digest::SHA1.hexdigest(user3.hashed_password)
assert_equal LoginController::FLASH_PASSWORD_ACTIVATED, flash['success']
assert_not_nil assigns(:user).confirmed_on
# user can now logon
# user can sign in and check that they want to be remembered
post "login/login" , :user => {:email => 'user4@xyz.com', :password => 'user4', :remember_me => 0}
assert_equal User.find_by_name("user4"), session['user']
assert_not_nil cookies
# TODO we can't use cookies[:epfwiki_id] anymore?
assert_equal cookies["epfwiki_id"], session['user'].id.to_s
# automatically sign-in for remembered users
# redirected to user details or requested page (not tested)
get "login/login"
assert_redirected_to :controller => "users", :action => "account"
end
# Shows
# 1. new sign up user5 we can logon
# 2. user can be remembered
# 3. a cookie with wrong id is deleted and the user is prompted to logon again
# Note: this can happen when a user uses multiple EPF Wiki sites
def test_cookies
@user5 = User.new(:name => 'user5', :email=>'user5@epf.eclipse.org', :password => 'mypassword', :password_confirmation => 'mypassword')
# 1
assert_not_nil User.find_central_admin
post 'login/sign_up', :user => {:name => @user5.name, :email => @user5.email, :password => @user5.password, :password_confirmation => @user5.password_confirmation} # , :i_agree_to_the_terms_of_use => '1'
assert_not_nil assigns(:user)
assert_no_errors(assigns(:user))
assert_redirected_to :action => 'login'
@user5 = assigns(:user)
@user5.id = User.find_by_name(@user5.name).id # Note: we don't reload @user5 because we loose the password
@user5.hashed_password = User.find(@user5).hashed_password
assert_equal LoginController::FLASH_PW_CONFIRMATION_EMAIL_SENT, flash['success']
get "login/confirm_account", :id => @user5.id, :tk => Digest::SHA1.hexdigest(@user5.hashed_password)
post 'login/login', :user => {:email => @user5.email, :password => @user5.password}
assert_not_nil session['user']
assert_nil cookies[:epfwiki_id]
session['user'] = nil
# 2
post 'login/login', :user => {:email => @user5.email, :password => @user5.password, :remember_me => "0"}
assert_not_nil assigns(:user)
assert_not_nil session['user']
logger.info("Cookies: #{cookies.inspect}")
assert_not_nil cookies['epfwiki_id']
# cookies[:epfwiki_id] doesn't work either
# Testing cookies with functional tests is hard work but here is not easy either
# We also cannot use symbols, and values are converted to strings
assert_equal cookies['epfwiki_id'],session['user'].id.to_s
session['user'] = nil
get 'login/login'
assert_not_nil assigns(:user)
assert_not_nil session['user']
# 3
session['user'] = nil
assert_not_nil cookies['epfwiki_id']
assert_equal cookies['epfwiki_id'], @user5.id.to_s
cookies['epfwiki_id'] = 123456 # cookie with a non-existing id
get 'login/login'
assert_response :success
assert_nil session['user']
assert cookies['epfwiki_id'].blank?
# 4
cookies[:epfwiki_id] = @user5.id
cookies[:epfwiki_token] = 'xyz'
get 'login/login'
assert_response :success
assert_nil session['user']
assert cookies['epfwiki_id'].blank?
@user5.destroy
end
end