You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

user_test.rb 42KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269
  1. # Redmine - project management software
  2. # Copyright (C) 2006-2017 Jean-Philippe Lang
  3. #
  4. # This program is free software; you can redistribute it and/or
  5. # modify it under the terms of the GNU General Public License
  6. # as published by the Free Software Foundation; either version 2
  7. # of the License, or (at your option) any later version.
  8. #
  9. # This program is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. # GNU General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU General Public License
  15. # along with this program; if not, write to the Free Software
  16. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  17. require File.expand_path('../../test_helper', __FILE__)
  18. class UserTest < ActiveSupport::TestCase
  19. fixtures :users, :email_addresses, :members, :projects, :roles, :member_roles, :auth_sources,
  20. :trackers, :issue_statuses,
  21. :projects_trackers,
  22. :watchers,
  23. :issue_categories, :enumerations, :issues,
  24. :journals, :journal_details,
  25. :groups_users,
  26. :enabled_modules,
  27. :tokens
  28. include Redmine::I18n
  29. def setup
  30. @admin = User.find(1)
  31. @jsmith = User.find(2)
  32. @dlopper = User.find(3)
  33. User.current = nil
  34. end
  35. def test_admin_scope_without_args_should_return_admin_users
  36. users = User.admin.to_a
  37. assert users.any?
  38. assert users.all? {|u| u.admin == true}
  39. end
  40. def test_admin_scope_with_true_should_return_admin_users
  41. users = User.admin(true).to_a
  42. assert users.any?
  43. assert users.all? {|u| u.admin == true}
  44. end
  45. def test_admin_scope_with_false_should_return_non_admin_users
  46. users = User.admin(false).to_a
  47. assert users.any?
  48. assert users.all? {|u| u.admin == false}
  49. end
  50. def test_sorted_scope_should_sort_user_by_display_name
  51. # Use .active to ignore anonymous with localized display name
  52. assert_equal User.active.map(&:name).map(&:downcase).sort,
  53. User.active.sorted.map(&:name).map(&:downcase)
  54. end
  55. def test_generate
  56. User.generate!(:firstname => 'Testing connection')
  57. User.generate!(:firstname => 'Testing connection')
  58. assert_equal 2, User.where(:firstname => 'Testing connection').count
  59. end
  60. def test_truth
  61. assert_kind_of User, @jsmith
  62. end
  63. def test_should_validate_status
  64. user = User.new
  65. user.status = 0
  66. assert !user.save
  67. assert_include I18n.translate('activerecord.errors.messages.invalid'), user.errors[:status]
  68. end
  69. def test_mail_should_be_stripped
  70. u = User.new
  71. u.mail = " foo@bar.com "
  72. assert_equal "foo@bar.com", u.mail
  73. end
  74. def test_should_create_email_address
  75. u = User.new(:firstname => "new", :lastname => "user")
  76. u.login = "create_email_address"
  77. u.mail = "defaultemail@somenet.foo"
  78. assert u.save
  79. u.reload
  80. assert u.email_address
  81. assert_equal "defaultemail@somenet.foo", u.email_address.address
  82. assert_equal true, u.email_address.is_default
  83. assert_equal true, u.email_address.notify
  84. end
  85. def test_should_not_create_user_without_mail
  86. set_language_if_valid 'en'
  87. u = User.new(:firstname => "new", :lastname => "user")
  88. u.login = "user_without_mail"
  89. assert !u.save
  90. assert_equal ["Email #{I18n.translate('activerecord.errors.messages.blank')}"], u.errors.full_messages
  91. end
  92. def test_should_not_create_user_with_blank_mail
  93. set_language_if_valid 'en'
  94. u = User.new(:firstname => "new", :lastname => "user")
  95. u.login = "user_with_blank_mail"
  96. u.mail = ''
  97. assert !u.save
  98. assert_equal ["Email #{I18n.translate('activerecord.errors.messages.blank')}"], u.errors.full_messages
  99. end
  100. def test_should_not_update_user_with_blank_mail
  101. set_language_if_valid 'en'
  102. u = User.find(2)
  103. u.mail = ''
  104. assert !u.save
  105. assert_equal ["Email #{I18n.translate('activerecord.errors.messages.blank')}"], u.errors.full_messages
  106. end
  107. def test_login_length_validation
  108. user = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo")
  109. user.login = "x" * (User::LOGIN_LENGTH_LIMIT+1)
  110. assert !user.valid?
  111. user.login = "x" * (User::LOGIN_LENGTH_LIMIT)
  112. assert user.valid?
  113. assert user.save
  114. end
  115. def test_generate_password_should_respect_minimum_password_length
  116. with_settings :password_min_length => 15 do
  117. user = User.generate!(:generate_password => true)
  118. assert user.password.length >= 15
  119. end
  120. end
  121. def test_generate_password_should_not_generate_password_with_less_than_10_characters
  122. with_settings :password_min_length => 4 do
  123. user = User.generate!(:generate_password => true)
  124. assert user.password.length >= 10
  125. end
  126. end
  127. def test_generate_password_on_create_should_set_password
  128. user = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo")
  129. user.login = "newuser"
  130. user.generate_password = true
  131. assert user.save
  132. password = user.password
  133. assert user.check_password?(password)
  134. end
  135. def test_generate_password_on_update_should_update_password
  136. user = User.find(2)
  137. hash = user.hashed_password
  138. user.generate_password = true
  139. assert user.save
  140. password = user.password
  141. assert user.check_password?(password)
  142. assert_not_equal hash, user.reload.hashed_password
  143. end
  144. def test_create
  145. user = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo")
  146. user.login = "jsmith"
  147. user.password, user.password_confirmation = "password", "password"
  148. # login uniqueness
  149. assert !user.save
  150. assert_equal 1, user.errors.count
  151. user.login = "newuser"
  152. user.password, user.password_confirmation = "password", "pass"
  153. # password confirmation
  154. assert !user.save
  155. assert_equal 1, user.errors.count
  156. user.password, user.password_confirmation = "password", "password"
  157. assert user.save
  158. end
  159. def test_user_before_create_should_set_the_mail_notification_to_the_default_setting
  160. @user1 = User.generate!
  161. assert_equal 'only_my_events', @user1.mail_notification
  162. with_settings :default_notification_option => 'all' do
  163. @user2 = User.generate!
  164. assert_equal 'all', @user2.mail_notification
  165. end
  166. end
  167. def test_user_login_should_be_case_insensitive
  168. u = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo")
  169. u.login = 'newuser'
  170. u.password, u.password_confirmation = "password", "password"
  171. assert u.save
  172. u = User.new(:firstname => "Similar", :lastname => "User",
  173. :mail => "similaruser@somenet.foo")
  174. u.login = 'NewUser'
  175. u.password, u.password_confirmation = "password", "password"
  176. assert !u.save
  177. assert_include I18n.translate('activerecord.errors.messages.taken'), u.errors[:login]
  178. end
  179. def test_mail_uniqueness_should_not_be_case_sensitive
  180. set_language_if_valid 'en'
  181. u = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo")
  182. u.login = 'newuser1'
  183. u.password, u.password_confirmation = "password", "password"
  184. assert u.save
  185. u = User.new(:firstname => "new", :lastname => "user", :mail => "newUser@Somenet.foo")
  186. u.login = 'newuser2'
  187. u.password, u.password_confirmation = "password", "password"
  188. assert !u.save
  189. assert_include "Email #{I18n.translate('activerecord.errors.messages.taken')}", u.errors.full_messages
  190. end
  191. def test_update
  192. assert_equal "admin", @admin.login
  193. @admin.login = "john"
  194. assert @admin.save, @admin.errors.full_messages.join("; ")
  195. @admin.reload
  196. assert_equal "john", @admin.login
  197. end
  198. def test_update_should_not_fail_for_legacy_user_with_different_case_logins
  199. u1 = User.new(:firstname => "new", :lastname => "user", :mail => "newuser1@somenet.foo")
  200. u1.login = 'newuser1'
  201. assert u1.save
  202. u2 = User.new(:firstname => "new", :lastname => "user", :mail => "newuser2@somenet.foo")
  203. u2.login = 'newuser1'
  204. assert u2.save(:validate => false)
  205. user = User.find(u2.id)
  206. user.firstname = "firstname"
  207. assert user.save, "Save failed"
  208. end
  209. def test_destroy_should_delete_members_and_roles
  210. members = Member.where(:user_id => 2)
  211. ms = members.count
  212. rs = members.collect(&:roles).flatten.size
  213. assert ms > 0
  214. assert rs > 0
  215. assert_difference 'Member.count', - ms do
  216. assert_difference 'MemberRole.count', - rs do
  217. User.find(2).destroy
  218. end
  219. end
  220. assert_nil User.find_by_id(2)
  221. assert_equal 0, Member.where(:user_id => 2).count
  222. end
  223. def test_destroy_should_update_attachments
  224. attachment = Attachment.create!(:container => Project.find(1),
  225. :file => uploaded_test_file("testfile.txt", "text/plain"),
  226. :author_id => 2)
  227. User.find(2).destroy
  228. assert_nil User.find_by_id(2)
  229. assert_equal User.anonymous, attachment.reload.author
  230. end
  231. def test_destroy_should_update_comments
  232. comment = Comment.create!(
  233. :commented => News.create!(:project_id => 1,
  234. :author_id => 1, :title => 'foo', :description => 'foo'),
  235. :author => User.find(2),
  236. :comments => 'foo'
  237. )
  238. User.find(2).destroy
  239. assert_nil User.find_by_id(2)
  240. assert_equal User.anonymous, comment.reload.author
  241. end
  242. def test_destroy_should_update_issues
  243. issue = Issue.create!(:project_id => 1, :author_id => 2,
  244. :tracker_id => 1, :subject => 'foo')
  245. User.find(2).destroy
  246. assert_nil User.find_by_id(2)
  247. assert_equal User.anonymous, issue.reload.author
  248. end
  249. def test_destroy_should_unassign_issues
  250. issue = Issue.create!(:project_id => 1, :author_id => 1,
  251. :tracker_id => 1, :subject => 'foo', :assigned_to_id => 2)
  252. User.find(2).destroy
  253. assert_nil User.find_by_id(2)
  254. assert_nil issue.reload.assigned_to
  255. end
  256. def test_destroy_should_update_journals
  257. issue = Issue.create!(:project_id => 1, :author_id => 2,
  258. :tracker_id => 1, :subject => 'foo')
  259. issue.init_journal(User.find(2), "update")
  260. issue.save!
  261. User.find(2).destroy
  262. assert_nil User.find_by_id(2)
  263. assert_equal User.anonymous, issue.journals.first.reload.user
  264. end
  265. def test_destroy_should_update_journal_details_old_value
  266. issue = Issue.create!(:project_id => 1, :author_id => 1,
  267. :tracker_id => 1, :subject => 'foo', :assigned_to_id => 2)
  268. issue.init_journal(User.find(1), "update")
  269. issue.assigned_to_id = nil
  270. assert_difference 'JournalDetail.count' do
  271. issue.save!
  272. end
  273. journal_detail = JournalDetail.order('id DESC').first
  274. assert_equal '2', journal_detail.old_value
  275. User.find(2).destroy
  276. assert_nil User.find_by_id(2)
  277. assert_equal User.anonymous.id.to_s, journal_detail.reload.old_value
  278. end
  279. def test_destroy_should_update_journal_details_value
  280. issue = Issue.create!(:project_id => 1, :author_id => 1,
  281. :tracker_id => 1, :subject => 'foo')
  282. issue.init_journal(User.find(1), "update")
  283. issue.assigned_to_id = 2
  284. assert_difference 'JournalDetail.count' do
  285. issue.save!
  286. end
  287. journal_detail = JournalDetail.order('id DESC').first
  288. assert_equal '2', journal_detail.value
  289. User.find(2).destroy
  290. assert_nil User.find_by_id(2)
  291. assert_equal User.anonymous.id.to_s, journal_detail.reload.value
  292. end
  293. def test_destroy_should_update_messages
  294. board = Board.create!(:project_id => 1, :name => 'Board', :description => 'Board')
  295. message = Message.create!(:board_id => board.id, :author_id => 2,
  296. :subject => 'foo', :content => 'foo')
  297. User.find(2).destroy
  298. assert_nil User.find_by_id(2)
  299. assert_equal User.anonymous, message.reload.author
  300. end
  301. def test_destroy_should_update_news
  302. news = News.create!(:project_id => 1, :author_id => 2,
  303. :title => 'foo', :description => 'foo')
  304. User.find(2).destroy
  305. assert_nil User.find_by_id(2)
  306. assert_equal User.anonymous, news.reload.author
  307. end
  308. def test_destroy_should_delete_private_queries
  309. query = Query.new(:name => 'foo', :visibility => Query::VISIBILITY_PRIVATE)
  310. query.project_id = 1
  311. query.user_id = 2
  312. query.save!
  313. User.find(2).destroy
  314. assert_nil User.find_by_id(2)
  315. assert_nil Query.find_by_id(query.id)
  316. end
  317. def test_destroy_should_update_public_queries
  318. query = Query.new(:name => 'foo', :visibility => Query::VISIBILITY_PUBLIC)
  319. query.project_id = 1
  320. query.user_id = 2
  321. query.save!
  322. User.find(2).destroy
  323. assert_nil User.find_by_id(2)
  324. assert_equal User.anonymous, query.reload.user
  325. end
  326. def test_destroy_should_update_time_entries
  327. entry = TimeEntry.new(:hours => '2', :spent_on => Date.today,
  328. :activity => TimeEntryActivity.create!(:name => 'foo'))
  329. entry.project_id = 1
  330. entry.user_id = 2
  331. entry.save!
  332. User.find(2).destroy
  333. assert_nil User.find_by_id(2)
  334. assert_equal User.anonymous, entry.reload.user
  335. end
  336. def test_destroy_should_delete_tokens
  337. token = Token.create!(:user_id => 2, :value => 'foo')
  338. User.find(2).destroy
  339. assert_nil User.find_by_id(2)
  340. assert_nil Token.find_by_id(token.id)
  341. end
  342. def test_destroy_should_delete_watchers
  343. issue = Issue.create!(:project_id => 1, :author_id => 1,
  344. :tracker_id => 1, :subject => 'foo')
  345. watcher = Watcher.create!(:user_id => 2, :watchable => issue)
  346. User.find(2).destroy
  347. assert_nil User.find_by_id(2)
  348. assert_nil Watcher.find_by_id(watcher.id)
  349. end
  350. def test_destroy_should_update_wiki_contents
  351. wiki_content = WikiContent.create!(
  352. :text => 'foo',
  353. :author_id => 2,
  354. :page => WikiPage.create!(:title => 'Foo',
  355. :wiki => Wiki.create!(:project_id => 3,
  356. :start_page => 'Start'))
  357. )
  358. wiki_content.text = 'bar'
  359. assert_difference 'WikiContent::Version.count' do
  360. wiki_content.save!
  361. end
  362. User.find(2).destroy
  363. assert_nil User.find_by_id(2)
  364. assert_equal User.anonymous, wiki_content.reload.author
  365. wiki_content.versions.each do |version|
  366. assert_equal User.anonymous, version.reload.author
  367. end
  368. end
  369. def test_destroy_should_nullify_issue_categories
  370. category = IssueCategory.create!(:project_id => 1, :assigned_to_id => 2, :name => 'foo')
  371. User.find(2).destroy
  372. assert_nil User.find_by_id(2)
  373. assert_nil category.reload.assigned_to_id
  374. end
  375. def test_destroy_should_nullify_changesets
  376. changeset = Changeset.create!(
  377. :repository => Repository::Subversion.create!(
  378. :project_id => 1,
  379. :url => 'file:///tmp',
  380. :identifier => 'tmp'
  381. ),
  382. :revision => '12',
  383. :committed_on => Time.now,
  384. :committer => 'jsmith'
  385. )
  386. assert_equal 2, changeset.user_id
  387. User.find(2).destroy
  388. assert_nil User.find_by_id(2)
  389. assert_nil changeset.reload.user_id
  390. end
  391. def test_anonymous_user_should_not_be_destroyable
  392. assert_no_difference 'User.count' do
  393. assert_equal false, User.anonymous.destroy
  394. end
  395. end
  396. def test_password_change_should_destroy_tokens
  397. recovery_token = Token.create!(:user_id => 2, :action => 'recovery')
  398. autologin_token = Token.create!(:user_id => 2, :action => 'autologin')
  399. user = User.find(2)
  400. user.password, user.password_confirmation = "a new password", "a new password"
  401. assert user.save
  402. assert_nil Token.find_by_id(recovery_token.id)
  403. assert_nil Token.find_by_id(autologin_token.id)
  404. end
  405. def test_mail_change_should_destroy_tokens
  406. recovery_token = Token.create!(:user_id => 2, :action => 'recovery')
  407. autologin_token = Token.create!(:user_id => 2, :action => 'autologin')
  408. user = User.find(2)
  409. user.mail = "user@somwehere.com"
  410. assert user.save
  411. assert_nil Token.find_by_id(recovery_token.id)
  412. assert_equal autologin_token, Token.find_by_id(autologin_token.id)
  413. end
  414. def test_change_on_other_fields_should_not_destroy_tokens
  415. recovery_token = Token.create!(:user_id => 2, :action => 'recovery')
  416. autologin_token = Token.create!(:user_id => 2, :action => 'autologin')
  417. user = User.find(2)
  418. user.firstname = "Bobby"
  419. assert user.save
  420. assert_equal recovery_token, Token.find_by_id(recovery_token.id)
  421. assert_equal autologin_token, Token.find_by_id(autologin_token.id)
  422. end
  423. def test_validate_login_presence
  424. @admin.login = ""
  425. assert !@admin.save
  426. assert_equal 1, @admin.errors.count
  427. end
  428. def test_validate_mail_notification_inclusion
  429. u = User.new
  430. u.mail_notification = 'foo'
  431. u.save
  432. assert_not_equal [], u.errors[:mail_notification]
  433. end
  434. def test_password
  435. user = User.try_to_login("admin", "admin")
  436. assert_kind_of User, user
  437. assert_equal "admin", user.login
  438. user.password = "hello123"
  439. assert user.save
  440. user = User.try_to_login("admin", "hello123")
  441. assert_kind_of User, user
  442. assert_equal "admin", user.login
  443. end
  444. def test_validate_password_length
  445. with_settings :password_min_length => '100' do
  446. user = User.new(:firstname => "new100",
  447. :lastname => "user100", :mail => "newuser100@somenet.foo")
  448. user.login = "newuser100"
  449. user.password, user.password_confirmation = "password100", "password100"
  450. assert !user.save
  451. assert_equal 1, user.errors.count
  452. end
  453. end
  454. def test_name_format
  455. assert_equal 'John S.', @jsmith.name(:firstname_lastinitial)
  456. assert_equal 'Smith, John', @jsmith.name(:lastname_comma_firstname)
  457. assert_equal 'J. Smith', @jsmith.name(:firstinitial_lastname)
  458. assert_equal 'J.-P. Lang', User.new(:firstname => 'Jean-Philippe', :lastname => 'Lang').name(:firstinitial_lastname)
  459. end
  460. def test_name_should_use_setting_as_default_format
  461. with_settings :user_format => :firstname_lastname do
  462. assert_equal 'John Smith', @jsmith.reload.name
  463. end
  464. with_settings :user_format => :username do
  465. assert_equal 'jsmith', @jsmith.reload.name
  466. end
  467. with_settings :user_format => :lastname do
  468. assert_equal 'Smith', @jsmith.reload.name
  469. end
  470. end
  471. def test_today_should_return_the_day_according_to_user_time_zone
  472. preference = User.find(1).pref
  473. date = Date.new(2012, 05, 15)
  474. time = Time.gm(2012, 05, 15, 23, 30).utc # 2012-05-15 23:30 UTC
  475. Date.stubs(:today).returns(date)
  476. Time.stubs(:now).returns(time)
  477. preference.update_attribute :time_zone, 'Baku' # UTC+4
  478. assert_equal '2012-05-16', User.find(1).today.to_s
  479. preference.update_attribute :time_zone, 'La Paz' # UTC-4
  480. assert_equal '2012-05-15', User.find(1).today.to_s
  481. preference.update_attribute :time_zone, ''
  482. assert_equal '2012-05-15', User.find(1).today.to_s
  483. end
  484. def test_time_to_date_should_return_the_date_according_to_user_time_zone
  485. preference = User.find(1).pref
  486. time = Time.gm(2012, 05, 15, 23, 30).utc # 2012-05-15 23:30 UTC
  487. preference.update_attribute :time_zone, 'Baku' # UTC+4
  488. assert_equal '2012-05-16', User.find(1).time_to_date(time).to_s
  489. preference.update_attribute :time_zone, 'La Paz' # UTC-4
  490. assert_equal '2012-05-15', User.find(1).time_to_date(time).to_s
  491. preference.update_attribute :time_zone, ''
  492. assert_equal '2012-05-15', User.find(1).time_to_date(time).to_s
  493. end
  494. def test_fields_for_order_statement_should_return_fields_according_user_format_setting
  495. with_settings :user_format => 'lastname_comma_firstname' do
  496. assert_equal ['users.lastname', 'users.firstname', 'users.id'],
  497. User.fields_for_order_statement
  498. end
  499. end
  500. def test_fields_for_order_statement_width_table_name_should_prepend_table_name
  501. with_settings :user_format => 'lastname_firstname' do
  502. assert_equal ['authors.lastname', 'authors.firstname', 'authors.id'],
  503. User.fields_for_order_statement('authors')
  504. end
  505. end
  506. def test_fields_for_order_statement_with_blank_format_should_return_default
  507. with_settings :user_format => '' do
  508. assert_equal ['users.firstname', 'users.lastname', 'users.id'],
  509. User.fields_for_order_statement
  510. end
  511. end
  512. def test_fields_for_order_statement_with_invalid_format_should_return_default
  513. with_settings :user_format => 'foo' do
  514. assert_equal ['users.firstname', 'users.lastname', 'users.id'],
  515. User.fields_for_order_statement
  516. end
  517. end
  518. test ".try_to_login with good credentials should return the user" do
  519. user = User.try_to_login("admin", "admin")
  520. assert_kind_of User, user
  521. assert_equal "admin", user.login
  522. end
  523. test ".try_to_login with wrong credentials should return nil" do
  524. assert_nil User.try_to_login("admin", "foo")
  525. end
  526. def test_try_to_login_with_locked_user_should_return_nil
  527. @jsmith.status = User::STATUS_LOCKED
  528. @jsmith.save!
  529. user = User.try_to_login("jsmith", "jsmith")
  530. assert_nil user
  531. end
  532. def test_try_to_login_with_locked_user_and_not_active_only_should_return_user
  533. @jsmith.status = User::STATUS_LOCKED
  534. @jsmith.save!
  535. user = User.try_to_login("jsmith", "jsmith", false)
  536. assert_equal @jsmith, user
  537. end
  538. test ".try_to_login should fall-back to case-insensitive if user login is not found as-typed" do
  539. user = User.try_to_login("AdMin", "admin")
  540. assert_kind_of User, user
  541. assert_equal "admin", user.login
  542. end
  543. test ".try_to_login should select the exact matching user first" do
  544. case_sensitive_user = User.generate! do |user|
  545. user.password = "admin123"
  546. end
  547. # bypass validations to make it appear like existing data
  548. case_sensitive_user.update_attribute(:login, 'ADMIN')
  549. user = User.try_to_login("ADMIN", "admin123")
  550. assert_kind_of User, user
  551. assert_equal "ADMIN", user.login
  552. end
  553. if ldap_configured?
  554. test "#try_to_login using LDAP with failed connection to the LDAP server" do
  555. auth_source = AuthSourceLdap.find(1)
  556. AuthSource.any_instance.stubs(:initialize_ldap_con).raises(Net::LDAP::Error, 'Cannot connect')
  557. assert_nil User.try_to_login('edavis', 'wrong')
  558. end
  559. test "#try_to_login using LDAP" do
  560. assert_nil User.try_to_login('edavis', 'wrong')
  561. end
  562. test "#try_to_login using LDAP binding with user's account" do
  563. auth_source = AuthSourceLdap.find(1)
  564. auth_source.account = "uid=$login,ou=Person,dc=redmine,dc=org"
  565. auth_source.account_password = ''
  566. auth_source.save!
  567. ldap_user = User.new(:mail => 'example1@redmine.org', :firstname => 'LDAP', :lastname => 'user', :auth_source_id => 1)
  568. ldap_user.login = 'example1'
  569. ldap_user.save!
  570. assert_equal ldap_user, User.try_to_login('example1', '123456')
  571. assert_nil User.try_to_login('example1', '11111')
  572. end
  573. test "#try_to_login using LDAP on the fly registration" do
  574. AuthSourceLdap.find(1).update_attribute :onthefly_register, true
  575. assert_difference('User.count') do
  576. assert User.try_to_login('edavis', '123456')
  577. end
  578. assert_no_difference('User.count') do
  579. assert User.try_to_login('edavis', '123456')
  580. end
  581. assert_nil User.try_to_login('example1', '11111')
  582. end
  583. test "#try_to_login using LDAP on the fly registration and binding with user's account" do
  584. auth_source = AuthSourceLdap.find(1)
  585. auth_source.update_attribute :onthefly_register, true
  586. auth_source = AuthSourceLdap.find(1)
  587. auth_source.account = "uid=$login,ou=Person,dc=redmine,dc=org"
  588. auth_source.account_password = ''
  589. auth_source.save!
  590. assert_difference('User.count') do
  591. assert User.try_to_login('example1', '123456')
  592. end
  593. assert_no_difference('User.count') do
  594. assert User.try_to_login('example1', '123456')
  595. end
  596. assert_nil User.try_to_login('example1', '11111')
  597. end
  598. else
  599. puts "Skipping LDAP tests."
  600. end
  601. def test_create_anonymous
  602. AnonymousUser.delete_all
  603. anon = User.anonymous
  604. assert !anon.new_record?
  605. assert_kind_of AnonymousUser, anon
  606. end
  607. def test_ensure_single_anonymous_user
  608. AnonymousUser.delete_all
  609. anon1 = User.anonymous
  610. assert !anon1.new_record?
  611. assert_kind_of AnonymousUser, anon1
  612. anon2 = AnonymousUser.create(
  613. :lastname => 'Anonymous', :firstname => '',
  614. :login => '', :status => 0)
  615. assert_equal 1, anon2.errors.count
  616. end
  617. def test_rss_key
  618. assert_nil @jsmith.rss_token
  619. key = @jsmith.rss_key
  620. assert_equal 40, key.length
  621. @jsmith.reload
  622. assert_equal key, @jsmith.rss_key
  623. end
  624. def test_rss_key_should_not_be_generated_twice
  625. assert_difference 'Token.count', 1 do
  626. key1 = @jsmith.rss_key
  627. key2 = @jsmith.rss_key
  628. assert_equal key1, key2
  629. end
  630. end
  631. def test_api_key_should_not_be_generated_twice
  632. assert_difference 'Token.count', 1 do
  633. key1 = @jsmith.api_key
  634. key2 = @jsmith.api_key
  635. assert_equal key1, key2
  636. end
  637. end
  638. test "#api_key should generate a new one if the user doesn't have one" do
  639. user = User.generate!(:api_token => nil)
  640. assert_nil user.api_token
  641. key = user.api_key
  642. assert_equal 40, key.length
  643. user.reload
  644. assert_equal key, user.api_key
  645. end
  646. test "#api_key should return the existing api token value" do
  647. user = User.generate!
  648. token = Token.create!(:action => 'api')
  649. user.api_token = token
  650. assert user.save
  651. assert_equal token.value, user.api_key
  652. end
  653. test "#find_by_api_key should return nil if no matching key is found" do
  654. assert_nil User.find_by_api_key('zzzzzzzzz')
  655. end
  656. test "#find_by_api_key should return nil if the key is found for an inactive user" do
  657. user = User.generate!
  658. user.status = User::STATUS_LOCKED
  659. token = Token.create!(:action => 'api')
  660. user.api_token = token
  661. user.save
  662. assert_nil User.find_by_api_key(token.value)
  663. end
  664. test "#find_by_api_key should return the user if the key is found for an active user" do
  665. user = User.generate!
  666. token = Token.create!(:action => 'api')
  667. user.api_token = token
  668. user.save
  669. assert_equal user, User.find_by_api_key(token.value)
  670. end
  671. def test_default_admin_account_changed_should_return_false_if_account_was_not_changed
  672. user = User.find_by_login("admin")
  673. user.password = "admin"
  674. assert user.save(:validate => false)
  675. assert_equal false, User.default_admin_account_changed?
  676. end
  677. def test_default_admin_account_changed_should_return_true_if_password_was_changed
  678. user = User.find_by_login("admin")
  679. user.password = "newpassword"
  680. user.save!
  681. assert_equal true, User.default_admin_account_changed?
  682. end
  683. def test_default_admin_account_changed_should_return_true_if_account_is_disabled
  684. user = User.find_by_login("admin")
  685. user.password = "admin"
  686. user.status = User::STATUS_LOCKED
  687. assert user.save(:validate => false)
  688. assert_equal true, User.default_admin_account_changed?
  689. end
  690. def test_default_admin_account_changed_should_return_true_if_account_does_not_exist
  691. user = User.find_by_login("admin")
  692. user.destroy
  693. assert_equal true, User.default_admin_account_changed?
  694. end
  695. def test_membership_with_project_should_return_membership
  696. project = Project.find(1)
  697. membership = @jsmith.membership(project)
  698. assert_kind_of Member, membership
  699. assert_equal @jsmith, membership.user
  700. assert_equal project, membership.project
  701. end
  702. def test_membership_with_project_id_should_return_membership
  703. project = Project.find(1)
  704. membership = @jsmith.membership(1)
  705. assert_kind_of Member, membership
  706. assert_equal @jsmith, membership.user
  707. assert_equal project, membership.project
  708. end
  709. def test_membership_for_non_member_should_return_nil
  710. project = Project.find(1)
  711. user = User.generate!
  712. membership = user.membership(1)
  713. assert_nil membership
  714. end
  715. def test_roles_for_project_with_member_on_public_project_should_return_roles_and_non_member
  716. roles = @jsmith.roles_for_project(Project.find(1))
  717. assert_kind_of Role, roles.first
  718. assert_equal ["Manager"], roles.map(&:name)
  719. end
  720. def test_roles_for_project_with_member_on_private_project_should_return_roles
  721. Project.find(1).update_attribute :is_public, false
  722. roles = @jsmith.roles_for_project(Project.find(1))
  723. assert_kind_of Role, roles.first
  724. assert_equal ["Manager"], roles.map(&:name)
  725. end
  726. def test_roles_for_project_with_non_member_with_public_project_should_return_non_member
  727. set_language_if_valid 'en'
  728. roles = User.find(8).roles_for_project(Project.find(1))
  729. assert_equal ["Non member"], roles.map(&:name)
  730. end
  731. def test_roles_for_project_with_non_member_with_public_project_and_override_should_return_override_roles
  732. project = Project.find(1)
  733. Member.create!(:project => project, :principal => Group.non_member, :role_ids => [1, 2])
  734. roles = User.find(8).roles_for_project(project)
  735. assert_equal ["Developer", "Manager"], roles.map(&:name).sort
  736. end
  737. def test_roles_for_project_with_non_member_with_private_project_should_return_no_roles
  738. Project.find(1).update_attribute :is_public, false
  739. roles = User.find(8).roles_for_project(Project.find(1))
  740. assert_equal [], roles.map(&:name)
  741. end
  742. def test_roles_for_project_with_non_member_with_private_project_and_override_should_return_no_roles
  743. project = Project.find(1)
  744. project.update_attribute :is_public, false
  745. Member.create!(:project => project, :principal => Group.non_member, :role_ids => [1, 2])
  746. roles = User.find(8).roles_for_project(project)
  747. assert_equal [], roles.map(&:name).sort
  748. end
  749. def test_roles_for_project_with_anonymous_with_public_project_should_return_anonymous
  750. set_language_if_valid 'en'
  751. roles = User.anonymous.roles_for_project(Project.find(1))
  752. assert_equal ["Anonymous"], roles.map(&:name)
  753. end
  754. def test_roles_for_project_with_anonymous_with_public_project_and_override_should_return_override_roles
  755. project = Project.find(1)
  756. Member.create!(:project => project, :principal => Group.anonymous, :role_ids => [1, 2])
  757. roles = User.anonymous.roles_for_project(project)
  758. assert_equal ["Developer", "Manager"], roles.map(&:name).sort
  759. end
  760. def test_roles_for_project_with_anonymous_with_private_project_should_return_no_roles
  761. Project.find(1).update_attribute :is_public, false
  762. roles = User.anonymous.roles_for_project(Project.find(1))
  763. assert_equal [], roles.map(&:name)
  764. end
  765. def test_roles_for_project_with_anonymous_with_private_project_and_override_should_return_no_roles
  766. project = Project.find(1)
  767. project.update_attribute :is_public, false
  768. Member.create!(:project => project, :principal => Group.anonymous, :role_ids => [1, 2])
  769. roles = User.anonymous.roles_for_project(project)
  770. assert_equal [], roles.map(&:name).sort
  771. end
  772. def test_roles_for_project_should_be_unique
  773. m = Member.new(:user_id => 1, :project_id => 1)
  774. m.member_roles.build(:role_id => 1)
  775. m.member_roles.build(:role_id => 1)
  776. m.save!
  777. user = User.find(1)
  778. project = Project.find(1)
  779. assert_equal 1, user.roles_for_project(project).size
  780. assert_equal [1], user.roles_for_project(project).map(&:id)
  781. end
  782. def test_projects_by_role_for_user_with_role
  783. user = User.find(2)
  784. assert_kind_of Hash, user.projects_by_role
  785. assert_equal 2, user.projects_by_role.size
  786. assert_equal [1,5], user.projects_by_role[Role.find(1)].collect(&:id).sort
  787. assert_equal [2], user.projects_by_role[Role.find(2)].collect(&:id).sort
  788. end
  789. def test_project_ids_by_role_should_not_poison_cache_when_first_called_from_chained_scopes
  790. user = User.find(2)
  791. project = Project.find(1)
  792. project.children.visible(user)
  793. assert_equal [1, 2, 5], user.project_ids_by_role.values.flatten.sort
  794. end
  795. def test_accessing_projects_by_role_with_no_projects_should_return_an_empty_array
  796. user = User.find(2)
  797. assert_equal [], user.projects_by_role[Role.find(3)]
  798. # should not update the hash
  799. assert_nil user.projects_by_role.values.detect(&:blank?)
  800. end
  801. def test_projects_by_role_for_user_with_no_role
  802. user = User.generate!
  803. assert_equal({}, user.projects_by_role)
  804. end
  805. def test_projects_by_role_for_anonymous
  806. assert_equal({}, User.anonymous.projects_by_role)
  807. end
  808. def test_valid_notification_options
  809. # without memberships
  810. assert_equal 5, User.find(7).valid_notification_options.size
  811. # with memberships
  812. assert_equal 6, User.find(2).valid_notification_options.size
  813. end
  814. def test_valid_notification_options_class_method
  815. assert_equal 5, User.valid_notification_options.size
  816. assert_equal 5, User.valid_notification_options(User.find(7)).size
  817. assert_equal 6, User.valid_notification_options(User.find(2)).size
  818. end
  819. def test_notified_project_ids_setter_should_coerce_to_unique_integer_array
  820. @jsmith.notified_project_ids = ["1", "123", "2u", "wrong", "12", 6, 12, -35, ""]
  821. assert_equal [1, 123, 2, 12, 6], @jsmith.notified_projects_ids
  822. end
  823. def test_mail_notification_all
  824. @jsmith.mail_notification = 'all'
  825. @jsmith.notified_project_ids = []
  826. @jsmith.save
  827. @jsmith.reload
  828. assert @jsmith.projects.first.recipients.include?(@jsmith.mail)
  829. end
  830. def test_mail_notification_selected
  831. @jsmith.mail_notification = 'selected'
  832. @jsmith.notified_project_ids = [1]
  833. @jsmith.save
  834. @jsmith.reload
  835. assert Project.find(1).recipients.include?(@jsmith.mail)
  836. end
  837. def test_mail_notification_only_my_events
  838. @jsmith.mail_notification = 'only_my_events'
  839. @jsmith.notified_project_ids = []
  840. @jsmith.save
  841. @jsmith.reload
  842. assert !@jsmith.projects.first.recipients.include?(@jsmith.mail)
  843. end
  844. def test_comments_sorting_preference
  845. assert !@jsmith.wants_comments_in_reverse_order?
  846. @jsmith.pref.comments_sorting = 'asc'
  847. assert !@jsmith.wants_comments_in_reverse_order?
  848. @jsmith.pref.comments_sorting = 'desc'
  849. assert @jsmith.wants_comments_in_reverse_order?
  850. end
  851. def test_find_by_mail_should_be_case_insensitive
  852. u = User.find_by_mail('JSmith@somenet.foo')
  853. assert_not_nil u
  854. assert_equal 'jsmith@somenet.foo', u.mail
  855. end
  856. def test_random_password
  857. u = User.new
  858. u.random_password
  859. assert !u.password.blank?
  860. assert !u.password_confirmation.blank?
  861. end
  862. test "#change_password_allowed? should be allowed if no auth source is set" do
  863. user = User.generate!
  864. assert user.change_password_allowed?
  865. end
  866. test "#change_password_allowed? should delegate to the auth source" do
  867. user = User.generate!
  868. allowed_auth_source = AuthSource.generate!
  869. def allowed_auth_source.allow_password_changes?; true; end
  870. denied_auth_source = AuthSource.generate!
  871. def denied_auth_source.allow_password_changes?; false; end
  872. assert user.change_password_allowed?
  873. user.auth_source = allowed_auth_source
  874. assert user.change_password_allowed?, "User not allowed to change password, though auth source does"
  875. user.auth_source = denied_auth_source
  876. assert !user.change_password_allowed?, "User allowed to change password, though auth source does not"
  877. end
  878. def test_own_account_deletable_should_be_true_with_unsubscrive_enabled
  879. with_settings :unsubscribe => '1' do
  880. assert_equal true, User.find(2).own_account_deletable?
  881. end
  882. end
  883. def test_own_account_deletable_should_be_false_with_unsubscrive_disabled
  884. with_settings :unsubscribe => '0' do
  885. assert_equal false, User.find(2).own_account_deletable?
  886. end
  887. end
  888. def test_own_account_deletable_should_be_false_for_a_single_admin
  889. User.admin.where("id <> ?", 1).delete_all
  890. with_settings :unsubscribe => '1' do
  891. assert_equal false, User.find(1).own_account_deletable?
  892. end
  893. end
  894. def test_own_account_deletable_should_be_true_for_an_admin_if_other_admin_exists
  895. User.generate! do |user|
  896. user.admin = true
  897. end
  898. with_settings :unsubscribe => '1' do
  899. assert_equal true, User.find(1).own_account_deletable?
  900. end
  901. end
  902. test "#allowed_to? for archived project should return false" do
  903. project = Project.find(1)
  904. project.archive
  905. project.reload
  906. assert_equal false, @admin.allowed_to?(:view_issues, project)
  907. end
  908. test "#allowed_to? for closed project should return true for read actions" do
  909. project = Project.find(1)
  910. project.close
  911. project.reload
  912. assert_equal false, @admin.allowed_to?(:edit_project, project)
  913. assert_equal true, @admin.allowed_to?(:view_project, project)
  914. end
  915. test "#allowed_to? for project with module disabled should return false" do
  916. project = Project.find(1)
  917. project.enabled_module_names = ["issue_tracking"]
  918. assert_equal true, @admin.allowed_to?(:add_issues, project)
  919. assert_equal false, @admin.allowed_to?(:view_wiki_pages, project)
  920. end
  921. test "#allowed_to? for admin users should return true" do
  922. project = Project.find(1)
  923. assert ! @admin.member_of?(project)
  924. %w(edit_issues delete_issues manage_news add_documents manage_wiki).each do |p|
  925. assert_equal true, @admin.allowed_to?(p.to_sym, project)
  926. end
  927. end
  928. test "#allowed_to? for normal users" do
  929. project = Project.find(1)
  930. assert_equal true, @jsmith.allowed_to?(:delete_messages, project) #Manager
  931. assert_equal false, @dlopper.allowed_to?(:delete_messages, project) #Developer
  932. end
  933. test "#allowed_to? with empty array should return false" do
  934. assert_equal false, @admin.allowed_to?(:view_project, [])
  935. end
  936. test "#allowed_to? with multiple projects" do
  937. assert_equal true, @admin.allowed_to?(:view_project, Project.all.to_a)
  938. assert_equal false, @dlopper.allowed_to?(:view_project, Project.all.to_a) #cannot see Project(2)
  939. assert_equal true, @jsmith.allowed_to?(:edit_issues, @jsmith.projects.to_a) #Manager or Developer everywhere
  940. assert_equal false, @jsmith.allowed_to?(:delete_issue_watchers, @jsmith.projects.to_a) #Dev cannot delete_issue_watchers
  941. end
  942. test "#allowed_to? with with options[:global] should return true if user has one role with the permission" do
  943. @dlopper2 = User.find(5) #only Developer on a project, not Manager anywhere
  944. @anonymous = User.find(6)
  945. assert_equal true, @jsmith.allowed_to?(:delete_issue_watchers, nil, :global => true)
  946. assert_equal false, @dlopper2.allowed_to?(:delete_issue_watchers, nil, :global => true)
  947. assert_equal true, @dlopper2.allowed_to?(:add_issues, nil, :global => true)
  948. assert_equal false, @anonymous.allowed_to?(:add_issues, nil, :global => true)
  949. assert_equal true, @anonymous.allowed_to?(:view_issues, nil, :global => true)
  950. end
  951. # this is just a proxy method, the test only calls it to ensure it doesn't break trivially
  952. test "#allowed_to_globally?" do
  953. @dlopper2 = User.find(5) #only Developer on a project, not Manager anywhere
  954. @anonymous = User.find(6)
  955. assert_equal true, @jsmith.allowed_to_globally?(:delete_issue_watchers)
  956. assert_equal false, @dlopper2.allowed_to_globally?(:delete_issue_watchers)
  957. assert_equal true, @dlopper2.allowed_to_globally?(:add_issues)
  958. assert_equal false, @anonymous.allowed_to_globally?(:add_issues)
  959. assert_equal true, @anonymous.allowed_to_globally?(:view_issues)
  960. end
  961. def test_notify_about_issue
  962. project = Project.find(1)
  963. author = User.generate!
  964. assignee = User.generate!
  965. Member.create!(:user => assignee, :project => project, :role_ids => [1])
  966. member = User.generate!
  967. Member.create!(:user => member, :project => project, :role_ids => [1])
  968. issue = Issue.generate!(:project => project, :assigned_to => assignee, :author => author)
  969. tests = {
  970. author => %w(all only_my_events only_owner selected),
  971. assignee => %w(all only_my_events only_assigned selected),
  972. member => %w(all)
  973. }
  974. tests.each do |user, expected|
  975. User::MAIL_NOTIFICATION_OPTIONS.map(&:first).each do |option|
  976. user.mail_notification = option
  977. assert_equal expected.include?(option), user.notify_about?(issue)
  978. end
  979. end
  980. end
  981. def test_notify_about_issue_for_previous_assignee
  982. assignee = User.generate!(:mail_notification => 'only_assigned')
  983. Member.create!(:user => assignee, :project_id => 1, :role_ids => [1])
  984. new_assignee = User.generate!(:mail_notification => 'only_assigned')
  985. Member.create!(:user => new_assignee, :project_id => 1, :role_ids => [1])
  986. issue = Issue.generate!(:assigned_to => assignee)
  987. assert assignee.notify_about?(issue)
  988. assert !new_assignee.notify_about?(issue)
  989. issue.assigned_to = new_assignee
  990. assert assignee.notify_about?(issue)
  991. assert new_assignee.notify_about?(issue)
  992. issue.save!
  993. assert assignee.notify_about?(issue)
  994. assert new_assignee.notify_about?(issue)
  995. issue.save!
  996. assert !assignee.notify_about?(issue)
  997. assert new_assignee.notify_about?(issue)
  998. end
  999. def test_notify_about_news
  1000. user = User.generate!
  1001. news = News.new
  1002. User::MAIL_NOTIFICATION_OPTIONS.map(&:first).each do |option|
  1003. user.mail_notification = option
  1004. assert_equal (option != 'none'), user.notify_about?(news)
  1005. end
  1006. end
  1007. def test_salt_unsalted_passwords
  1008. # Restore a user with an unsalted password
  1009. user = User.find(1)
  1010. user.salt = nil
  1011. user.hashed_password = User.hash_password("unsalted")
  1012. user.save!
  1013. User.salt_unsalted_passwords!
  1014. user.reload
  1015. # Salt added
  1016. assert !user.salt.blank?
  1017. # Password still valid
  1018. assert user.check_password?("unsalted")
  1019. assert_equal user, User.try_to_login(user.login, "unsalted")
  1020. end
  1021. if Object.const_defined?(:OpenID)
  1022. def test_setting_identity_url
  1023. normalized_open_id_url = 'http://example.com/'
  1024. u = User.new( :identity_url => 'http://example.com/' )
  1025. assert_equal normalized_open_id_url, u.identity_url
  1026. end
  1027. def test_setting_identity_url_without_trailing_slash
  1028. normalized_open_id_url = 'http://example.com/'
  1029. u = User.new( :identity_url => 'http://example.com' )
  1030. assert_equal normalized_open_id_url, u.identity_url
  1031. end
  1032. def test_setting_identity_url_without_protocol
  1033. normalized_open_id_url = 'http://example.com/'
  1034. u = User.new( :identity_url => 'example.com' )
  1035. assert_equal normalized_open_id_url, u.identity_url
  1036. end
  1037. def test_setting_blank_identity_url
  1038. u = User.new( :identity_url => 'example.com' )
  1039. u.identity_url = ''
  1040. assert u.identity_url.blank?
  1041. end
  1042. def test_setting_invalid_identity_url
  1043. u = User.new( :identity_url => 'this is not an openid url' )
  1044. assert u.identity_url.blank?
  1045. end
  1046. else
  1047. puts "Skipping openid tests."
  1048. end
  1049. end