annotate .svn/pristine/55/559174dc6dc9fe3ee3e34f610d2f9ef569c9ebd8.svn-base @ 1478:5ca1f4a47171 bibplugin_db_migrations

Close obsolete branch bibplugin_db_migrations
author Chris Cannam
date Fri, 30 Nov 2012 14:40:50 +0000
parents cbb26bc654de
children
rev   line source
Chris@909 1 # Redmine - project management software
Chris@909 2 # Copyright (C) 2006-2011 Jean-Philippe Lang
Chris@909 3 #
Chris@909 4 # This program is free software; you can redistribute it and/or
Chris@909 5 # modify it under the terms of the GNU General Public License
Chris@909 6 # as published by the Free Software Foundation; either version 2
Chris@909 7 # of the License, or (at your option) any later version.
Chris@909 8 #
Chris@909 9 # This program is distributed in the hope that it will be useful,
Chris@909 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@909 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@909 12 # GNU General Public License for more details.
Chris@909 13 #
Chris@909 14 # You should have received a copy of the GNU General Public License
Chris@909 15 # along with this program; if not, write to the Free Software
Chris@909 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Chris@909 17
Chris@909 18 require File.expand_path('../../test_helper', __FILE__)
Chris@909 19
Chris@909 20 class UserTest < ActiveSupport::TestCase
Chris@909 21 fixtures :users, :members, :projects, :roles, :member_roles, :auth_sources,
Chris@909 22 :trackers, :issue_statuses,
Chris@909 23 :projects_trackers,
Chris@909 24 :watchers,
Chris@909 25 :issue_categories, :enumerations, :issues,
Chris@909 26 :journals, :journal_details,
Chris@909 27 :groups_users,
Chris@909 28 :enabled_modules,
Chris@909 29 :workflows
Chris@909 30
Chris@909 31 def setup
Chris@909 32 @admin = User.find(1)
Chris@909 33 @jsmith = User.find(2)
Chris@909 34 @dlopper = User.find(3)
Chris@909 35 end
Chris@909 36
Chris@909 37 test 'object_daddy creation' do
Chris@909 38 User.generate_with_protected!(:firstname => 'Testing connection')
Chris@909 39 User.generate_with_protected!(:firstname => 'Testing connection')
Chris@909 40 assert_equal 2, User.count(:all, :conditions => {:firstname => 'Testing connection'})
Chris@909 41 end
Chris@909 42
Chris@909 43 def test_truth
Chris@909 44 assert_kind_of User, @jsmith
Chris@909 45 end
Chris@909 46
Chris@909 47 def test_mail_should_be_stripped
Chris@909 48 u = User.new
Chris@909 49 u.mail = " foo@bar.com "
Chris@909 50 assert_equal "foo@bar.com", u.mail
Chris@909 51 end
Chris@909 52
Chris@909 53 def test_mail_validation
Chris@909 54 u = User.new
Chris@909 55 u.mail = ''
Chris@909 56 assert !u.valid?
Chris@909 57 assert_equal I18n.translate('activerecord.errors.messages.blank'), u.errors.on(:mail)
Chris@909 58 end
Chris@909 59
Chris@909 60 def test_create
Chris@909 61 user = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo")
Chris@909 62
Chris@909 63 user.login = "jsmith"
Chris@909 64 user.password, user.password_confirmation = "password", "password"
Chris@909 65 # login uniqueness
Chris@909 66 assert !user.save
Chris@909 67 assert_equal 1, user.errors.count
Chris@909 68
Chris@909 69 user.login = "newuser"
Chris@909 70 user.password, user.password_confirmation = "passwd", "password"
Chris@909 71 # password confirmation
Chris@909 72 assert !user.save
Chris@909 73 assert_equal 1, user.errors.count
Chris@909 74
Chris@909 75 user.password, user.password_confirmation = "password", "password"
Chris@909 76 assert user.save
Chris@909 77 end
Chris@909 78
Chris@909 79 context "User#before_create" do
Chris@909 80 should "set the mail_notification to the default Setting" do
Chris@909 81 @user1 = User.generate_with_protected!
Chris@909 82 assert_equal 'only_my_events', @user1.mail_notification
Chris@909 83
Chris@909 84 with_settings :default_notification_option => 'all' do
Chris@909 85 @user2 = User.generate_with_protected!
Chris@909 86 assert_equal 'all', @user2.mail_notification
Chris@909 87 end
Chris@909 88 end
Chris@909 89 end
Chris@909 90
Chris@909 91 context "User.login" do
Chris@909 92 should "be case-insensitive." do
Chris@909 93 u = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo")
Chris@909 94 u.login = 'newuser'
Chris@909 95 u.password, u.password_confirmation = "password", "password"
Chris@909 96 assert u.save
Chris@909 97
Chris@909 98 u = User.new(:firstname => "Similar", :lastname => "User", :mail => "similaruser@somenet.foo")
Chris@909 99 u.login = 'NewUser'
Chris@909 100 u.password, u.password_confirmation = "password", "password"
Chris@909 101 assert !u.save
Chris@909 102 assert_equal I18n.translate('activerecord.errors.messages.taken'), u.errors.on(:login)
Chris@909 103 end
Chris@909 104 end
Chris@909 105
Chris@909 106 def test_mail_uniqueness_should_not_be_case_sensitive
Chris@909 107 u = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo")
Chris@909 108 u.login = 'newuser1'
Chris@909 109 u.password, u.password_confirmation = "password", "password"
Chris@909 110 assert u.save
Chris@909 111
Chris@909 112 u = User.new(:firstname => "new", :lastname => "user", :mail => "newUser@Somenet.foo")
Chris@909 113 u.login = 'newuser2'
Chris@909 114 u.password, u.password_confirmation = "password", "password"
Chris@909 115 assert !u.save
Chris@909 116 assert_equal I18n.translate('activerecord.errors.messages.taken'), u.errors.on(:mail)
Chris@909 117 end
Chris@909 118
Chris@909 119 def test_update
Chris@909 120 assert_equal "admin", @admin.login
Chris@909 121 @admin.login = "john"
Chris@909 122 assert @admin.save, @admin.errors.full_messages.join("; ")
Chris@909 123 @admin.reload
Chris@909 124 assert_equal "john", @admin.login
Chris@909 125 end
Chris@909 126
Chris@909 127 def test_destroy_should_delete_members_and_roles
Chris@909 128 members = Member.find_all_by_user_id(2)
Chris@909 129 ms = members.size
Chris@909 130 rs = members.collect(&:roles).flatten.size
Chris@909 131
Chris@909 132 assert_difference 'Member.count', - ms do
Chris@909 133 assert_difference 'MemberRole.count', - rs do
Chris@909 134 User.find(2).destroy
Chris@909 135 end
Chris@909 136 end
Chris@909 137
Chris@909 138 assert_nil User.find_by_id(2)
Chris@909 139 assert Member.find_all_by_user_id(2).empty?
Chris@909 140 end
Chris@909 141
Chris@909 142 def test_destroy_should_update_attachments
Chris@909 143 attachment = Attachment.create!(:container => Project.find(1),
Chris@909 144 :file => uploaded_test_file("testfile.txt", "text/plain"),
Chris@909 145 :author_id => 2)
Chris@909 146
Chris@909 147 User.find(2).destroy
Chris@909 148 assert_nil User.find_by_id(2)
Chris@909 149 assert_equal User.anonymous, attachment.reload.author
Chris@909 150 end
Chris@909 151
Chris@909 152 def test_destroy_should_update_comments
Chris@909 153 comment = Comment.create!(
Chris@909 154 :commented => News.create!(:project_id => 1, :author_id => 1, :title => 'foo', :description => 'foo'),
Chris@909 155 :author => User.find(2),
Chris@909 156 :comments => 'foo'
Chris@909 157 )
Chris@909 158
Chris@909 159 User.find(2).destroy
Chris@909 160 assert_nil User.find_by_id(2)
Chris@909 161 assert_equal User.anonymous, comment.reload.author
Chris@909 162 end
Chris@909 163
Chris@909 164 def test_destroy_should_update_issues
Chris@909 165 issue = Issue.create!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'foo')
Chris@909 166
Chris@909 167 User.find(2).destroy
Chris@909 168 assert_nil User.find_by_id(2)
Chris@909 169 assert_equal User.anonymous, issue.reload.author
Chris@909 170 end
Chris@909 171
Chris@909 172 def test_destroy_should_unassign_issues
Chris@909 173 issue = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :subject => 'foo', :assigned_to_id => 2)
Chris@909 174
Chris@909 175 User.find(2).destroy
Chris@909 176 assert_nil User.find_by_id(2)
Chris@909 177 assert_nil issue.reload.assigned_to
Chris@909 178 end
Chris@909 179
Chris@909 180 def test_destroy_should_update_journals
Chris@909 181 issue = Issue.create!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'foo')
Chris@909 182 issue.init_journal(User.find(2), "update")
Chris@909 183 issue.save!
Chris@909 184
Chris@909 185 User.find(2).destroy
Chris@909 186 assert_nil User.find_by_id(2)
Chris@909 187 assert_equal User.anonymous, issue.journals.first.reload.user
Chris@909 188 end
Chris@909 189
Chris@909 190 def test_destroy_should_update_journal_details_old_value
Chris@909 191 issue = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :subject => 'foo', :assigned_to_id => 2)
Chris@909 192 issue.init_journal(User.find(1), "update")
Chris@909 193 issue.assigned_to_id = nil
Chris@909 194 assert_difference 'JournalDetail.count' do
Chris@909 195 issue.save!
Chris@909 196 end
Chris@909 197 journal_detail = JournalDetail.first(:order => 'id DESC')
Chris@909 198 assert_equal '2', journal_detail.old_value
Chris@909 199
Chris@909 200 User.find(2).destroy
Chris@909 201 assert_nil User.find_by_id(2)
Chris@909 202 assert_equal User.anonymous.id.to_s, journal_detail.reload.old_value
Chris@909 203 end
Chris@909 204
Chris@909 205 def test_destroy_should_update_journal_details_value
Chris@909 206 issue = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :subject => 'foo')
Chris@909 207 issue.init_journal(User.find(1), "update")
Chris@909 208 issue.assigned_to_id = 2
Chris@909 209 assert_difference 'JournalDetail.count' do
Chris@909 210 issue.save!
Chris@909 211 end
Chris@909 212 journal_detail = JournalDetail.first(:order => 'id DESC')
Chris@909 213 assert_equal '2', journal_detail.value
Chris@909 214
Chris@909 215 User.find(2).destroy
Chris@909 216 assert_nil User.find_by_id(2)
Chris@909 217 assert_equal User.anonymous.id.to_s, journal_detail.reload.value
Chris@909 218 end
Chris@909 219
Chris@909 220 def test_destroy_should_update_messages
Chris@909 221 board = Board.create!(:project_id => 1, :name => 'Board', :description => 'Board')
Chris@909 222 message = Message.create!(:board_id => board.id, :author_id => 2, :subject => 'foo', :content => 'foo')
Chris@909 223
Chris@909 224 User.find(2).destroy
Chris@909 225 assert_nil User.find_by_id(2)
Chris@909 226 assert_equal User.anonymous, message.reload.author
Chris@909 227 end
Chris@909 228
Chris@909 229 def test_destroy_should_update_news
Chris@909 230 news = News.create!(:project_id => 1, :author_id => 2, :title => 'foo', :description => 'foo')
Chris@909 231
Chris@909 232 User.find(2).destroy
Chris@909 233 assert_nil User.find_by_id(2)
Chris@909 234 assert_equal User.anonymous, news.reload.author
Chris@909 235 end
Chris@909 236
Chris@909 237 def test_destroy_should_delete_private_queries
Chris@909 238 query = Query.new(:name => 'foo', :is_public => false)
Chris@909 239 query.project_id = 1
Chris@909 240 query.user_id = 2
Chris@909 241 query.save!
Chris@909 242
Chris@909 243 User.find(2).destroy
Chris@909 244 assert_nil User.find_by_id(2)
Chris@909 245 assert_nil Query.find_by_id(query.id)
Chris@909 246 end
Chris@909 247
Chris@909 248 def test_destroy_should_update_public_queries
Chris@909 249 query = Query.new(:name => 'foo', :is_public => true)
Chris@909 250 query.project_id = 1
Chris@909 251 query.user_id = 2
Chris@909 252 query.save!
Chris@909 253
Chris@909 254 User.find(2).destroy
Chris@909 255 assert_nil User.find_by_id(2)
Chris@909 256 assert_equal User.anonymous, query.reload.user
Chris@909 257 end
Chris@909 258
Chris@909 259 def test_destroy_should_update_time_entries
Chris@909 260 entry = TimeEntry.new(:hours => '2', :spent_on => Date.today, :activity => TimeEntryActivity.create!(:name => 'foo'))
Chris@909 261 entry.project_id = 1
Chris@909 262 entry.user_id = 2
Chris@909 263 entry.save!
Chris@909 264
Chris@909 265 User.find(2).destroy
Chris@909 266 assert_nil User.find_by_id(2)
Chris@909 267 assert_equal User.anonymous, entry.reload.user
Chris@909 268 end
Chris@909 269
Chris@909 270 def test_destroy_should_delete_tokens
Chris@909 271 token = Token.create!(:user_id => 2, :value => 'foo')
Chris@909 272
Chris@909 273 User.find(2).destroy
Chris@909 274 assert_nil User.find_by_id(2)
Chris@909 275 assert_nil Token.find_by_id(token.id)
Chris@909 276 end
Chris@909 277
Chris@909 278 def test_destroy_should_delete_watchers
Chris@909 279 issue = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :subject => 'foo')
Chris@909 280 watcher = Watcher.create!(:user_id => 2, :watchable => issue)
Chris@909 281
Chris@909 282 User.find(2).destroy
Chris@909 283 assert_nil User.find_by_id(2)
Chris@909 284 assert_nil Watcher.find_by_id(watcher.id)
Chris@909 285 end
Chris@909 286
Chris@909 287 def test_destroy_should_update_wiki_contents
Chris@909 288 wiki_content = WikiContent.create!(
Chris@909 289 :text => 'foo',
Chris@909 290 :author_id => 2,
Chris@909 291 :page => WikiPage.create!(:title => 'Foo', :wiki => Wiki.create!(:project_id => 1, :start_page => 'Start'))
Chris@909 292 )
Chris@909 293 wiki_content.text = 'bar'
Chris@909 294 assert_difference 'WikiContent::Version.count' do
Chris@909 295 wiki_content.save!
Chris@909 296 end
Chris@909 297
Chris@909 298 User.find(2).destroy
Chris@909 299 assert_nil User.find_by_id(2)
Chris@909 300 assert_equal User.anonymous, wiki_content.reload.author
Chris@909 301 wiki_content.versions.each do |version|
Chris@909 302 assert_equal User.anonymous, version.reload.author
Chris@909 303 end
Chris@909 304 end
Chris@909 305
Chris@909 306 def test_destroy_should_nullify_issue_categories
Chris@909 307 category = IssueCategory.create!(:project_id => 1, :assigned_to_id => 2, :name => 'foo')
Chris@909 308
Chris@909 309 User.find(2).destroy
Chris@909 310 assert_nil User.find_by_id(2)
Chris@909 311 assert_nil category.reload.assigned_to_id
Chris@909 312 end
Chris@909 313
Chris@909 314 def test_destroy_should_nullify_changesets
Chris@909 315 changeset = Changeset.create!(
Chris@909 316 :repository => Repository::Subversion.create!(
Chris@909 317 :project_id => 1,
Chris@909 318 :url => 'file:///var/svn'
Chris@909 319 ),
Chris@909 320 :revision => '12',
Chris@909 321 :committed_on => Time.now,
Chris@909 322 :committer => 'jsmith'
Chris@909 323 )
Chris@909 324 assert_equal 2, changeset.user_id
Chris@909 325
Chris@909 326 User.find(2).destroy
Chris@909 327 assert_nil User.find_by_id(2)
Chris@909 328 assert_nil changeset.reload.user_id
Chris@909 329 end
Chris@909 330
Chris@909 331 def test_anonymous_user_should_not_be_destroyable
Chris@909 332 assert_no_difference 'User.count' do
Chris@909 333 assert_equal false, User.anonymous.destroy
Chris@909 334 end
Chris@909 335 end
Chris@909 336
Chris@909 337 def test_validate_login_presence
Chris@909 338 @admin.login = ""
Chris@909 339 assert !@admin.save
Chris@909 340 assert_equal 1, @admin.errors.count
Chris@909 341 end
Chris@909 342
Chris@909 343 def test_validate_mail_notification_inclusion
Chris@909 344 u = User.new
Chris@909 345 u.mail_notification = 'foo'
Chris@909 346 u.save
Chris@909 347 assert_not_nil u.errors[:mail_notification]
Chris@909 348 end
Chris@909 349
Chris@909 350 context "User#try_to_login" do
Chris@909 351 should "fall-back to case-insensitive if user login is not found as-typed." do
Chris@909 352 user = User.try_to_login("AdMin", "admin")
Chris@909 353 assert_kind_of User, user
Chris@909 354 assert_equal "admin", user.login
Chris@909 355 end
Chris@909 356
Chris@909 357 should "select the exact matching user first" do
Chris@909 358 case_sensitive_user = User.generate_with_protected!(
Chris@909 359 :login => 'changed', :password => 'admin',
Chris@909 360 :password_confirmation => 'admin')
Chris@909 361 # bypass validations to make it appear like existing data
Chris@909 362 case_sensitive_user.update_attribute(:login, 'ADMIN')
Chris@909 363
Chris@909 364 user = User.try_to_login("ADMIN", "admin")
Chris@909 365 assert_kind_of User, user
Chris@909 366 assert_equal "ADMIN", user.login
Chris@909 367
Chris@909 368 end
Chris@909 369 end
Chris@909 370
Chris@909 371 def test_password
Chris@909 372 user = User.try_to_login("admin", "admin")
Chris@909 373 assert_kind_of User, user
Chris@909 374 assert_equal "admin", user.login
Chris@909 375 user.password = "hello"
Chris@909 376 assert user.save
Chris@909 377
Chris@909 378 user = User.try_to_login("admin", "hello")
Chris@909 379 assert_kind_of User, user
Chris@909 380 assert_equal "admin", user.login
Chris@909 381 end
Chris@909 382
Chris@909 383 def test_validate_password_length
Chris@909 384 with_settings :password_min_length => '100' do
Chris@909 385 user = User.new(:firstname => "new100", :lastname => "user100", :mail => "newuser100@somenet.foo")
Chris@909 386 user.login = "newuser100"
Chris@909 387 user.password, user.password_confirmation = "password100", "password100"
Chris@909 388 assert !user.save
Chris@909 389 assert_equal 1, user.errors.count
Chris@909 390 end
Chris@909 391 end
Chris@909 392
Chris@909 393 def test_name_format
Chris@909 394 assert_equal 'Smith, John', @jsmith.name(:lastname_coma_firstname)
Chris@909 395 Setting.user_format = :firstname_lastname
Chris@909 396 assert_equal 'John Smith', @jsmith.reload.name
Chris@909 397 Setting.user_format = :username
Chris@909 398 assert_equal 'jsmith', @jsmith.reload.name
Chris@909 399 end
Chris@909 400
Chris@909 401 def test_fields_for_order_statement_should_return_fields_according_user_format_setting
Chris@909 402 with_settings :user_format => 'lastname_coma_firstname' do
Chris@909 403 assert_equal ['users.lastname', 'users.firstname', 'users.id'], User.fields_for_order_statement
Chris@909 404 end
Chris@909 405 end
Chris@909 406
Chris@909 407 def test_fields_for_order_statement_width_table_name_should_prepend_table_name
Chris@909 408 with_settings :user_format => 'lastname_firstname' do
Chris@909 409 assert_equal ['authors.lastname', 'authors.firstname', 'authors.id'], User.fields_for_order_statement('authors')
Chris@909 410 end
Chris@909 411 end
Chris@909 412
Chris@909 413 def test_fields_for_order_statement_with_blank_format_should_return_default
Chris@909 414 with_settings :user_format => '' do
Chris@909 415 assert_equal ['users.firstname', 'users.lastname', 'users.id'], User.fields_for_order_statement
Chris@909 416 end
Chris@909 417 end
Chris@909 418
Chris@909 419 def test_fields_for_order_statement_with_invalid_format_should_return_default
Chris@909 420 with_settings :user_format => 'foo' do
Chris@909 421 assert_equal ['users.firstname', 'users.lastname', 'users.id'], User.fields_for_order_statement
Chris@909 422 end
Chris@909 423 end
Chris@909 424
Chris@909 425 def test_lock
Chris@909 426 user = User.try_to_login("jsmith", "jsmith")
Chris@909 427 assert_equal @jsmith, user
Chris@909 428
Chris@909 429 @jsmith.status = User::STATUS_LOCKED
Chris@909 430 assert @jsmith.save
Chris@909 431
Chris@909 432 user = User.try_to_login("jsmith", "jsmith")
Chris@909 433 assert_equal nil, user
Chris@909 434 end
Chris@909 435
Chris@909 436 context ".try_to_login" do
Chris@909 437 context "with good credentials" do
Chris@909 438 should "return the user" do
Chris@909 439 user = User.try_to_login("admin", "admin")
Chris@909 440 assert_kind_of User, user
Chris@909 441 assert_equal "admin", user.login
Chris@909 442 end
Chris@909 443 end
Chris@909 444
Chris@909 445 context "with wrong credentials" do
Chris@909 446 should "return nil" do
Chris@909 447 assert_nil User.try_to_login("admin", "foo")
Chris@909 448 end
Chris@909 449 end
Chris@909 450 end
Chris@909 451
Chris@909 452 if ldap_configured?
Chris@909 453 context "#try_to_login using LDAP" do
Chris@909 454 context "with failed connection to the LDAP server" do
Chris@909 455 should "return nil" do
Chris@909 456 @auth_source = AuthSourceLdap.find(1)
Chris@909 457 AuthSource.any_instance.stubs(:initialize_ldap_con).raises(Net::LDAP::LdapError, 'Cannot connect')
Chris@909 458
Chris@909 459 assert_equal nil, User.try_to_login('edavis', 'wrong')
Chris@909 460 end
Chris@909 461 end
Chris@909 462
Chris@909 463 context "with an unsuccessful authentication" do
Chris@909 464 should "return nil" do
Chris@909 465 assert_equal nil, User.try_to_login('edavis', 'wrong')
Chris@909 466 end
Chris@909 467 end
Chris@909 468
Chris@909 469 context "on the fly registration" do
Chris@909 470 setup do
Chris@909 471 @auth_source = AuthSourceLdap.find(1)
Chris@909 472 end
Chris@909 473
Chris@909 474 context "with a successful authentication" do
Chris@909 475 should "create a new user account if it doesn't exist" do
Chris@909 476 assert_difference('User.count') do
Chris@909 477 user = User.try_to_login('edavis', '123456')
Chris@909 478 assert !user.admin?
Chris@909 479 end
Chris@909 480 end
Chris@909 481
Chris@909 482 should "retrieve existing user" do
Chris@909 483 user = User.try_to_login('edavis', '123456')
Chris@909 484 user.admin = true
Chris@909 485 user.save!
Chris@909 486
Chris@909 487 assert_no_difference('User.count') do
Chris@909 488 user = User.try_to_login('edavis', '123456')
Chris@909 489 assert user.admin?
Chris@909 490 end
Chris@909 491 end
Chris@909 492 end
Chris@909 493 end
Chris@909 494 end
Chris@909 495
Chris@909 496 else
Chris@909 497 puts "Skipping LDAP tests."
Chris@909 498 end
Chris@909 499
Chris@909 500 def test_create_anonymous
Chris@909 501 AnonymousUser.delete_all
Chris@909 502 anon = User.anonymous
Chris@909 503 assert !anon.new_record?
Chris@909 504 assert_kind_of AnonymousUser, anon
Chris@909 505 end
Chris@909 506
Chris@909 507 def test_ensure_single_anonymous_user
Chris@909 508 AnonymousUser.delete_all
Chris@909 509 anon1 = User.anonymous
Chris@909 510 assert !anon1.new_record?
Chris@909 511 assert_kind_of AnonymousUser, anon1
Chris@909 512 anon2 = AnonymousUser.create(
Chris@909 513 :lastname => 'Anonymous', :firstname => '',
Chris@909 514 :mail => '', :login => '', :status => 0)
Chris@909 515 assert_equal 1, anon2.errors.count
Chris@909 516 end
Chris@909 517
Chris@909 518 should_have_one :rss_token
Chris@909 519
Chris@909 520 def test_rss_key
Chris@909 521 assert_nil @jsmith.rss_token
Chris@909 522 key = @jsmith.rss_key
Chris@909 523 assert_equal 40, key.length
Chris@909 524
Chris@909 525 @jsmith.reload
Chris@909 526 assert_equal key, @jsmith.rss_key
Chris@909 527 end
Chris@909 528
Chris@909 529
Chris@909 530 should_have_one :api_token
Chris@909 531
Chris@909 532 context "User#api_key" do
Chris@909 533 should "generate a new one if the user doesn't have one" do
Chris@909 534 user = User.generate_with_protected!(:api_token => nil)
Chris@909 535 assert_nil user.api_token
Chris@909 536
Chris@909 537 key = user.api_key
Chris@909 538 assert_equal 40, key.length
Chris@909 539 user.reload
Chris@909 540 assert_equal key, user.api_key
Chris@909 541 end
Chris@909 542
Chris@909 543 should "return the existing api token value" do
Chris@909 544 user = User.generate_with_protected!
Chris@909 545 token = Token.generate!(:action => 'api')
Chris@909 546 user.api_token = token
Chris@909 547 assert user.save
Chris@909 548
Chris@909 549 assert_equal token.value, user.api_key
Chris@909 550 end
Chris@909 551 end
Chris@909 552
Chris@909 553 context "User#find_by_api_key" do
Chris@909 554 should "return nil if no matching key is found" do
Chris@909 555 assert_nil User.find_by_api_key('zzzzzzzzz')
Chris@909 556 end
Chris@909 557
Chris@909 558 should "return nil if the key is found for an inactive user" do
Chris@909 559 user = User.generate_with_protected!(:status => User::STATUS_LOCKED)
Chris@909 560 token = Token.generate!(:action => 'api')
Chris@909 561 user.api_token = token
Chris@909 562 user.save
Chris@909 563
Chris@909 564 assert_nil User.find_by_api_key(token.value)
Chris@909 565 end
Chris@909 566
Chris@909 567 should "return the user if the key is found for an active user" do
Chris@909 568 user = User.generate_with_protected!(:status => User::STATUS_ACTIVE)
Chris@909 569 token = Token.generate!(:action => 'api')
Chris@909 570 user.api_token = token
Chris@909 571 user.save
Chris@909 572
Chris@909 573 assert_equal user, User.find_by_api_key(token.value)
Chris@909 574 end
Chris@909 575 end
Chris@909 576
Chris@909 577 def test_roles_for_project
Chris@909 578 # user with a role
Chris@909 579 roles = @jsmith.roles_for_project(Project.find(1))
Chris@909 580 assert_kind_of Role, roles.first
Chris@909 581 assert_equal "Manager", roles.first.name
Chris@909 582
Chris@909 583 # user with no role
Chris@909 584 assert_nil @dlopper.roles_for_project(Project.find(2)).detect {|role| role.member?}
Chris@909 585 end
Chris@909 586
Chris@909 587 def test_projects_by_role_for_user_with_role
Chris@909 588 user = User.find(2)
Chris@909 589 assert_kind_of Hash, user.projects_by_role
Chris@909 590 assert_equal 2, user.projects_by_role.size
Chris@909 591 assert_equal [1,5], user.projects_by_role[Role.find(1)].collect(&:id).sort
Chris@909 592 assert_equal [2], user.projects_by_role[Role.find(2)].collect(&:id).sort
Chris@909 593 end
Chris@909 594
Chris@909 595 def test_projects_by_role_for_user_with_no_role
Chris@909 596 user = User.generate!
Chris@909 597 assert_equal({}, user.projects_by_role)
Chris@909 598 end
Chris@909 599
Chris@909 600 def test_projects_by_role_for_anonymous
Chris@909 601 assert_equal({}, User.anonymous.projects_by_role)
Chris@909 602 end
Chris@909 603
Chris@909 604 def test_valid_notification_options
Chris@909 605 # without memberships
Chris@909 606 assert_equal 5, User.find(7).valid_notification_options.size
Chris@909 607 # with memberships
Chris@909 608 assert_equal 6, User.find(2).valid_notification_options.size
Chris@909 609 end
Chris@909 610
Chris@909 611 def test_valid_notification_options_class_method
Chris@909 612 assert_equal 5, User.valid_notification_options.size
Chris@909 613 assert_equal 5, User.valid_notification_options(User.find(7)).size
Chris@909 614 assert_equal 6, User.valid_notification_options(User.find(2)).size
Chris@909 615 end
Chris@909 616
Chris@909 617 def test_mail_notification_all
Chris@909 618 @jsmith.mail_notification = 'all'
Chris@909 619 @jsmith.notified_project_ids = []
Chris@909 620 @jsmith.save
Chris@909 621 @jsmith.reload
Chris@909 622 assert @jsmith.projects.first.recipients.include?(@jsmith.mail)
Chris@909 623 end
Chris@909 624
Chris@909 625 def test_mail_notification_selected
Chris@909 626 @jsmith.mail_notification = 'selected'
Chris@909 627 @jsmith.notified_project_ids = [1]
Chris@909 628 @jsmith.save
Chris@909 629 @jsmith.reload
Chris@909 630 assert Project.find(1).recipients.include?(@jsmith.mail)
Chris@909 631 end
Chris@909 632
Chris@909 633 def test_mail_notification_only_my_events
Chris@909 634 @jsmith.mail_notification = 'only_my_events'
Chris@909 635 @jsmith.notified_project_ids = []
Chris@909 636 @jsmith.save
Chris@909 637 @jsmith.reload
Chris@909 638 assert !@jsmith.projects.first.recipients.include?(@jsmith.mail)
Chris@909 639 end
Chris@909 640
Chris@909 641 def test_comments_sorting_preference
Chris@909 642 assert !@jsmith.wants_comments_in_reverse_order?
Chris@909 643 @jsmith.pref.comments_sorting = 'asc'
Chris@909 644 assert !@jsmith.wants_comments_in_reverse_order?
Chris@909 645 @jsmith.pref.comments_sorting = 'desc'
Chris@909 646 assert @jsmith.wants_comments_in_reverse_order?
Chris@909 647 end
Chris@909 648
Chris@909 649 def test_find_by_mail_should_be_case_insensitive
Chris@909 650 u = User.find_by_mail('JSmith@somenet.foo')
Chris@909 651 assert_not_nil u
Chris@909 652 assert_equal 'jsmith@somenet.foo', u.mail
Chris@909 653 end
Chris@909 654
Chris@909 655 def test_random_password
Chris@909 656 u = User.new
Chris@909 657 u.random_password
Chris@909 658 assert !u.password.blank?
Chris@909 659 assert !u.password_confirmation.blank?
Chris@909 660 end
Chris@909 661
Chris@909 662 context "#change_password_allowed?" do
Chris@909 663 should "be allowed if no auth source is set" do
Chris@909 664 user = User.generate_with_protected!
Chris@909 665 assert user.change_password_allowed?
Chris@909 666 end
Chris@909 667
Chris@909 668 should "delegate to the auth source" do
Chris@909 669 user = User.generate_with_protected!
Chris@909 670
Chris@909 671 allowed_auth_source = AuthSource.generate!
Chris@909 672 def allowed_auth_source.allow_password_changes?; true; end
Chris@909 673
Chris@909 674 denied_auth_source = AuthSource.generate!
Chris@909 675 def denied_auth_source.allow_password_changes?; false; end
Chris@909 676
Chris@909 677 assert user.change_password_allowed?
Chris@909 678
Chris@909 679 user.auth_source = allowed_auth_source
Chris@909 680 assert user.change_password_allowed?, "User not allowed to change password, though auth source does"
Chris@909 681
Chris@909 682 user.auth_source = denied_auth_source
Chris@909 683 assert !user.change_password_allowed?, "User allowed to change password, though auth source does not"
Chris@909 684 end
Chris@909 685
Chris@909 686 end
Chris@909 687
Chris@909 688 context "#allowed_to?" do
Chris@909 689 context "with a unique project" do
Chris@909 690 should "return false if project is archived" do
Chris@909 691 project = Project.find(1)
Chris@909 692 Project.any_instance.stubs(:status).returns(Project::STATUS_ARCHIVED)
Chris@909 693 assert ! @admin.allowed_to?(:view_issues, Project.find(1))
Chris@909 694 end
Chris@909 695
Chris@909 696 should "return false if related module is disabled" do
Chris@909 697 project = Project.find(1)
Chris@909 698 project.enabled_module_names = ["issue_tracking"]
Chris@909 699 assert @admin.allowed_to?(:add_issues, project)
Chris@909 700 assert ! @admin.allowed_to?(:view_wiki_pages, project)
Chris@909 701 end
Chris@909 702
Chris@909 703 should "authorize nearly everything for admin users" do
Chris@909 704 project = Project.find(1)
Chris@909 705 assert ! @admin.member_of?(project)
Chris@909 706 %w(edit_issues delete_issues manage_news manage_documents manage_wiki).each do |p|
Chris@909 707 assert @admin.allowed_to?(p.to_sym, project)
Chris@909 708 end
Chris@909 709 end
Chris@909 710
Chris@909 711 should "authorize normal users depending on their roles" do
Chris@909 712 project = Project.find(1)
Chris@909 713 assert @jsmith.allowed_to?(:delete_messages, project) #Manager
Chris@909 714 assert ! @dlopper.allowed_to?(:delete_messages, project) #Developper
Chris@909 715 end
Chris@909 716 end
Chris@909 717
Chris@909 718 context "with multiple projects" do
Chris@909 719 should "return false if array is empty" do
Chris@909 720 assert ! @admin.allowed_to?(:view_project, [])
Chris@909 721 end
Chris@909 722
Chris@909 723 should "return true only if user has permission on all these projects" do
Chris@909 724 assert @admin.allowed_to?(:view_project, Project.all)
Chris@909 725 assert ! @dlopper.allowed_to?(:view_project, Project.all) #cannot see Project(2)
Chris@909 726 assert @jsmith.allowed_to?(:edit_issues, @jsmith.projects) #Manager or Developer everywhere
Chris@909 727 assert ! @jsmith.allowed_to?(:delete_issue_watchers, @jsmith.projects) #Dev cannot delete_issue_watchers
Chris@909 728 end
Chris@909 729
Chris@909 730 should "behave correctly with arrays of 1 project" do
Chris@909 731 assert ! User.anonymous.allowed_to?(:delete_issues, [Project.first])
Chris@909 732 end
Chris@909 733 end
Chris@909 734
Chris@909 735 context "with options[:global]" do
Chris@909 736 should "authorize if user has at least one role that has this permission" do
Chris@909 737 @dlopper2 = User.find(5) #only Developper on a project, not Manager anywhere
Chris@909 738 @anonymous = User.find(6)
Chris@909 739 assert @jsmith.allowed_to?(:delete_issue_watchers, nil, :global => true)
Chris@909 740 assert ! @dlopper2.allowed_to?(:delete_issue_watchers, nil, :global => true)
Chris@909 741 assert @dlopper2.allowed_to?(:add_issues, nil, :global => true)
Chris@909 742 assert ! @anonymous.allowed_to?(:add_issues, nil, :global => true)
Chris@909 743 assert @anonymous.allowed_to?(:view_issues, nil, :global => true)
Chris@909 744 end
Chris@909 745 end
Chris@909 746 end
Chris@909 747
Chris@909 748 context "User#notify_about?" do
Chris@909 749 context "Issues" do
Chris@909 750 setup do
Chris@909 751 @project = Project.find(1)
Chris@909 752 @author = User.generate_with_protected!
Chris@909 753 @assignee = User.generate_with_protected!
Chris@909 754 @issue = Issue.generate_for_project!(@project, :assigned_to => @assignee, :author => @author)
Chris@909 755 end
Chris@909 756
Chris@909 757 should "be true for a user with :all" do
Chris@909 758 @author.update_attribute(:mail_notification, 'all')
Chris@909 759 assert @author.notify_about?(@issue)
Chris@909 760 end
Chris@909 761
Chris@909 762 should "be false for a user with :none" do
Chris@909 763 @author.update_attribute(:mail_notification, 'none')
Chris@909 764 assert ! @author.notify_about?(@issue)
Chris@909 765 end
Chris@909 766
Chris@909 767 should "be false for a user with :only_my_events and isn't an author, creator, or assignee" do
Chris@909 768 @user = User.generate_with_protected!(:mail_notification => 'only_my_events')
Chris@909 769 Member.create!(:user => @user, :project => @project, :role_ids => [1])
Chris@909 770 assert ! @user.notify_about?(@issue)
Chris@909 771 end
Chris@909 772
Chris@909 773 should "be true for a user with :only_my_events and is the author" do
Chris@909 774 @author.update_attribute(:mail_notification, 'only_my_events')
Chris@909 775 assert @author.notify_about?(@issue)
Chris@909 776 end
Chris@909 777
Chris@909 778 should "be true for a user with :only_my_events and is the assignee" do
Chris@909 779 @assignee.update_attribute(:mail_notification, 'only_my_events')
Chris@909 780 assert @assignee.notify_about?(@issue)
Chris@909 781 end
Chris@909 782
Chris@909 783 should "be true for a user with :only_assigned and is the assignee" do
Chris@909 784 @assignee.update_attribute(:mail_notification, 'only_assigned')
Chris@909 785 assert @assignee.notify_about?(@issue)
Chris@909 786 end
Chris@909 787
Chris@909 788 should "be false for a user with :only_assigned and is not the assignee" do
Chris@909 789 @author.update_attribute(:mail_notification, 'only_assigned')
Chris@909 790 assert ! @author.notify_about?(@issue)
Chris@909 791 end
Chris@909 792
Chris@909 793 should "be true for a user with :only_owner and is the author" do
Chris@909 794 @author.update_attribute(:mail_notification, 'only_owner')
Chris@909 795 assert @author.notify_about?(@issue)
Chris@909 796 end
Chris@909 797
Chris@909 798 should "be false for a user with :only_owner and is not the author" do
Chris@909 799 @assignee.update_attribute(:mail_notification, 'only_owner')
Chris@909 800 assert ! @assignee.notify_about?(@issue)
Chris@909 801 end
Chris@909 802
Chris@909 803 should "be true for a user with :selected and is the author" do
Chris@909 804 @author.update_attribute(:mail_notification, 'selected')
Chris@909 805 assert @author.notify_about?(@issue)
Chris@909 806 end
Chris@909 807
Chris@909 808 should "be true for a user with :selected and is the assignee" do
Chris@909 809 @assignee.update_attribute(:mail_notification, 'selected')
Chris@909 810 assert @assignee.notify_about?(@issue)
Chris@909 811 end
Chris@909 812
Chris@909 813 should "be false for a user with :selected and is not the author or assignee" do
Chris@909 814 @user = User.generate_with_protected!(:mail_notification => 'selected')
Chris@909 815 Member.create!(:user => @user, :project => @project, :role_ids => [1])
Chris@909 816 assert ! @user.notify_about?(@issue)
Chris@909 817 end
Chris@909 818 end
Chris@909 819
Chris@909 820 context "other events" do
Chris@909 821 should 'be added and tested'
Chris@909 822 end
Chris@909 823 end
Chris@909 824
Chris@909 825 def test_salt_unsalted_passwords
Chris@909 826 # Restore a user with an unsalted password
Chris@909 827 user = User.find(1)
Chris@909 828 user.salt = nil
Chris@909 829 user.hashed_password = User.hash_password("unsalted")
Chris@909 830 user.save!
Chris@909 831
Chris@909 832 User.salt_unsalted_passwords!
Chris@909 833
Chris@909 834 user.reload
Chris@909 835 # Salt added
Chris@909 836 assert !user.salt.blank?
Chris@909 837 # Password still valid
Chris@909 838 assert user.check_password?("unsalted")
Chris@909 839 assert_equal user, User.try_to_login(user.login, "unsalted")
Chris@909 840 end
Chris@909 841
Chris@909 842 if Object.const_defined?(:OpenID)
Chris@909 843
Chris@909 844 def test_setting_identity_url
Chris@909 845 normalized_open_id_url = 'http://example.com/'
Chris@909 846 u = User.new( :identity_url => 'http://example.com/' )
Chris@909 847 assert_equal normalized_open_id_url, u.identity_url
Chris@909 848 end
Chris@909 849
Chris@909 850 def test_setting_identity_url_without_trailing_slash
Chris@909 851 normalized_open_id_url = 'http://example.com/'
Chris@909 852 u = User.new( :identity_url => 'http://example.com' )
Chris@909 853 assert_equal normalized_open_id_url, u.identity_url
Chris@909 854 end
Chris@909 855
Chris@909 856 def test_setting_identity_url_without_protocol
Chris@909 857 normalized_open_id_url = 'http://example.com/'
Chris@909 858 u = User.new( :identity_url => 'example.com' )
Chris@909 859 assert_equal normalized_open_id_url, u.identity_url
Chris@909 860 end
Chris@909 861
Chris@909 862 def test_setting_blank_identity_url
Chris@909 863 u = User.new( :identity_url => 'example.com' )
Chris@909 864 u.identity_url = ''
Chris@909 865 assert u.identity_url.blank?
Chris@909 866 end
Chris@909 867
Chris@909 868 def test_setting_invalid_identity_url
Chris@909 869 u = User.new( :identity_url => 'this is not an openid url' )
Chris@909 870 assert u.identity_url.blank?
Chris@909 871 end
Chris@909 872
Chris@909 873 else
Chris@909 874 puts "Skipping openid tests."
Chris@909 875 end
Chris@909 876
Chris@909 877 end