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