3 class UserCreationTest < ActionDispatch::IntegrationTest
 
   5     OmniAuth.config.test_mode = true
 
   7     stub_request(:get, /.*gravatar.com.*d=404/).to_return(:status => 404)
 
  11     OmniAuth.config.mock_auth[:openid] = nil
 
  12     OmniAuth.config.mock_auth[:google] = nil
 
  13     OmniAuth.config.mock_auth[:facebook] = nil
 
  14     OmniAuth.config.mock_auth[:microsoft] = nil
 
  15     OmniAuth.config.mock_auth[:github] = nil
 
  16     OmniAuth.config.mock_auth[:wikipedia] = nil
 
  17     OmniAuth.config.test_mode = false
 
  20   def test_create_user_form
 
  23     assert_response :success
 
  24     assert_template "users/new"
 
  27   def test_user_create_submit_duplicate_email
 
  28     dup_email = create(:user).email
 
  29     display_name = "new_tester"
 
  30     assert_difference("User.count", 0) do
 
  31       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
  32         perform_enqueued_jobs do
 
  34                :params => { :user => { :email => dup_email,
 
  35                                        :display_name => display_name,
 
  36                                        :pass_crypt => "testtest",
 
  37                                        :pass_crypt_confirmation => "testtest" } }
 
  41     assert_response :success
 
  42     assert_template "users/new"
 
  44     assert_select "form > div > input.is-invalid#user_email"
 
  47   def test_user_create_association_submit_duplicate_email
 
  48     dup_email = create(:user).email
 
  49     display_name = "new_tester"
 
  50     assert_difference("User.count", 0) do
 
  51       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
  52         perform_enqueued_jobs do
 
  54                :params => { :user => { :email => dup_email,
 
  55                                        :display_name => display_name,
 
  56                                        :pass_crypt => "testtest",
 
  57                                        :pass_crypt_confirmation => "testtest",
 
  58                                        :auth_provider => "google",
 
  59                                        :auth_uid => "123454321" } }
 
  63     assert_response :success
 
  64     assert_template "users/new"
 
  66     assert_select "form > div > input.is-invalid#user_email"
 
  69   def test_user_create_submit_duplicate_username
 
  70     dup_display_name = create(:user).display_name
 
  72     assert_difference("User.count", 0) do
 
  73       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
  74         perform_enqueued_jobs do
 
  76                :params => { :user => { :email => email,
 
  77                                        :display_name => dup_display_name,
 
  78                                        :pass_crypt => "testtest",
 
  79                                        :pass_crypt_confirmation => "testtest" } }
 
  83     assert_response :success
 
  84     assert_template "users/new"
 
  85     assert_select "form > div > input.is-invalid#user_display_name"
 
  88   def test_user_create_submit_mismatched_passwords
 
  89     email = "newtester@osm.org"
 
  90     display_name = "new_tester"
 
  91     assert_difference("User.count", 0) do
 
  92       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
  93         perform_enqueued_jobs do
 
  95                :params => { :user => { :email => email,
 
  96                                        :display_name => display_name,
 
  97                                        :pass_crypt => "testtest",
 
  98                                        :pass_crypt_confirmation => "blahblah" } }
 
 102     assert_response :success
 
 103     assert_template "users/new"
 
 104     assert_select "form > div > div > div > input.is-invalid#user_pass_crypt_confirmation"
 
 107   def test_user_create_association_submit_duplicate_username
 
 108     dup_display_name = create(:user).display_name
 
 110     assert_difference("User.count", 0) do
 
 111       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
 112         perform_enqueued_jobs do
 
 114                :params => { :user => { :email => email,
 
 115                                        :display_name => dup_display_name,
 
 116                                        :auth_provider => "google",
 
 117                                        :auth_uid => "123454321" } }
 
 121     assert_response :success
 
 122     assert_template "users/new"
 
 123     assert_select "form > div > input.is-invalid#user_display_name"
 
 126   def test_user_create_success
 
 127     new_email = "newtester@osm.org"
 
 128     display_name = "new_tester"
 
 130     assert_difference("User.count", 1) do
 
 131       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 132         perform_enqueued_jobs do
 
 134                :params => { :user => { :email => new_email,
 
 135                                        :display_name => display_name,
 
 136                                        :pass_crypt => "testtest",
 
 137                                        :pass_crypt_confirmation => "testtest" } }
 
 138           assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
 
 144     assert_response :success
 
 145     assert_template "confirmations/confirm"
 
 147     user = User.find_by(:email => "newtester@osm.org")
 
 149     assert_not_predicate user, :active?
 
 151     register_email = ActionMailer::Base.deliveries.first
 
 152     assert_equal register_email.to.first, new_email
 
 153     found_confirmation_url = register_email.parts.first.parts.first.to_s =~ %r{\shttp://test.host(/\S+)\s}
 
 154     assert found_confirmation_url
 
 155     confirmation_url = Regexp.last_match(1)
 
 157     post confirmation_url
 
 159     assert_redirected_to welcome_path
 
 162     assert_predicate user, :active?
 
 164     assert_equal user, User.authenticate(:username => new_email, :password => "testtest")
 
 167   # Check that the user can successfully recover their password
 
 168   # def test_lost_password_recovery_success
 
 169   #   Open the lost password form
 
 170   #   Submit the lost password form
 
 172   #   Submit the reset password token
 
 173   #   Check that the password has changed, and the user can login
 
 176   def test_user_create_redirect
 
 177     new_email = "redirect_tester@osm.org"
 
 178     display_name = "redirect_tester"
 
 179     password = "testtest"
 
 180     # nothing special about this page, just need a protected page to redirect back to.
 
 181     referer = "/traces/mine"
 
 182     assert_difference("User.count") do
 
 183       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 184         perform_enqueued_jobs do
 
 186                :params => { :user => { :email => new_email,
 
 187                                        :display_name => display_name,
 
 188                                        :pass_crypt => password,
 
 189                                        :pass_crypt_confirmation => password },
 
 190                             :referer => referer }
 
 191           assert_response(:redirect)
 
 192           assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
 
 199     register_email = ActionMailer::Base.deliveries.first
 
 201     assert_equal register_email.to.first, new_email
 
 202     # Check that the confirm account url is correct
 
 203     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 204     email_text_parts(register_email).each do |part|
 
 205       assert_match confirm_regex, part.body.to_s
 
 207     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 210     assert_response :success
 
 211     assert_template "confirmations/confirm"
 
 213     # Go to the confirmation page
 
 214     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 215     assert_response :success
 
 216     assert_template "confirmations/confirm"
 
 218     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 219     assert_response :redirect
 
 221     assert_response :success
 
 222     assert_template "site/welcome"
 
 225   def test_user_create_openid_success
 
 226     new_email = "newtester-openid@osm.org"
 
 227     display_name = "new_tester-openid"
 
 228     openid_url = "http://localhost:1000/new.tester"
 
 229     auth_uid = "http://localhost:1123/new.tester"
 
 231     OmniAuth.config.add_mock(:openid,
 
 233                              :info => { :email => new_email, :name => display_name })
 
 235     assert_difference("User.count") do
 
 236       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 237         perform_enqueued_jobs do
 
 238           post auth_path(:provider => "openid", :openid_url => openid_url, :origin => "/user/new")
 
 239           assert_redirected_to auth_success_path(:provider => "openid", :openid_url => openid_url, :origin => "/user/new")
 
 241           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => new_email,
 
 242                                :auth_provider => "openid", :auth_uid => auth_uid
 
 245                :params => { :user => { :email => new_email,
 
 246                                        :display_name => display_name,
 
 247                                        :auth_provider => "openid",
 
 248                                        :auth_uid => auth_uid } }
 
 254     assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
 
 257   def test_user_create_openid_duplicate_email
 
 258     dup_user = create(:user)
 
 259     display_name = "new_tester-openid"
 
 260     auth_uid = "123454321"
 
 262     OmniAuth.config.add_mock(:openid,
 
 264                              :info => { :email => dup_user.email, :name => display_name })
 
 266     post auth_path(:provider => "openid", :origin => "/user/new")
 
 267     assert_redirected_to auth_success_path(:provider => "openid", :origin => "/user/new")
 
 269     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => dup_user.email,
 
 270                          :auth_provider => "openid", :auth_uid => auth_uid
 
 273     assert_response :success
 
 274     assert_template "users/new"
 
 275     assert_select "form > div > input.is-invalid#user_email"
 
 278   def test_user_create_openid_failure
 
 279     OmniAuth.config.mock_auth[:openid] = :connection_failed
 
 281     assert_difference("User.count", 0) do
 
 282       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 283         perform_enqueued_jobs do
 
 284           post auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
 
 286           assert_redirected_to auth_failure_path(:strategy => "openid", :message => "connection_failed", :origin => "/user/new")
 
 288           assert_redirected_to "/user/new"
 
 294   def test_user_create_openid_redirect
 
 295     openid_url = "http://localhost:1000/new.tester"
 
 296     auth_uid = "http://localhost:1123/new.tester"
 
 297     new_email = "redirect_tester_openid@osm.org"
 
 298     display_name = "redirect_tester_openid"
 
 300     OmniAuth.config.add_mock(:openid,
 
 302                              :info => { :email => new_email, :name => display_name })
 
 304     assert_difference("User.count") do
 
 305       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 306         perform_enqueued_jobs do
 
 307           post auth_path(:provider => "openid", :openid_url => openid_url, :origin => "/user/new")
 
 308           assert_redirected_to auth_success_path(:provider => "openid", :openid_url => openid_url, :origin => "/user/new")
 
 310           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => new_email,
 
 311                                :auth_provider => "openid", :auth_uid => auth_uid
 
 314                :params => { :user => { :email => new_email,
 
 315                                        :display_name => display_name,
 
 316                                        :auth_provider => "openid",
 
 317                                        :auth_uid => auth_uid } }
 
 324     register_email = ActionMailer::Base.deliveries.first
 
 326     assert_equal register_email.to.first, new_email
 
 327     # Check that the confirm account url is correct
 
 328     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 329     email_text_parts(register_email).each do |part|
 
 330       assert_match confirm_regex, part.body.to_s
 
 332     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 335     assert_response :success
 
 336     assert_template "confirmations/confirm"
 
 338     # Go to the confirmation page
 
 339     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 340     assert_response :success
 
 341     assert_template "confirmations/confirm"
 
 343     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 344     assert_response :redirect
 
 346     assert_response :success
 
 347     assert_template "site/welcome"
 
 350   def test_user_create_google_success
 
 351     new_email = "newtester-google@osm.org"
 
 352     email_hmac = UsersController.message_hmac(new_email)
 
 353     display_name = "new_tester-google"
 
 354     auth_uid = "123454321"
 
 356     OmniAuth.config.add_mock(:google,
 
 358                              :extra => { :id_info => { :openid_id => "http://localhost:1123/new.tester" } },
 
 359                              :info => { :email => new_email, :name => display_name })
 
 361     assert_difference("User.count") do
 
 362       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
 363         perform_enqueued_jobs do
 
 364           post auth_path(:provider => "google", :origin => "/user/new")
 
 365           assert_redirected_to auth_success_path(:provider => "google")
 
 367           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 368                                :email => new_email, :email_hmac => email_hmac,
 
 369                                :auth_provider => "google", :auth_uid => auth_uid
 
 373                :params => { :user => { :email => new_email,
 
 374                                        :display_name => display_name,
 
 375                                        :auth_provider => "google",
 
 376                                        :auth_uid => auth_uid },
 
 377                             :email_hmac => email_hmac }
 
 378           assert_redirected_to welcome_path
 
 385     assert_response :success
 
 386     assert_template "site/welcome"
 
 389   def test_user_create_google_duplicate_email
 
 390     dup_user = create(:user)
 
 391     display_name = "new_tester-google"
 
 392     auth_uid = "123454321"
 
 394     OmniAuth.config.add_mock(:google,
 
 396                              :extra => { :id_info => { :openid_id => "http://localhost:1123/new.tester" } },
 
 397                              :info => { :email => dup_user.email, :name => display_name })
 
 399     post auth_path(:provider => "google", :origin => "/user/new")
 
 400     assert_redirected_to auth_success_path(:provider => "google")
 
 402     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => dup_user.email,
 
 403                          :email_hmac => UsersController.message_hmac(dup_user.email),
 
 404                          :auth_provider => "google", :auth_uid => auth_uid
 
 407     assert_response :success
 
 408     assert_template "users/new"
 
 409     assert_select "form > div > input.is-invalid#user_email"
 
 412   def test_user_create_google_failure
 
 413     OmniAuth.config.mock_auth[:google] = :connection_failed
 
 415     assert_difference("User.count", 0) do
 
 416       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 417         perform_enqueued_jobs do
 
 418           post auth_path(:provider => "google", :origin => "/user/new")
 
 419           assert_response :redirect
 
 421           assert_redirected_to auth_failure_path(:strategy => "google", :message => "connection_failed", :origin => "/user/new")
 
 423           assert_redirected_to "/user/new"
 
 429   def test_user_create_google_redirect
 
 430     orig_email = "redirect_tester_google_orig@google.com"
 
 431     email_hmac = UsersController.message_hmac(orig_email)
 
 432     new_email =  "redirect_tester_google@osm.org"
 
 433     display_name = "redirect_tester_google"
 
 434     auth_uid = "123454321"
 
 436     OmniAuth.config.add_mock(:google,
 
 438                              :extra => { :id_info => { :openid_id => "http://localhost:1123/new.tester" } },
 
 439                              :info => { :email => orig_email, :name => display_name })
 
 441     assert_difference("User.count") do
 
 442       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 443         perform_enqueued_jobs do
 
 444           post auth_path(:provider => "google", :origin => "/user/new")
 
 445           assert_redirected_to auth_success_path(:provider => "google")
 
 447           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 448                                :email => orig_email, :email_hmac => email_hmac,
 
 449                                :auth_provider => "google", :auth_uid => auth_uid
 
 452                :params => { :user => { :email => new_email,
 
 453                                        :email_hmac => email_hmac,
 
 454                                        :display_name => display_name,
 
 455                                        :auth_provider => "google",
 
 456                                        :auth_uid => auth_uid } }
 
 457           assert_response :redirect
 
 464     register_email = ActionMailer::Base.deliveries.first
 
 466     assert_equal register_email.to.first, new_email
 
 467     # Check that the confirm account url is correct
 
 468     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 469     email_text_parts(register_email).each do |part|
 
 470       assert_match confirm_regex, part.body.to_s
 
 472     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 475     assert_response :success
 
 476     assert_template "confirmations/confirm"
 
 478     # Go to the confirmation page
 
 479     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 480     assert_response :success
 
 481     assert_template "confirmations/confirm"
 
 483     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 484     assert_response :redirect
 
 486     assert_response :success
 
 487     assert_template "site/welcome"
 
 490   def test_user_create_facebook_success
 
 491     new_email = "newtester-facebook@osm.org"
 
 492     email_hmac = UsersController.message_hmac(new_email)
 
 493     display_name = "new_tester-facebook"
 
 494     auth_uid = "123454321"
 
 496     OmniAuth.config.add_mock(:facebook,
 
 498                              :info => { "email" => new_email, :name => display_name })
 
 500     assert_difference("User.count") do
 
 501       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
 502         perform_enqueued_jobs do
 
 503           post auth_path(:provider => "facebook", :origin => "/user/new")
 
 504           assert_redirected_to auth_success_path(:provider => "facebook")
 
 506           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 507                                :email => new_email, :email_hmac => email_hmac,
 
 508                                :auth_provider => "facebook", :auth_uid => auth_uid
 
 512                :params => { :user => { :email => new_email,
 
 513                                        :display_name => display_name,
 
 514                                        :auth_provider => "facebook",
 
 515                                        :auth_uid => auth_uid },
 
 516                             :email_hmac => email_hmac }
 
 517           assert_redirected_to welcome_path
 
 524     assert_response :success
 
 525     assert_template "site/welcome"
 
 528   def test_user_create_facebook_duplicate_email
 
 529     dup_user = create(:user)
 
 530     display_name = "new_tester-facebook"
 
 531     auth_uid = "123454321"
 
 533     OmniAuth.config.add_mock(:facebook,
 
 535                              :info => { :email => dup_user.email, :name => display_name })
 
 537     post auth_path(:provider => "facebook", :origin => "/user/new")
 
 538     assert_redirected_to auth_success_path(:provider => "facebook")
 
 540     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => dup_user.email,
 
 541                          :email_hmac => UsersController.message_hmac(dup_user.email),
 
 542                          :auth_provider => "facebook", :auth_uid => auth_uid
 
 545     assert_response :success
 
 546     assert_template "users/new"
 
 547     assert_select "form > div > input.is-invalid#user_email"
 
 550   def test_user_create_facebook_failure
 
 551     OmniAuth.config.mock_auth[:facebook] = :connection_failed
 
 553     assert_difference("User.count", 0) do
 
 554       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 555         perform_enqueued_jobs do
 
 556           post auth_path(:provider => "facebook", :origin => "/user/new")
 
 557           assert_response :redirect
 
 559           assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "connection_failed", :origin => "/user/new")
 
 561           assert_redirected_to "/user/new"
 
 567   def test_user_create_facebook_redirect
 
 568     orig_email = "redirect_tester_facebook_orig@osm.org"
 
 569     email_hmac = UsersController.message_hmac(orig_email)
 
 570     new_email = "redirect_tester_facebook@osm.org"
 
 571     display_name = "redirect_tester_facebook"
 
 572     auth_uid = "123454321"
 
 574     OmniAuth.config.add_mock(:facebook,
 
 576                              :info => { :email => orig_email, :name => display_name })
 
 578     # nothing special about this page, just need a protected page to redirect back to.
 
 579     assert_difference("User.count") do
 
 580       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 581         perform_enqueued_jobs do
 
 582           post auth_path(:provider => "facebook", :origin => "/user/new")
 
 583           assert_redirected_to auth_success_path(:provider => "facebook")
 
 585           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 586                                :email => orig_email, :email_hmac => email_hmac,
 
 587                                :auth_provider => "facebook", :auth_uid => auth_uid
 
 591                :params => { :user => { :email => new_email,
 
 592                                        :email_hmac => email_hmac,
 
 593                                        :display_name => display_name,
 
 594                                        :auth_provider => "facebook",
 
 595                                        :auth_uid => auth_uid } }
 
 596           assert_response :redirect
 
 603     register_email = ActionMailer::Base.deliveries.first
 
 605     assert_equal register_email.to.first, new_email
 
 606     # Check that the confirm account url is correct
 
 607     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 608     email_text_parts(register_email).each do |part|
 
 609       assert_match confirm_regex, part.body.to_s
 
 611     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 614     assert_response :success
 
 615     assert_template "confirmations/confirm"
 
 617     # Go to the confirmation page
 
 618     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 619     assert_response :success
 
 620     assert_template "confirmations/confirm"
 
 622     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 623     assert_response :redirect
 
 625     assert_response :success
 
 626     assert_template "site/welcome"
 
 629   def test_user_create_microsoft_success
 
 630     new_email = "newtester-microsoft@osm.org"
 
 631     email_hmac = UsersController.message_hmac(new_email)
 
 632     display_name = "new_tester-microsoft"
 
 633     auth_uid = "123454321"
 
 635     OmniAuth.config.add_mock(:microsoft,
 
 637                              :info => { "email" => new_email, :name => display_name })
 
 639     assert_difference("User.count") do
 
 640       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 641         perform_enqueued_jobs do
 
 642           post auth_path(:provider => "microsoft", :origin => "/user/new")
 
 643           assert_redirected_to auth_success_path(:provider => "microsoft")
 
 645           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 646                                :email => new_email, :email_hmac => email_hmac,
 
 647                                :auth_provider => "microsoft", :auth_uid => auth_uid
 
 650                :params => { :user => { :email => new_email,
 
 651                                        :display_name => display_name,
 
 652                                        :auth_provider => "microsoft",
 
 653                                        :auth_uid => auth_uid },
 
 654                             :email_hmac => email_hmac }
 
 655           assert_redirected_to welcome_path
 
 662     assert_response :success
 
 663     assert_template "site/welcome"
 
 666   def test_user_create_microsoft_duplicate_email
 
 667     dup_user = create(:user)
 
 668     display_name = "new_tester-microsoft"
 
 669     auth_uid = "123454321"
 
 671     OmniAuth.config.add_mock(:microsoft,
 
 673                              :info => { :email => dup_user.email, :name => display_name })
 
 675     post auth_path(:provider => "microsoft", :origin => "/user/new")
 
 676     assert_redirected_to auth_success_path(:provider => "microsoft")
 
 678     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => dup_user.email,
 
 679                          :email_hmac => UsersController.message_hmac(dup_user.email),
 
 680                          :auth_provider => "microsoft", :auth_uid => auth_uid
 
 683     assert_response :success
 
 684     assert_template "users/new"
 
 685     assert_select "form > div > input.is-invalid#user_email"
 
 688   def test_user_create_microsoft_failure
 
 689     OmniAuth.config.mock_auth[:microsoft] = :connection_failed
 
 691     assert_difference("User.count", 0) do
 
 692       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 693         perform_enqueued_jobs do
 
 694           post auth_path(:provider => "microsoft", :origin => "/user/new")
 
 695           assert_response :redirect
 
 697           assert_redirected_to auth_failure_path(:strategy => "microsoft", :message => "connection_failed", :origin => "/user/new")
 
 699           assert_redirected_to "/user/new"
 
 705   def test_user_create_microsoft_redirect
 
 706     orig_email = "redirect_tester_microsoft_orig@osm.org"
 
 707     email_hmac = UsersController.message_hmac(orig_email)
 
 708     new_email = "redirect_tester_microsoft@osm.org"
 
 709     display_name = "redirect_tester_microsoft"
 
 710     auth_uid = "123454321"
 
 712     OmniAuth.config.add_mock(:microsoft,
 
 714                              :info => { :email => orig_email, :name => display_name })
 
 716     assert_difference("User.count") do
 
 717       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 718         perform_enqueued_jobs do
 
 719           post auth_path(:provider => "microsoft", :origin => "/user/new")
 
 720           assert_redirected_to auth_success_path(:provider => "microsoft")
 
 722           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 723                                :email => orig_email, :email_hmac => email_hmac,
 
 724                                :auth_provider => "microsoft", :auth_uid => auth_uid
 
 728                :params => { :user => { :email => new_email,
 
 729                                        :email_hmac => email_hmac,
 
 730                                        :display_name => display_name,
 
 731                                        :auth_provider => "microsoft",
 
 732                                        :auth_uid => auth_uid } }
 
 733           assert_response :redirect
 
 740     register_email = ActionMailer::Base.deliveries.first
 
 742     assert_equal register_email.to.first, new_email
 
 743     # Check that the confirm account url is correct
 
 744     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 745     email_text_parts(register_email).each do |part|
 
 746       assert_match confirm_regex, part.body.to_s
 
 748     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 751     assert_response :success
 
 752     assert_template "confirmations/confirm"
 
 754     # Go to the confirmation page
 
 755     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 756     assert_response :success
 
 757     assert_template "confirmations/confirm"
 
 759     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 760     assert_response :redirect
 
 762     assert_response :success
 
 763     assert_template "site/welcome"
 
 766   def test_user_create_github_success
 
 767     new_email = "newtester-github@osm.org"
 
 768     email_hmac = UsersController.message_hmac(new_email)
 
 769     display_name = "new_tester-github"
 
 770     password = "testtest"
 
 771     auth_uid = "123454321"
 
 773     OmniAuth.config.add_mock(:github,
 
 775                              :info => { "email" => new_email, :name => display_name })
 
 777     assert_difference("User.count") do
 
 778       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
 779         perform_enqueued_jobs do
 
 780           post auth_path(:provider => "github", :origin => "/user/new")
 
 781           assert_redirected_to auth_success_path(:provider => "github")
 
 783           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 784                                :email => new_email, :email_hmac => email_hmac,
 
 785                                :auth_provider => "github", :auth_uid => auth_uid
 
 789                :params => { :user => { :email => new_email,
 
 790                                        :display_name => display_name,
 
 791                                        :auth_provider => "github",
 
 792                                        :auth_uid => "123454321",
 
 793                                        :pass_crypt => password,
 
 794                                        :pass_crypt_confirmation => password },
 
 797                             :email_hmac => email_hmac }
 
 798           assert_redirected_to welcome_path
 
 805     assert_response :success
 
 806     assert_template "site/welcome"
 
 809   def test_user_create_github_duplicate_email
 
 810     dup_user = create(:user)
 
 811     display_name = "new_tester-github"
 
 812     auth_uid = "123454321"
 
 814     OmniAuth.config.add_mock(:github,
 
 816                              :extra => { :id_info => { :openid_id => "http://localhost:1123/new.tester" } },
 
 817                              :info => { :email => dup_user.email, :name => display_name })
 
 819     post auth_path(:provider => "github", :origin => "/user/new")
 
 820     assert_redirected_to auth_success_path(:provider => "github")
 
 822     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 823                          :email => dup_user.email, :email_hmac => UsersController.message_hmac(dup_user.email),
 
 824                          :auth_provider => "github", :auth_uid => auth_uid
 
 827     assert_response :success
 
 828     assert_template "users/new"
 
 829     assert_select "form > div > input.is-invalid#user_email"
 
 832   def test_user_create_github_failure
 
 833     OmniAuth.config.mock_auth[:github] = :connection_failed
 
 835     assert_difference("User.count", 0) do
 
 836       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 837         perform_enqueued_jobs do
 
 838           post auth_path(:provider => "github", :origin => "/user/new")
 
 840           assert_redirected_to auth_failure_path(:strategy => "github", :message => "connection_failed", :origin => "/user/new")
 
 842           assert_redirected_to "/user/new"
 
 848   def test_user_create_github_redirect
 
 849     orig_email = "redirect_tester_github_orig@osm.org"
 
 850     email_hmac = UsersController.message_hmac(orig_email)
 
 851     new_email = "redirect_tester_github@osm.org"
 
 852     display_name = "redirect_tester_github"
 
 853     auth_uid = "123454321"
 
 855     OmniAuth.config.add_mock(:github,
 
 857                              :info => { :email => orig_email, :name => display_name })
 
 859     assert_difference("User.count") do
 
 860       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 861         perform_enqueued_jobs do
 
 862           post auth_path(:provider => "github", :origin => "/user/new")
 
 863           assert_redirected_to auth_success_path(:provider => "github")
 
 865           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 866                                :email => orig_email, :email_hmac => email_hmac,
 
 867                                :auth_provider => "github", :auth_uid => auth_uid
 
 870                :params => { :user => { :email => new_email,
 
 871                                        :email_hmac => email_hmac,
 
 872                                        :display_name => display_name,
 
 873                                        :auth_provider => "github",
 
 874                                        :auth_uid => auth_uid } }
 
 875           assert_response :redirect
 
 882     register_email = ActionMailer::Base.deliveries.first
 
 884     assert_equal register_email.to.first, new_email
 
 885     # Check that the confirm account url is correct
 
 886     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 887     email_text_parts(register_email).each do |part|
 
 888       assert_match confirm_regex, part.body.to_s
 
 890     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 893     assert_response :success
 
 894     assert_template "confirmations/confirm"
 
 896     # Go to the confirmation page
 
 897     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 898     assert_response :success
 
 899     assert_template "confirmations/confirm"
 
 901     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 902     assert_response :redirect
 
 904     assert_response :success
 
 905     assert_template "site/welcome"
 
 908   def test_user_create_wikipedia_success
 
 909     new_email = "newtester-wikipedia@osm.org"
 
 910     email_hmac = UsersController.message_hmac(new_email)
 
 911     display_name = "new_tester-wikipedia"
 
 912     password = "testtest"
 
 913     auth_uid = "123454321"
 
 915     OmniAuth.config.add_mock(:wikipedia,
 
 917                              :info => { :email => new_email, :name => display_name })
 
 919     assert_difference("User.count") do
 
 920       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
 921         perform_enqueued_jobs do
 
 922           post auth_path(:provider => "wikipedia", :origin => "/user/new")
 
 923           assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
 
 925           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 926                                :email => new_email, :email_hmac => email_hmac,
 
 927                                :auth_provider => "wikipedia", :auth_uid => auth_uid
 
 930                :params => { :user => { :email => new_email,
 
 931                                        :display_name => display_name,
 
 932                                        :auth_provider => "wikipedia",
 
 933                                        :auth_uid => "123454321",
 
 934                                        :pass_crypt => password,
 
 935                                        :pass_crypt_confirmation => password },
 
 938                             :email_hmac => email_hmac }
 
 939           assert_redirected_to welcome_path
 
 946     assert_response :success
 
 947     assert_template "site/welcome"
 
 950   def test_user_create_wikipedia_duplicate_email
 
 951     dup_user = create(:user)
 
 952     display_name = "new_tester-wikipedia"
 
 953     auth_uid = "123454321"
 
 955     OmniAuth.config.add_mock(:wikipedia,
 
 957                              :info => { "email" => dup_user.email, :name => display_name })
 
 959     post auth_path(:provider => "wikipedia", :origin => "/user/new")
 
 960     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
 
 962     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 963                          :email => dup_user.email, :email_hmac => UsersController.message_hmac(dup_user.email),
 
 964                          :auth_provider => "wikipedia", :auth_uid => auth_uid
 
 967     assert_response :success
 
 968     assert_template "users/new"
 
 969     assert_select "form > div > input.is-invalid#user_email"
 
 972   def test_user_create_wikipedia_failure
 
 973     OmniAuth.config.mock_auth[:wikipedia] = :connection_failed
 
 975     assert_difference("User.count", 0) do
 
 976       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 977         perform_enqueued_jobs do
 
 978           post auth_path(:provider => "wikipedia", :origin => "/user/new")
 
 979           assert_response :redirect
 
 981           assert_redirected_to auth_failure_path(:strategy => "wikipedia", :message => "connection_failed", :origin => "/user/new")
 
 983           assert_redirected_to "/user/new"
 
 989   def test_user_create_wikipedia_redirect
 
 990     orig_email = "redirect_tester_wikipedia_orig@osm.org"
 
 991     email_hmac = UsersController.message_hmac(orig_email)
 
 992     new_email = "redirect_tester_wikipedia@osm.org"
 
 993     display_name = "redirect_tester_wikipedia"
 
 994     auth_uid = "123454321"
 
 996     OmniAuth.config.add_mock(:wikipedia,
 
 998                              :info => { :email => orig_email, :name => display_name })
 
1000     # nothing special about this page, just need a protected page to redirect back to.
 
1001     assert_difference("User.count") do
 
1002       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
1003         perform_enqueued_jobs do
 
1004           post auth_path(:provider => "wikipedia", :origin => "/user/new")
 
1005           assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
 
1007           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
1008                                :email => orig_email, :email_hmac => email_hmac,
 
1009                                :auth_provider => "wikipedia", :auth_uid => auth_uid
 
1013                :params => { :user => { :email => new_email,
 
1014                                        :email_hmac => email_hmac,
 
1015                                        :display_name => display_name,
 
1016                                        :auth_provider => "wikipedia",
 
1017                                        :auth_uid => auth_uid } }
 
1018           assert_response :redirect
 
1025     register_email = ActionMailer::Base.deliveries.first
 
1027     assert_equal register_email.to.first, new_email
 
1028     # Check that the confirm account url is correct
 
1029     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
1030     email_text_parts(register_email).each do |part|
 
1031       assert_match confirm_regex, part.body.to_s
 
1033     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
1036     assert_response :success
 
1037     assert_template "confirmations/confirm"
 
1039     # Go to the confirmation page
 
1040     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
1041     assert_response :success
 
1042     assert_template "confirmations/confirm"
 
1044     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
1045     assert_response :redirect
 
1047     assert_response :success
 
1048     assert_template "site/welcome"