blob: 1054a436438557bd754582a8679e488e2cece077 [file] [log] [blame]
require File.dirname(__FILE__) + '/../test_helper'
require 'openssl'
require 'digest/sha1'
#--######################################################################
# 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 UserTest < Test::Unit::TestCase
fixtures :users
def setup
logger.debug "Test Case: #{name}"
@emails = ActionMailer::Base::deliveries
@emails.clear
@andy, @cash, @tony, @george = users(:andy), users(:cash), users(:tony), users(:george)
end
def test_create
assert_kind_of User, @andy
#assert_equal 1, @andy.id
assert_equal "andy.kaufman@epf.eclipse.org", @andy.email
assert_equal "Andy Kaufman", @andy.name
assert_equal "localhost", @andy.ip_address
assert_equal hash_pw(@andy.name), @andy.hashed_password
assert_equal "Y", @andy.admin
end
def test_new_signup
assert User.count > 0
assert_not_nil ENV['EPFWIKI_DOMAINS']
# we need params
user = User.new_signup({})
assert !user.save
assert_equal "Name can't be blank, Password confirmation can't be blank, Password can't be blank, Email can't be blank, Email is invalid, Email domain not valid", user.errors.full_messages.join(", ")
# password needs to be confirmed
user = User.new_signup({:name => "User10", :password => "User10", :email => "User10@epf.eclipse.org"}) #, :i_agree_to_the_terms_of_use => '1'
assert !user.save
assert_equal "Password confirmation can't be blank", user.errors.full_messages.join(", ")
# password needs to be confirmed 2
user = User.new_signup({:name => "User10", :password => "User10", :password_confirmation => "xyz", :email => "User10@epf.eclipse.org"}) # , :i_agree_to_the_terms_of_use => '1'
assert !user.save
assert_equal "Password doesn't match confirmation", user.errors.full_messages.join(", ")
# user created
user = User.new_signup({:name => "User10", :password => "User10", :password_confirmation => "User10", :email => "User10@epf.eclipse.org"}) # , :i_agree_to_the_terms_of_use => '1'
assert user.save
assert_equal "user10@epf.eclipse.org", user.email
assert_equal nil, user.confirmed_on # account needs to be confirmed
assert_equal hash_pw('User10'), user.hashed_password
assert_equal nil, user.hashed_password_new
# cannot login, not confirmed
login_user = user.try_to_login
assert_equal nil, login_user
# confirm account
# assert_equal hash_pw('User10'), user.hashed_password
user.confirm_account(hash_pw(user.hashed_password))
assert user.save
assert_not_nil user.confirmed_on
# can login
login_user = user.try_to_login
assert_not_nil login_user
end
def test_set_new_pw
# user created
user = User.new_signup({:name => "User11", :password => "User11", :password_confirmation => "User11", :email => "User11@epf.eclipse.org"}) # , :i_agree_to_the_terms_of_use => '1'
assert user.save
# confirm account
user.confirm_account(hash_pw(user.hashed_password))
assert user.save
assert_equal "", user.errors.full_messages.join(", ")
user = User.find_by_name('User11')
assert_not_nil user.confirmed_on
# can login
user.password = 'User11'
login_user = user.try_to_login
assert_not_nil login_user
# set new password
hashed_password = user.hashed_password
user.set_new_pw('new_password')
new_pw = user.password
assert user.save
assert_equal "", user.errors.full_messages.join(", ")
user.reload
assert_not_nil user.confirmed_on
assert_equal hash_pw(new_pw), user.hashed_password_new
# we can still sign in with the old password
user.password = "User11"
login_user = user.try_to_login
assert_not_nil login_user
# we cannot sign in with the new password
user.password = new_pw
login_user = user.try_to_login
assert_equal nil, login_user
# cannot confirm with the wrong token
user = User.find_by_name('User11')
assert_equal false, user.confirm_account("somewrongtoken")
# confirm the account
user = User.find_by_name('User11')
#assert_equal hash_pw(hash_pw(new_pw)), hash_pw(user.hashed_password_new)
user.confirm_account(hash_pw(hash_pw(new_pw)))
assert_equal hash_pw(new_pw), user.hashed_password
user.save
assert_equal "", user.errors.full_messages.join(", ")
user = User.find_by_name('User11')
assert_not_equal hashed_password, user.hashed_password
assert_equal hash_pw(new_pw), user.hashed_password
assert_equal nil, user.hashed_password_new
assert_not_nil user.confirmed_on
# we can sign in with the new password
user.password = new_pw
login_user = user.try_to_login
assert_not_nil login_user
end
def test_updates
user = User.find_by_name('Andy Kaufman')
user.name = "test04_updates"
assert user.save
assert_equal "", user.errors.full_messages.join(", ")
end
def test_change_password
user = User.find_by_name('User2')
assert_raise(RuntimeError) {user.change_password(User.new)}
assert_raise(RuntimeError) {user.change_password(User.new(:password =>'', :password_confirmation => ''))}
user.change_password(User.new(:password =>'xyz', :password_confirmation => '123'))
assert !user.save
assert_equal "Password doesn't match confirmation", user.errors.full_messages.join(", ")
user.change_password(User.new(:password =>'xyz', :password_confirmation => 'xyz'))
assert user.save
assert_equal '', user.errors.full_messages.join(', ')
user = User.find_by_name('User2')
user.password = 'xyz'
login_user = user.try_to_login
assert_equal hash_pw('xyz'), login_user.hashed_password
assert_not_nil login_user
end
# Shows:
# 1 User can logon using basic authentication, first logon -> an account is created
# 2 Second logon succesfull, account is not created
# 3 Wrong password cannot logon
# 4 Failed to save, sends email
def tst_login_basicauthentication
# get password
pw = IO.readlines('S:/Keys/epfwiki_basic_authentication_key')[0]
# 1
ENV['EPFWIKI_DOMAINS'] = ENV['EPFWIKI_DOMAINS'] + ' @logicacmg.com'
user_count = User.count
user = User.new(:account => 'ostraaten', :password => pw)
logon_user = User.login(user.account, user.password)
assert_equal user_count + 1, User.count
# 2
logon_user = User.login(user.account, user.password)
assert_not_nil logon_user
assert_equal user_count + 1, User.count
# 3
logon_user = User.login(user.account, user.password + 'xyz')
assert_nil logon_user
assert_equal user_count + 1, User.count
# 4
User.find_by_account(user.account).destroy
assert_equal user_count, User.count
ActiveRecord::Migration::drop_column 'users', 'account'
assert_equal 0,@emails.size
logon_user = nil
logon_user = User.login(user.account, user.password)
assert_nil logon_user
assert_equal user_count, User.count
end
# Shows:
# 1. Cannot update a user to Y or C without specifying the user
# 2. Cadmin can upgrade user to admin, downgrade to user, admin kan upgrade user to admin but not downgrade admin to user
# 3. Cadmin can make another user the cadmin
# . C -> Y or C -> N not possible
def test_admin
cadmin = User.find_central_admin
user = User.find_all_by_admin('N')[0]
admin = User.find_all_by_admin('Y')[0]
assert_not_nil cadmin
assert_not_nil user
assert_not_nil admin
user.admin = 'Y'
assert !user.save
assert_equal 'Admin can only be set by an admin', user.errors.full_messages.join(", ")
user.admin = 'C'
assert !user.save
assert_equal 'Admin can only be set to C by the central admin', user.errors.full_messages.join(", ")
# 2
user.admin = 'Y'
user.user = cadmin
assert user.save
user.admin = 'N'
user.user = cadmin
assert user.save
user.admin = 'Y'
user.user = admin
assert user.save
user.admin = 'N'
user.user = admin
assert !user.save
assert_equal 'Admin can only be revoked by the central admin', user.errors.full_messages.join(", ")
user.user = cadmin
assert user.save
# 3
assert cadmin.cadmin?
User.cadmin(cadmin, user)
user.save
cadmin.save
assert_equal '', user.errors.full_messages.join(", ")
assert_equal '', cadmin.errors.full_messages.join(", ")
user.reload
cadmin.reload
assert user.cadmin?
assert !cadmin.cadmin?
assert_equal 'Y', cadmin.admin
assert_equal 'C', user.admin
end
# Shows:
# 1 User can logon using bugzilla authentication, on first logon an account is created
# 2 Second logon succesfull, account is not created
# 3 Wrong password cannot logon
# 4 User tries to switch validemail to Bugzilla authentication when using the same email -> TODO
def tst_login_bugzilla
# get password
pw = IO.readlines('S:/Keys/epfwiki_bugzilla_authentication_key')[0]
# 1
ENV['EPFWIKI_DOMAINS'] = ENV['EPFWIKI_DOMAINS'] + ' @logicacmg.com'
user_count = User.count
user = User.new(:email => 'onno.van.der.straaten@logicacmg.com', :password => pw)
logon_user = User.login(user.email, user.password)
assert_equal user_count + 1, User.count # TODO fails
# 2
logon_user = User.login(user.email, user.password)
assert_not_nil logon_user
assert_equal user_count + 1, User.count
# 3
logon_user = User.login(user.email, user.password + 'xyz')
assert_nil logon_user
assert_equal user_count + 1, User.count
# 4
end
# Shows:
# 1. When the central admin is created, the 'Templates' Wiki is created
def test_new_cadmin
params = {:name => 'onno', :email => 'Onno@epf.eclipse.org', :password => 'xyz', :password_confirmation => 'xyz'}
# cannot create cadmin if there are users
assert_raise(RuntimeError) {cadmin = User.new_cadmin(params)}
User.delete_all
# params are needed
cadmin = User.new_cadmin({})
assert !cadmin.save
assert_equal "Name can't be blank, Password confirmation can't be blank, Password can't be blank, Email can't be blank, Email is invalid", cadmin.errors.full_messages.join(", ")
# password needs to be confirmed
cadmin = User.new_cadmin(:name => 'onno', :email => 'Onno@epf.eclipse.org', :password => 'xyz', :password_confirmation => '123')
assert !cadmin.save
assert_equal "Password doesn't match confirmation", cadmin.errors.full_messages.join(", ")
# valid email is required
cadmin = User.new_cadmin(:name => 'onno', :email => 'Onno(at)epf.org', :password => 'xyz', :password_confirmation => 'xyz')
assert !cadmin.save
assert_equal "Email is invalid", cadmin.errors.full_messages.join(", ")
# cadmin is created, note domain restriction does not apply to cadmin account
cadmin = User.new_cadmin(:id => 5, :name => 'onno', :email => 'Onno@noneExistingDomain.Com', :password => 'xyz', :password_confirmation => 'xyz')
assert cadmin.save
assert_equal 26, Site.templates.size
# 1
assert_equal "", cadmin.errors.full_messages.join(", ")
assert_equal 'onno@noneexistingdomain.com', cadmin.email # email set to downcase
assert_not_nil cadmin.hashed_password
assert_equal hash_pw('xyz'), cadmin.hashed_password # password is hashed and stored
assert_not_nil cadmin.confirmed_on # account or email does not need to be confirmed
# TODO: we can update attributes
end
end