comparison test/unit/user_test.rb @ 1526:404aa68d4227

Merge from live branch
author Chris Cannam
date Thu, 11 Sep 2014 12:46:20 +0100
parents dffacf8a6908
children
comparison
equal deleted inserted replaced
1493:a5f2bdf3b486 1526:404aa68d4227
1 # Redmine - project management software 1 # Redmine - project management software
2 # Copyright (C) 2006-2012 Jean-Philippe Lang 2 # Copyright (C) 2006-2014 Jean-Philippe Lang
3 # 3 #
4 # This program is free software; you can redistribute it and/or 4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License 5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2 6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version. 7 # of the License, or (at your option) any later version.
23 :projects_trackers, 23 :projects_trackers,
24 :watchers, 24 :watchers,
25 :issue_categories, :enumerations, :issues, 25 :issue_categories, :enumerations, :issues,
26 :journals, :journal_details, 26 :journals, :journal_details,
27 :groups_users, 27 :groups_users,
28 :enabled_modules, 28 :enabled_modules
29 :workflows
30 29
31 def setup 30 def setup
32 @admin = User.find(1) 31 @admin = User.find(1)
33 @jsmith = User.find(2) 32 @jsmith = User.find(2)
34 @dlopper = User.find(3) 33 @dlopper = User.find(3)
35 end 34 end
36 35
36 def test_sorted_scope_should_sort_user_by_display_name
37 assert_equal User.all.map(&:name).map(&:downcase).sort,
38 User.sorted.map(&:name).map(&:downcase)
39 end
40
37 def test_generate 41 def test_generate
38 User.generate!(:firstname => 'Testing connection') 42 User.generate!(:firstname => 'Testing connection')
39 User.generate!(:firstname => 'Testing connection') 43 User.generate!(:firstname => 'Testing connection')
40 assert_equal 2, User.count(:all, :conditions => {:firstname => 'Testing connection'}) 44 assert_equal 2, User.where(:firstname => 'Testing connection').count
41 end 45 end
42 46
43 def test_truth 47 def test_truth
44 assert_kind_of User, @jsmith 48 assert_kind_of User, @jsmith
45 end 49 end
63 assert !user.valid? 67 assert !user.valid?
64 68
65 user.login = "x" * (User::LOGIN_LENGTH_LIMIT) 69 user.login = "x" * (User::LOGIN_LENGTH_LIMIT)
66 assert user.valid? 70 assert user.valid?
67 assert user.save 71 assert user.save
72 end
73
74 def test_generate_password_should_respect_minimum_password_length
75 with_settings :password_min_length => 15 do
76 user = User.generate!(:generate_password => true)
77 assert user.password.length >= 15
78 end
79 end
80
81 def test_generate_password_should_not_generate_password_with_less_than_10_characters
82 with_settings :password_min_length => 4 do
83 user = User.generate!(:generate_password => true)
84 assert user.password.length >= 10
85 end
86 end
87
88 def test_generate_password_on_create_should_set_password
89 user = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo")
90 user.login = "newuser"
91 user.generate_password = true
92 assert user.save
93
94 password = user.password
95 assert user.check_password?(password)
96 end
97
98 def test_generate_password_on_update_should_update_password
99 user = User.find(2)
100 hash = user.hashed_password
101 user.generate_password = true
102 assert user.save
103
104 password = user.password
105 assert user.check_password?(password)
106 assert_not_equal hash, user.reload.hashed_password
68 end 107 end
69 108
70 def test_create 109 def test_create
71 user = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo") 110 user = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo")
72 111
98 def test_user_login_should_be_case_insensitive 137 def test_user_login_should_be_case_insensitive
99 u = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo") 138 u = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo")
100 u.login = 'newuser' 139 u.login = 'newuser'
101 u.password, u.password_confirmation = "password", "password" 140 u.password, u.password_confirmation = "password", "password"
102 assert u.save 141 assert u.save
103 u = User.new(:firstname => "Similar", :lastname => "User", :mail => "similaruser@somenet.foo") 142 u = User.new(:firstname => "Similar", :lastname => "User",
143 :mail => "similaruser@somenet.foo")
104 u.login = 'NewUser' 144 u.login = 'NewUser'
105 u.password, u.password_confirmation = "password", "password" 145 u.password, u.password_confirmation = "password", "password"
106 assert !u.save 146 assert !u.save
107 assert_include I18n.translate('activerecord.errors.messages.taken'), u.errors[:login] 147 assert_include I18n.translate('activerecord.errors.messages.taken'), u.errors[:login]
108 end 148 end
141 user.firstname = "firstname" 181 user.firstname = "firstname"
142 assert user.save, "Save failed" 182 assert user.save, "Save failed"
143 end 183 end
144 184
145 def test_destroy_should_delete_members_and_roles 185 def test_destroy_should_delete_members_and_roles
146 members = Member.find_all_by_user_id(2) 186 members = Member.where(:user_id => 2)
147 ms = members.size 187 ms = members.count
148 rs = members.collect(&:roles).flatten.size 188 rs = members.collect(&:roles).flatten.size
149 189 assert ms > 0
190 assert rs > 0
150 assert_difference 'Member.count', - ms do 191 assert_difference 'Member.count', - ms do
151 assert_difference 'MemberRole.count', - rs do 192 assert_difference 'MemberRole.count', - rs do
152 User.find(2).destroy 193 User.find(2).destroy
153 end 194 end
154 end 195 end
155 196 assert_nil User.find_by_id(2)
156 assert_nil User.find_by_id(2) 197 assert_equal 0, Member.where(:user_id => 2).count
157 assert Member.find_all_by_user_id(2).empty?
158 end 198 end
159 199
160 def test_destroy_should_update_attachments 200 def test_destroy_should_update_attachments
161 attachment = Attachment.create!(:container => Project.find(1), 201 attachment = Attachment.create!(:container => Project.find(1),
162 :file => uploaded_test_file("testfile.txt", "text/plain"), 202 :file => uploaded_test_file("testfile.txt", "text/plain"),
167 assert_equal User.anonymous, attachment.reload.author 207 assert_equal User.anonymous, attachment.reload.author
168 end 208 end
169 209
170 def test_destroy_should_update_comments 210 def test_destroy_should_update_comments
171 comment = Comment.create!( 211 comment = Comment.create!(
172 :commented => News.create!(:project_id => 1, :author_id => 1, :title => 'foo', :description => 'foo'), 212 :commented => News.create!(:project_id => 1,
213 :author_id => 1, :title => 'foo', :description => 'foo'),
173 :author => User.find(2), 214 :author => User.find(2),
174 :comments => 'foo' 215 :comments => 'foo'
175 ) 216 )
176 217
177 User.find(2).destroy 218 User.find(2).destroy
178 assert_nil User.find_by_id(2) 219 assert_nil User.find_by_id(2)
179 assert_equal User.anonymous, comment.reload.author 220 assert_equal User.anonymous, comment.reload.author
180 end 221 end
181 222
182 def test_destroy_should_update_issues 223 def test_destroy_should_update_issues
183 issue = Issue.create!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'foo') 224 issue = Issue.create!(:project_id => 1, :author_id => 2,
225 :tracker_id => 1, :subject => 'foo')
184 226
185 User.find(2).destroy 227 User.find(2).destroy
186 assert_nil User.find_by_id(2) 228 assert_nil User.find_by_id(2)
187 assert_equal User.anonymous, issue.reload.author 229 assert_equal User.anonymous, issue.reload.author
188 end 230 end
189 231
190 def test_destroy_should_unassign_issues 232 def test_destroy_should_unassign_issues
191 issue = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :subject => 'foo', :assigned_to_id => 2) 233 issue = Issue.create!(:project_id => 1, :author_id => 1,
234 :tracker_id => 1, :subject => 'foo', :assigned_to_id => 2)
192 235
193 User.find(2).destroy 236 User.find(2).destroy
194 assert_nil User.find_by_id(2) 237 assert_nil User.find_by_id(2)
195 assert_nil issue.reload.assigned_to 238 assert_nil issue.reload.assigned_to
196 end 239 end
197 240
198 def test_destroy_should_update_journals 241 def test_destroy_should_update_journals
199 issue = Issue.create!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'foo') 242 issue = Issue.create!(:project_id => 1, :author_id => 2,
243 :tracker_id => 1, :subject => 'foo')
200 issue.init_journal(User.find(2), "update") 244 issue.init_journal(User.find(2), "update")
201 issue.save! 245 issue.save!
202 246
203 User.find(2).destroy 247 User.find(2).destroy
204 assert_nil User.find_by_id(2) 248 assert_nil User.find_by_id(2)
205 assert_equal User.anonymous, issue.journals.first.reload.user 249 assert_equal User.anonymous, issue.journals.first.reload.user
206 end 250 end
207 251
208 def test_destroy_should_update_journal_details_old_value 252 def test_destroy_should_update_journal_details_old_value
209 issue = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :subject => 'foo', :assigned_to_id => 2) 253 issue = Issue.create!(:project_id => 1, :author_id => 1,
254 :tracker_id => 1, :subject => 'foo', :assigned_to_id => 2)
210 issue.init_journal(User.find(1), "update") 255 issue.init_journal(User.find(1), "update")
211 issue.assigned_to_id = nil 256 issue.assigned_to_id = nil
212 assert_difference 'JournalDetail.count' do 257 assert_difference 'JournalDetail.count' do
213 issue.save! 258 issue.save!
214 end 259 end
215 journal_detail = JournalDetail.first(:order => 'id DESC') 260 journal_detail = JournalDetail.order('id DESC').first
216 assert_equal '2', journal_detail.old_value 261 assert_equal '2', journal_detail.old_value
217 262
218 User.find(2).destroy 263 User.find(2).destroy
219 assert_nil User.find_by_id(2) 264 assert_nil User.find_by_id(2)
220 assert_equal User.anonymous.id.to_s, journal_detail.reload.old_value 265 assert_equal User.anonymous.id.to_s, journal_detail.reload.old_value
221 end 266 end
222 267
223 def test_destroy_should_update_journal_details_value 268 def test_destroy_should_update_journal_details_value
224 issue = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :subject => 'foo') 269 issue = Issue.create!(:project_id => 1, :author_id => 1,
270 :tracker_id => 1, :subject => 'foo')
225 issue.init_journal(User.find(1), "update") 271 issue.init_journal(User.find(1), "update")
226 issue.assigned_to_id = 2 272 issue.assigned_to_id = 2
227 assert_difference 'JournalDetail.count' do 273 assert_difference 'JournalDetail.count' do
228 issue.save! 274 issue.save!
229 end 275 end
230 journal_detail = JournalDetail.first(:order => 'id DESC') 276 journal_detail = JournalDetail.order('id DESC').first
231 assert_equal '2', journal_detail.value 277 assert_equal '2', journal_detail.value
232 278
233 User.find(2).destroy 279 User.find(2).destroy
234 assert_nil User.find_by_id(2) 280 assert_nil User.find_by_id(2)
235 assert_equal User.anonymous.id.to_s, journal_detail.reload.value 281 assert_equal User.anonymous.id.to_s, journal_detail.reload.value
236 end 282 end
237 283
238 def test_destroy_should_update_messages 284 def test_destroy_should_update_messages
239 board = Board.create!(:project_id => 1, :name => 'Board', :description => 'Board') 285 board = Board.create!(:project_id => 1, :name => 'Board', :description => 'Board')
240 message = Message.create!(:board_id => board.id, :author_id => 2, :subject => 'foo', :content => 'foo') 286 message = Message.create!(:board_id => board.id, :author_id => 2,
241 287 :subject => 'foo', :content => 'foo')
242 User.find(2).destroy 288 User.find(2).destroy
243 assert_nil User.find_by_id(2) 289 assert_nil User.find_by_id(2)
244 assert_equal User.anonymous, message.reload.author 290 assert_equal User.anonymous, message.reload.author
245 end 291 end
246 292
247 def test_destroy_should_update_news 293 def test_destroy_should_update_news
248 news = News.create!(:project_id => 1, :author_id => 2, :title => 'foo', :description => 'foo') 294 news = News.create!(:project_id => 1, :author_id => 2,
249 295 :title => 'foo', :description => 'foo')
250 User.find(2).destroy 296 User.find(2).destroy
251 assert_nil User.find_by_id(2) 297 assert_nil User.find_by_id(2)
252 assert_equal User.anonymous, news.reload.author 298 assert_equal User.anonymous, news.reload.author
253 end 299 end
254 300
255 def test_destroy_should_delete_private_queries 301 def test_destroy_should_delete_private_queries
256 query = Query.new(:name => 'foo', :is_public => false) 302 query = Query.new(:name => 'foo', :visibility => Query::VISIBILITY_PRIVATE)
257 query.project_id = 1 303 query.project_id = 1
258 query.user_id = 2 304 query.user_id = 2
259 query.save! 305 query.save!
260 306
261 User.find(2).destroy 307 User.find(2).destroy
262 assert_nil User.find_by_id(2) 308 assert_nil User.find_by_id(2)
263 assert_nil Query.find_by_id(query.id) 309 assert_nil Query.find_by_id(query.id)
264 end 310 end
265 311
266 def test_destroy_should_update_public_queries 312 def test_destroy_should_update_public_queries
267 query = Query.new(:name => 'foo', :is_public => true) 313 query = Query.new(:name => 'foo', :visibility => Query::VISIBILITY_PUBLIC)
268 query.project_id = 1 314 query.project_id = 1
269 query.user_id = 2 315 query.user_id = 2
270 query.save! 316 query.save!
271 317
272 User.find(2).destroy 318 User.find(2).destroy
273 assert_nil User.find_by_id(2) 319 assert_nil User.find_by_id(2)
274 assert_equal User.anonymous, query.reload.user 320 assert_equal User.anonymous, query.reload.user
275 end 321 end
276 322
277 def test_destroy_should_update_time_entries 323 def test_destroy_should_update_time_entries
278 entry = TimeEntry.new(:hours => '2', :spent_on => Date.today, :activity => TimeEntryActivity.create!(:name => 'foo')) 324 entry = TimeEntry.new(:hours => '2', :spent_on => Date.today,
325 :activity => TimeEntryActivity.create!(:name => 'foo'))
279 entry.project_id = 1 326 entry.project_id = 1
280 entry.user_id = 2 327 entry.user_id = 2
281 entry.save! 328 entry.save!
282 329
283 User.find(2).destroy 330 User.find(2).destroy
292 assert_nil User.find_by_id(2) 339 assert_nil User.find_by_id(2)
293 assert_nil Token.find_by_id(token.id) 340 assert_nil Token.find_by_id(token.id)
294 end 341 end
295 342
296 def test_destroy_should_delete_watchers 343 def test_destroy_should_delete_watchers
297 issue = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :subject => 'foo') 344 issue = Issue.create!(:project_id => 1, :author_id => 1,
345 :tracker_id => 1, :subject => 'foo')
298 watcher = Watcher.create!(:user_id => 2, :watchable => issue) 346 watcher = Watcher.create!(:user_id => 2, :watchable => issue)
299 347
300 User.find(2).destroy 348 User.find(2).destroy
301 assert_nil User.find_by_id(2) 349 assert_nil User.find_by_id(2)
302 assert_nil Watcher.find_by_id(watcher.id) 350 assert_nil Watcher.find_by_id(watcher.id)
304 352
305 def test_destroy_should_update_wiki_contents 353 def test_destroy_should_update_wiki_contents
306 wiki_content = WikiContent.create!( 354 wiki_content = WikiContent.create!(
307 :text => 'foo', 355 :text => 'foo',
308 :author_id => 2, 356 :author_id => 2,
309 :page => WikiPage.create!(:title => 'Foo', :wiki => Wiki.create!(:project_id => 1, :start_page => 'Start')) 357 :page => WikiPage.create!(:title => 'Foo',
358 :wiki => Wiki.create!(:project_id => 3,
359 :start_page => 'Start'))
310 ) 360 )
311 wiki_content.text = 'bar' 361 wiki_content.text = 'bar'
312 assert_difference 'WikiContent::Version.count' do 362 assert_difference 'WikiContent::Version.count' do
313 wiki_content.save! 363 wiki_content.save!
314 end 364 end
361 411
362 def test_validate_mail_notification_inclusion 412 def test_validate_mail_notification_inclusion
363 u = User.new 413 u = User.new
364 u.mail_notification = 'foo' 414 u.mail_notification = 'foo'
365 u.save 415 u.save
366 assert_not_nil u.errors[:mail_notification] 416 assert_not_equal [], u.errors[:mail_notification]
367 end
368
369 context "User#try_to_login" do
370 should "fall-back to case-insensitive if user login is not found as-typed." do
371 user = User.try_to_login("AdMin", "admin")
372 assert_kind_of User, user
373 assert_equal "admin", user.login
374 end
375
376 should "select the exact matching user first" do
377 case_sensitive_user = User.generate! do |user|
378 user.password = "admin123"
379 end
380 # bypass validations to make it appear like existing data
381 case_sensitive_user.update_attribute(:login, 'ADMIN')
382
383 user = User.try_to_login("ADMIN", "admin123")
384 assert_kind_of User, user
385 assert_equal "ADMIN", user.login
386
387 end
388 end 417 end
389 418
390 def test_password 419 def test_password
391 user = User.try_to_login("admin", "admin") 420 user = User.try_to_login("admin", "admin")
392 assert_kind_of User, user 421 assert_kind_of User, user
399 assert_equal "admin", user.login 428 assert_equal "admin", user.login
400 end 429 end
401 430
402 def test_validate_password_length 431 def test_validate_password_length
403 with_settings :password_min_length => '100' do 432 with_settings :password_min_length => '100' do
404 user = User.new(:firstname => "new100", :lastname => "user100", :mail => "newuser100@somenet.foo") 433 user = User.new(:firstname => "new100",
434 :lastname => "user100", :mail => "newuser100@somenet.foo")
405 user.login = "newuser100" 435 user.login = "newuser100"
406 user.password, user.password_confirmation = "password100", "password100" 436 user.password, user.password_confirmation = "password100", "password100"
407 assert !user.save 437 assert !user.save
408 assert_equal 1, user.errors.count 438 assert_equal 1, user.errors.count
409 end 439 end
410 end 440 end
411 441
412 def test_name_format 442 def test_name_format
413 assert_equal 'John S.', @jsmith.name(:firstname_lastinitial) 443 assert_equal 'John S.', @jsmith.name(:firstname_lastinitial)
414 assert_equal 'Smith, John', @jsmith.name(:lastname_coma_firstname) 444 assert_equal 'Smith, John', @jsmith.name(:lastname_coma_firstname)
445 assert_equal 'J. Smith', @jsmith.name(:firstinitial_lastname)
446 assert_equal 'J.-P. Lang', User.new(:firstname => 'Jean-Philippe', :lastname => 'Lang').name(:firstinitial_lastname)
447 end
448
449 def test_name_should_use_setting_as_default_format
415 with_settings :user_format => :firstname_lastname do 450 with_settings :user_format => :firstname_lastname do
416 assert_equal 'John Smith', @jsmith.reload.name 451 assert_equal 'John Smith', @jsmith.reload.name
417 end 452 end
418 with_settings :user_format => :username do 453 with_settings :user_format => :username do
419 assert_equal 'jsmith', @jsmith.reload.name 454 assert_equal 'jsmith', @jsmith.reload.name
454 assert_equal '2012-05-15', User.find(1).time_to_date(time).to_s 489 assert_equal '2012-05-15', User.find(1).time_to_date(time).to_s
455 end 490 end
456 491
457 def test_fields_for_order_statement_should_return_fields_according_user_format_setting 492 def test_fields_for_order_statement_should_return_fields_according_user_format_setting
458 with_settings :user_format => 'lastname_coma_firstname' do 493 with_settings :user_format => 'lastname_coma_firstname' do
459 assert_equal ['users.lastname', 'users.firstname', 'users.id'], User.fields_for_order_statement 494 assert_equal ['users.lastname', 'users.firstname', 'users.id'],
460 end 495 User.fields_for_order_statement
461 end 496 end
462 497 end
498
463 def test_fields_for_order_statement_width_table_name_should_prepend_table_name 499 def test_fields_for_order_statement_width_table_name_should_prepend_table_name
464 with_settings :user_format => 'lastname_firstname' do 500 with_settings :user_format => 'lastname_firstname' do
465 assert_equal ['authors.lastname', 'authors.firstname', 'authors.id'], User.fields_for_order_statement('authors') 501 assert_equal ['authors.lastname', 'authors.firstname', 'authors.id'],
466 end 502 User.fields_for_order_statement('authors')
467 end 503 end
468 504 end
505
469 def test_fields_for_order_statement_with_blank_format_should_return_default 506 def test_fields_for_order_statement_with_blank_format_should_return_default
470 with_settings :user_format => '' do 507 with_settings :user_format => '' do
471 assert_equal ['users.firstname', 'users.lastname', 'users.id'], User.fields_for_order_statement 508 assert_equal ['users.firstname', 'users.lastname', 'users.id'],
472 end 509 User.fields_for_order_statement
473 end 510 end
474 511 end
512
475 def test_fields_for_order_statement_with_invalid_format_should_return_default 513 def test_fields_for_order_statement_with_invalid_format_should_return_default
476 with_settings :user_format => 'foo' do 514 with_settings :user_format => 'foo' do
477 assert_equal ['users.firstname', 'users.lastname', 'users.id'], User.fields_for_order_statement 515 assert_equal ['users.firstname', 'users.lastname', 'users.id'],
478 end 516 User.fields_for_order_statement
479 end 517 end
480 518 end
481 def test_lock 519
482 user = User.try_to_login("jsmith", "jsmith") 520 test ".try_to_login with good credentials should return the user" do
483 assert_equal @jsmith, user 521 user = User.try_to_login("admin", "admin")
484 522 assert_kind_of User, user
523 assert_equal "admin", user.login
524 end
525
526 test ".try_to_login with wrong credentials should return nil" do
527 assert_nil User.try_to_login("admin", "foo")
528 end
529
530 def test_try_to_login_with_locked_user_should_return_nil
485 @jsmith.status = User::STATUS_LOCKED 531 @jsmith.status = User::STATUS_LOCKED
486 assert @jsmith.save 532 @jsmith.save!
487 533
488 user = User.try_to_login("jsmith", "jsmith") 534 user = User.try_to_login("jsmith", "jsmith")
489 assert_equal nil, user 535 assert_equal nil, user
490 end 536 end
491 537
492 context ".try_to_login" do 538 def test_try_to_login_with_locked_user_and_not_active_only_should_return_user
493 context "with good credentials" do 539 @jsmith.status = User::STATUS_LOCKED
494 should "return the user" do 540 @jsmith.save!
495 user = User.try_to_login("admin", "admin") 541
496 assert_kind_of User, user 542 user = User.try_to_login("jsmith", "jsmith", false)
497 assert_equal "admin", user.login 543 assert_equal @jsmith, user
498 end 544 end
499 end 545
500 546 test ".try_to_login should fall-back to case-insensitive if user login is not found as-typed" do
501 context "with wrong credentials" do 547 user = User.try_to_login("AdMin", "admin")
502 should "return nil" do 548 assert_kind_of User, user
503 assert_nil User.try_to_login("admin", "foo") 549 assert_equal "admin", user.login
504 end 550 end
505 end 551
552 test ".try_to_login should select the exact matching user first" do
553 case_sensitive_user = User.generate! do |user|
554 user.password = "admin123"
555 end
556 # bypass validations to make it appear like existing data
557 case_sensitive_user.update_attribute(:login, 'ADMIN')
558
559 user = User.try_to_login("ADMIN", "admin123")
560 assert_kind_of User, user
561 assert_equal "ADMIN", user.login
506 end 562 end
507 563
508 if ldap_configured? 564 if ldap_configured?
509 context "#try_to_login using LDAP" do 565 context "#try_to_login using LDAP" do
510 context "with failed connection to the LDAP server" do 566 context "with failed connection to the LDAP server" do
578 @auth_source = AuthSourceLdap.find(1) 634 @auth_source = AuthSourceLdap.find(1)
579 @auth_source.account = "uid=$login,ou=Person,dc=redmine,dc=org" 635 @auth_source.account = "uid=$login,ou=Person,dc=redmine,dc=org"
580 @auth_source.account_password = '' 636 @auth_source.account_password = ''
581 @auth_source.save! 637 @auth_source.save!
582 end 638 end
583 639
584 context "with a successful authentication" do 640 context "with a successful authentication" do
585 should "create a new user account if it doesn't exist" do 641 should "create a new user account if it doesn't exist" do
586 assert_difference('User.count') do 642 assert_difference('User.count') do
587 user = User.try_to_login('example1', '123456') 643 user = User.try_to_login('example1', '123456')
588 assert_kind_of User, user 644 assert_kind_of User, user
589 end 645 end
590 end 646 end
591 end 647 end
592 648
593 context "with an unsuccessful authentication" do 649 context "with an unsuccessful authentication" do
594 should "return nil" do 650 should "return nil" do
595 assert_nil User.try_to_login('example1', '11111') 651 assert_nil User.try_to_login('example1', '11111')
596 end 652 end
597 end 653 end
644 key2 = @jsmith.api_key 700 key2 = @jsmith.api_key
645 assert_equal key1, key2 701 assert_equal key1, key2
646 end 702 end
647 end 703 end
648 704
649 context "User#api_key" do 705 test "#api_key should generate a new one if the user doesn't have one" do
650 should "generate a new one if the user doesn't have one" do 706 user = User.generate!(:api_token => nil)
651 user = User.generate!(:api_token => nil) 707 assert_nil user.api_token
652 assert_nil user.api_token 708
653 709 key = user.api_key
654 key = user.api_key 710 assert_equal 40, key.length
655 assert_equal 40, key.length 711 user.reload
656 user.reload 712 assert_equal key, user.api_key
657 assert_equal key, user.api_key 713 end
658 end 714
659 715 test "#api_key should return the existing api token value" do
660 should "return the existing api token value" do 716 user = User.generate!
661 user = User.generate! 717 token = Token.create!(:action => 'api')
662 token = Token.create!(:action => 'api') 718 user.api_token = token
663 user.api_token = token 719 assert user.save
664 assert user.save 720
665 721 assert_equal token.value, user.api_key
666 assert_equal token.value, user.api_key 722 end
667 end 723
668 end 724 test "#find_by_api_key should return nil if no matching key is found" do
669 725 assert_nil User.find_by_api_key('zzzzzzzzz')
670 context "User#find_by_api_key" do 726 end
671 should "return nil if no matching key is found" do 727
672 assert_nil User.find_by_api_key('zzzzzzzzz') 728 test "#find_by_api_key should return nil if the key is found for an inactive user" do
673 end 729 user = User.generate!
674 730 user.status = User::STATUS_LOCKED
675 should "return nil if the key is found for an inactive user" do 731 token = Token.create!(:action => 'api')
676 user = User.generate! 732 user.api_token = token
677 user.status = User::STATUS_LOCKED 733 user.save
678 token = Token.create!(:action => 'api') 734
679 user.api_token = token 735 assert_nil User.find_by_api_key(token.value)
680 user.save 736 end
681 737
682 assert_nil User.find_by_api_key(token.value) 738 test "#find_by_api_key should return the user if the key is found for an active user" do
683 end 739 user = User.generate!
684 740 token = Token.create!(:action => 'api')
685 should "return the user if the key is found for an active user" do 741 user.api_token = token
686 user = User.generate! 742 user.save
687 token = Token.create!(:action => 'api') 743
688 user.api_token = token 744 assert_equal user, User.find_by_api_key(token.value)
689 user.save
690
691 assert_equal user, User.find_by_api_key(token.value)
692 end
693 end 745 end
694 746
695 def test_default_admin_account_changed_should_return_false_if_account_was_not_changed 747 def test_default_admin_account_changed_should_return_false_if_account_was_not_changed
696 user = User.find_by_login("admin") 748 user = User.find_by_login("admin")
697 user.password = "admin" 749 user.password = "admin"
720 def test_default_admin_account_changed_should_return_true_if_account_does_not_exist 772 def test_default_admin_account_changed_should_return_true_if_account_does_not_exist
721 user = User.find_by_login("admin") 773 user = User.find_by_login("admin")
722 user.destroy 774 user.destroy
723 775
724 assert_equal true, User.default_admin_account_changed? 776 assert_equal true, User.default_admin_account_changed?
777 end
778
779 def test_membership_with_project_should_return_membership
780 project = Project.find(1)
781
782 membership = @jsmith.membership(project)
783 assert_kind_of Member, membership
784 assert_equal @jsmith, membership.user
785 assert_equal project, membership.project
786 end
787
788 def test_membership_with_project_id_should_return_membership
789 project = Project.find(1)
790
791 membership = @jsmith.membership(1)
792 assert_kind_of Member, membership
793 assert_equal @jsmith, membership.user
794 assert_equal project, membership.project
795 end
796
797 def test_membership_for_non_member_should_return_nil
798 project = Project.find(1)
799
800 user = User.generate!
801 membership = user.membership(1)
802 assert_nil membership
725 end 803 end
726 804
727 def test_roles_for_project 805 def test_roles_for_project
728 # user with a role 806 # user with a role
729 roles = @jsmith.roles_for_project(Project.find(1)) 807 roles = @jsmith.roles_for_project(Project.find(1))
814 u.random_password 892 u.random_password
815 assert !u.password.blank? 893 assert !u.password.blank?
816 assert !u.password_confirmation.blank? 894 assert !u.password_confirmation.blank?
817 end 895 end
818 896
819 context "#change_password_allowed?" do 897 test "#change_password_allowed? should be allowed if no auth source is set" do
820 should "be allowed if no auth source is set" do 898 user = User.generate!
821 user = User.generate! 899 assert user.change_password_allowed?
822 assert user.change_password_allowed? 900 end
823 end 901
824 902 test "#change_password_allowed? should delegate to the auth source" do
825 should "delegate to the auth source" do 903 user = User.generate!
826 user = User.generate! 904
827 905 allowed_auth_source = AuthSource.generate!
828 allowed_auth_source = AuthSource.generate! 906 def allowed_auth_source.allow_password_changes?; true; end
829 def allowed_auth_source.allow_password_changes?; true; end 907
830 908 denied_auth_source = AuthSource.generate!
831 denied_auth_source = AuthSource.generate! 909 def denied_auth_source.allow_password_changes?; false; end
832 def denied_auth_source.allow_password_changes?; false; end 910
833 911 assert user.change_password_allowed?
834 assert user.change_password_allowed? 912
835 913 user.auth_source = allowed_auth_source
836 user.auth_source = allowed_auth_source 914 assert user.change_password_allowed?, "User not allowed to change password, though auth source does"
837 assert user.change_password_allowed?, "User not allowed to change password, though auth source does" 915
838 916 user.auth_source = denied_auth_source
839 user.auth_source = denied_auth_source 917 assert !user.change_password_allowed?, "User allowed to change password, though auth source does not"
840 assert !user.change_password_allowed?, "User allowed to change password, though auth source does not"
841 end
842 end 918 end
843 919
844 def test_own_account_deletable_should_be_true_with_unsubscrive_enabled 920 def test_own_account_deletable_should_be_true_with_unsubscrive_enabled
845 with_settings :unsubscribe => '1' do 921 with_settings :unsubscribe => '1' do
846 assert_equal true, User.find(2).own_account_deletable? 922 assert_equal true, User.find(2).own_account_deletable?
899 end 975 end
900 976
901 should "authorize nearly everything for admin users" do 977 should "authorize nearly everything for admin users" do
902 project = Project.find(1) 978 project = Project.find(1)
903 assert ! @admin.member_of?(project) 979 assert ! @admin.member_of?(project)
904 %w(edit_issues delete_issues manage_news manage_documents manage_wiki).each do |p| 980 %w(edit_issues delete_issues manage_news add_documents manage_wiki).each do |p|
905 assert_equal true, @admin.allowed_to?(p.to_sym, project) 981 assert_equal true, @admin.allowed_to?(p.to_sym, project)
906 end 982 end
907 end 983 end
908 984
909 should "authorize normal users depending on their roles" do 985 should "authorize normal users depending on their roles" do
1012 @user = User.generate!(:mail_notification => 'selected') 1088 @user = User.generate!(:mail_notification => 'selected')
1013 Member.create!(:user => @user, :project => @project, :role_ids => [1]) 1089 Member.create!(:user => @user, :project => @project, :role_ids => [1])
1014 assert ! @user.notify_about?(@issue) 1090 assert ! @user.notify_about?(@issue)
1015 end 1091 end
1016 end 1092 end
1017 1093 end
1018 context "other events" do 1094
1019 should 'be added and tested' 1095 def test_notify_about_news
1096 user = User.generate!
1097 news = News.new
1098
1099 User::MAIL_NOTIFICATION_OPTIONS.map(&:first).each do |option|
1100 user.mail_notification = option
1101 assert_equal (option != 'none'), user.notify_about?(news)
1020 end 1102 end
1021 end 1103 end
1022 1104
1023 def test_salt_unsalted_passwords 1105 def test_salt_unsalted_passwords
1024 # Restore a user with an unsalted password 1106 # Restore a user with an unsalted password
1036 assert user.check_password?("unsalted") 1118 assert user.check_password?("unsalted")
1037 assert_equal user, User.try_to_login(user.login, "unsalted") 1119 assert_equal user, User.try_to_login(user.login, "unsalted")
1038 end 1120 end
1039 1121
1040 if Object.const_defined?(:OpenID) 1122 if Object.const_defined?(:OpenID)
1041 1123 def test_setting_identity_url
1042 def test_setting_identity_url 1124 normalized_open_id_url = 'http://example.com/'
1043 normalized_open_id_url = 'http://example.com/' 1125 u = User.new( :identity_url => 'http://example.com/' )
1044 u = User.new( :identity_url => 'http://example.com/' ) 1126 assert_equal normalized_open_id_url, u.identity_url
1045 assert_equal normalized_open_id_url, u.identity_url 1127 end
1046 end 1128
1047 1129 def test_setting_identity_url_without_trailing_slash
1048 def test_setting_identity_url_without_trailing_slash 1130 normalized_open_id_url = 'http://example.com/'
1049 normalized_open_id_url = 'http://example.com/' 1131 u = User.new( :identity_url => 'http://example.com' )
1050 u = User.new( :identity_url => 'http://example.com' ) 1132 assert_equal normalized_open_id_url, u.identity_url
1051 assert_equal normalized_open_id_url, u.identity_url 1133 end
1052 end 1134
1053 1135 def test_setting_identity_url_without_protocol
1054 def test_setting_identity_url_without_protocol 1136 normalized_open_id_url = 'http://example.com/'
1055 normalized_open_id_url = 'http://example.com/' 1137 u = User.new( :identity_url => 'example.com' )
1056 u = User.new( :identity_url => 'example.com' ) 1138 assert_equal normalized_open_id_url, u.identity_url
1057 assert_equal normalized_open_id_url, u.identity_url 1139 end
1058 end 1140
1059 1141 def test_setting_blank_identity_url
1060 def test_setting_blank_identity_url 1142 u = User.new( :identity_url => 'example.com' )
1061 u = User.new( :identity_url => 'example.com' ) 1143 u.identity_url = ''
1062 u.identity_url = '' 1144 assert u.identity_url.blank?
1063 assert u.identity_url.blank? 1145 end
1064 end 1146
1065 1147 def test_setting_invalid_identity_url
1066 def test_setting_invalid_identity_url 1148 u = User.new( :identity_url => 'this is not an openid url' )
1067 u = User.new( :identity_url => 'this is not an openid url' ) 1149 assert u.identity_url.blank?
1068 assert u.identity_url.blank? 1150 end
1069 end
1070
1071 else 1151 else
1072 puts "Skipping openid tests." 1152 puts "Skipping openid tests."
1073 end 1153 end
1074
1075 end 1154 end