Mercurial > hg > soundsoftware-site
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 |