1 # frozen_string_literal: true
 
   5 class UserCreationTest < ActionDispatch::IntegrationTest
 
   7     OmniAuth.config.test_mode = true
 
   9     stub_request(:get, /.*gravatar.com.*d=404/).to_return(:status => 404)
 
  13     OmniAuth.config.mock_auth[:google] = nil
 
  14     OmniAuth.config.mock_auth[:apple] = nil
 
  15     OmniAuth.config.mock_auth[:facebook] = nil
 
  16     OmniAuth.config.mock_auth[:microsoft] = nil
 
  17     OmniAuth.config.mock_auth[:github] = nil
 
  18     OmniAuth.config.mock_auth[:wikipedia] = nil
 
  19     OmniAuth.config.test_mode = false
 
  22   def test_create_user_form
 
  25     assert_response :success
 
  26     assert_template "users/new"
 
  29   def test_user_create_submit_duplicate_email
 
  30     dup_email = create(:user).email
 
  31     display_name = "new_tester"
 
  32     assert_difference("User.count", 0) do
 
  33       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
  34         perform_enqueued_jobs do
 
  36                :params => { :user => { :email => dup_email,
 
  37                                        :display_name => display_name,
 
  38                                        :pass_crypt => "testtest",
 
  39                                        :pass_crypt_confirmation => "testtest" } }
 
  43     assert_response :success
 
  44     assert_template "users/new"
 
  46     assert_select "form > div > input.is-invalid#user_email"
 
  49   def test_user_create_association_submit_duplicate_email
 
  50     dup_email = create(:user).email
 
  51     display_name = "new_tester"
 
  52     assert_difference("User.count", 0) do
 
  53       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
  54         perform_enqueued_jobs do
 
  56                :params => { :user => { :email => dup_email,
 
  57                                        :display_name => display_name,
 
  58                                        :pass_crypt => "testtest",
 
  59                                        :pass_crypt_confirmation => "testtest",
 
  60                                        :auth_provider => "google",
 
  61                                        :auth_uid => "123454321" } }
 
  65     assert_response :success
 
  66     assert_template "users/new"
 
  68     assert_select "form > div > input.is-invalid#user_email"
 
  71   def test_user_create_submit_duplicate_username
 
  72     dup_display_name = create(:user).display_name
 
  74     assert_difference("User.count", 0) do
 
  75       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
  76         perform_enqueued_jobs do
 
  78                :params => { :user => { :email => email,
 
  79                                        :display_name => dup_display_name,
 
  80                                        :pass_crypt => "testtest",
 
  81                                        :pass_crypt_confirmation => "testtest" } }
 
  85     assert_response :success
 
  86     assert_template "users/new"
 
  87     assert_select "form > div > input.is-invalid#user_display_name"
 
  90   def test_user_create_submit_mismatched_passwords
 
  91     email = "newtester@osm.org"
 
  92     display_name = "new_tester"
 
  93     assert_difference("User.count", 0) do
 
  94       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
  95         perform_enqueued_jobs do
 
  97                :params => { :user => { :email => email,
 
  98                                        :display_name => display_name,
 
  99                                        :pass_crypt => "testtest",
 
 100                                        :pass_crypt_confirmation => "blahblah" } }
 
 104     assert_response :success
 
 105     assert_template "users/new"
 
 106     assert_select "form > div > div > div > input.is-invalid#user_pass_crypt_confirmation"
 
 109   def test_user_create_association_submit_duplicate_username
 
 110     dup_display_name = create(:user).display_name
 
 112     assert_difference("User.count", 0) do
 
 113       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
 114         perform_enqueued_jobs do
 
 116                :params => { :user => { :email => email,
 
 117                                        :display_name => dup_display_name,
 
 118                                        :auth_provider => "google",
 
 119                                        :auth_uid => "123454321" } }
 
 123     assert_response :success
 
 124     assert_template "users/new"
 
 125     assert_select "form > div > input.is-invalid#user_display_name"
 
 128   def test_user_create_success
 
 129     new_email = "newtester@osm.org"
 
 130     display_name = "new_tester"
 
 132     assert_difference("User.count", 1) do
 
 133       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 134         perform_enqueued_jobs do
 
 136                :params => { :user => { :email => new_email,
 
 137                                        :display_name => display_name,
 
 138                                        :pass_crypt => "testtest",
 
 139                                        :pass_crypt_confirmation => "testtest" } }
 
 140           assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
 
 146     assert_response :success
 
 147     assert_template "confirmations/confirm"
 
 149     user = User.find_by(:email => "newtester@osm.org")
 
 151     assert_not_predicate user, :active?
 
 153     register_email = ActionMailer::Base.deliveries.first
 
 154     assert_equal register_email.to.first, new_email
 
 155     found_confirmation_url = register_email.parts.first.parts.first.to_s =~ %r{\shttp://test.host(/\S+)\s}
 
 156     assert found_confirmation_url
 
 157     confirmation_url = Regexp.last_match(1)
 
 159     post confirmation_url
 
 161     assert_redirected_to welcome_path
 
 164     assert_predicate user, :active?
 
 166     assert_equal user, User.authenticate(:username => new_email, :password => "testtest")
 
 169   # Check that the user can successfully recover their password
 
 170   # def test_lost_password_recovery_success
 
 171   #   Open the lost password form
 
 172   #   Submit the lost password form
 
 174   #   Submit the reset password token
 
 175   #   Check that the password has changed, and the user can login
 
 178   def test_user_create_redirect
 
 179     new_email = "redirect_tester@osm.org"
 
 180     display_name = "redirect_tester"
 
 181     password = "testtest"
 
 182     # nothing special about this page, just need a protected page to redirect back to.
 
 183     referer = "/traces/mine"
 
 184     assert_difference("User.count") do
 
 185       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 186         perform_enqueued_jobs do
 
 188                :params => { :user => { :email => new_email,
 
 189                                        :display_name => display_name,
 
 190                                        :pass_crypt => password,
 
 191                                        :pass_crypt_confirmation => password },
 
 192                             :referer => referer }
 
 193           assert_response(:redirect)
 
 194           assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
 
 201     register_email = ActionMailer::Base.deliveries.first
 
 203     assert_equal register_email.to.first, new_email
 
 204     # Check that the confirm account url is correct
 
 205     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 206     email_text_parts(register_email).each do |part|
 
 207       assert_match confirm_regex, part.body.to_s
 
 209     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 212     assert_response :success
 
 213     assert_template "confirmations/confirm"
 
 215     # Go to the confirmation page
 
 216     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 217     assert_response :success
 
 218     assert_template "confirmations/confirm"
 
 220     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 221     assert_response :redirect
 
 223     assert_response :success
 
 224     assert_template "site/welcome"
 
 227   def test_user_create_google_success
 
 228     new_email = "newtester-google@osm.org"
 
 229     email_hmac = UsersController.message_hmac(new_email)
 
 230     display_name = "new_tester-google"
 
 231     auth_uid = "123454321"
 
 233     OmniAuth.config.add_mock(:google,
 
 235                              :extra => { :id_info => { :openid_id => "http://localhost:1123/new.tester" } },
 
 236                              :info => { :email => new_email, :name => display_name })
 
 238     assert_difference("User.count") do
 
 239       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
 240         perform_enqueued_jobs do
 
 241           post auth_path(:provider => "google", :origin => "/user/new")
 
 242           assert_redirected_to auth_success_path(:provider => "google")
 
 244           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 245                                :email => new_email, :email_hmac => email_hmac,
 
 246                                :auth_provider => "google", :auth_uid => auth_uid
 
 250                :params => { :user => { :email => new_email,
 
 251                                        :display_name => display_name,
 
 252                                        :auth_provider => "google",
 
 253                                        :auth_uid => auth_uid },
 
 254                             :email_hmac => email_hmac }
 
 255           assert_redirected_to welcome_path
 
 262     assert_response :success
 
 263     assert_template "site/welcome"
 
 266   def test_user_create_google_duplicate_email
 
 267     dup_user = create(:user)
 
 268     display_name = "new_tester-google"
 
 269     auth_uid = "123454321"
 
 271     OmniAuth.config.add_mock(:google,
 
 273                              :extra => { :id_info => { :openid_id => "http://localhost:1123/new.tester" } },
 
 274                              :info => { :email => dup_user.email, :name => display_name })
 
 276     post auth_path(:provider => "google", :origin => "/user/new")
 
 277     assert_redirected_to auth_success_path(:provider => "google")
 
 279     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => dup_user.email,
 
 280                          :email_hmac => UsersController.message_hmac(dup_user.email),
 
 281                          :auth_provider => "google", :auth_uid => auth_uid
 
 284     assert_response :success
 
 285     assert_template "users/new"
 
 286     assert_select "form > div > input.is-invalid#user_email"
 
 289   def test_user_create_google_failure
 
 290     OmniAuth.config.mock_auth[:google] = :connection_failed
 
 292     assert_difference("User.count", 0) do
 
 293       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 294         perform_enqueued_jobs do
 
 295           post auth_path(:provider => "google", :origin => "/user/new")
 
 296           assert_response :redirect
 
 298           assert_redirected_to auth_failure_path(:strategy => "google", :message => "connection_failed", :origin => "/user/new")
 
 300           assert_redirected_to "/user/new"
 
 306   def test_user_create_google_redirect
 
 307     orig_email = "redirect_tester_google_orig@google.com"
 
 308     email_hmac = UsersController.message_hmac(orig_email)
 
 309     new_email =  "redirect_tester_google@osm.org"
 
 310     display_name = "redirect_tester_google"
 
 311     auth_uid = "123454321"
 
 313     OmniAuth.config.add_mock(:google,
 
 315                              :extra => { :id_info => { :openid_id => "http://localhost:1123/new.tester" } },
 
 316                              :info => { :email => orig_email, :name => display_name })
 
 318     assert_difference("User.count") do
 
 319       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 320         perform_enqueued_jobs do
 
 321           post auth_path(:provider => "google", :origin => "/user/new")
 
 322           assert_redirected_to auth_success_path(:provider => "google")
 
 324           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 325                                :email => orig_email, :email_hmac => email_hmac,
 
 326                                :auth_provider => "google", :auth_uid => auth_uid
 
 329                :params => { :user => { :email => new_email,
 
 330                                        :email_hmac => email_hmac,
 
 331                                        :display_name => display_name,
 
 332                                        :auth_provider => "google",
 
 333                                        :auth_uid => auth_uid } }
 
 334           assert_response :redirect
 
 341     register_email = ActionMailer::Base.deliveries.first
 
 343     assert_equal register_email.to.first, new_email
 
 344     # Check that the confirm account url is correct
 
 345     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 346     email_text_parts(register_email).each do |part|
 
 347       assert_match confirm_regex, part.body.to_s
 
 349     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 352     assert_response :success
 
 353     assert_template "confirmations/confirm"
 
 355     # Go to the confirmation page
 
 356     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 357     assert_response :success
 
 358     assert_template "confirmations/confirm"
 
 360     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 361     assert_response :redirect
 
 363     assert_response :success
 
 364     assert_template "site/welcome"
 
 367   def test_user_create_apple_success
 
 368     new_email = "newtester-apple@osm.org"
 
 369     email_hmac = UsersController.message_hmac(new_email)
 
 370     display_name = "new_tester-apple"
 
 371     auth_uid = "123454321"
 
 373     OmniAuth.config.add_mock(:apple,
 
 375                              :info => { :email => new_email, :name => display_name })
 
 377     assert_difference("User.count") do
 
 378       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
 379         perform_enqueued_jobs do
 
 380           post auth_path(:provider => "apple", :origin => "/user/new")
 
 381           assert_redirected_to auth_success_path(:provider => "apple")
 
 383           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 384                                :email => new_email, :email_hmac => email_hmac,
 
 385                                :auth_provider => "apple", :auth_uid => auth_uid
 
 387                :params => { :user => { :email => new_email,
 
 388                                        :display_name => display_name,
 
 389                                        :auth_provider => "apple",
 
 390                                        :auth_uid => auth_uid },
 
 391                             :email_hmac => email_hmac }
 
 392           assert_redirected_to welcome_path
 
 399     assert_response :success
 
 400     assert_template "site/welcome"
 
 402     ActionMailer::Base.deliveries.clear
 
 405   def test_user_create_apple_duplicate_email
 
 406     dup_user = create(:user)
 
 407     display_name = "new_tester-apple"
 
 408     auth_uid = "123454321"
 
 410     OmniAuth.config.add_mock(:apple,
 
 412                              :info => { :email => dup_user.email, :name => display_name })
 
 414     post auth_path(:provider => "apple", :origin => "/user/new")
 
 415     assert_redirected_to auth_success_path(:provider => "apple")
 
 417     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => dup_user.email,
 
 418                          :email_hmac => UsersController.message_hmac(dup_user.email),
 
 419                          :auth_provider => "apple", :auth_uid => auth_uid
 
 422     assert_response :success
 
 423     assert_template "users/new"
 
 424     assert_select "form > div > input.is-invalid#user_email"
 
 426     ActionMailer::Base.deliveries.clear
 
 429   def test_user_create_apple_failure
 
 430     OmniAuth.config.mock_auth[:apple] = :connection_failed
 
 432     assert_difference("User.count", 0) do
 
 433       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 434         perform_enqueued_jobs do
 
 435           post auth_path(:provider => "apple", :origin => "/user/new")
 
 436           assert_response :redirect
 
 438           assert_redirected_to auth_failure_path(:strategy => "apple", :message => "connection_failed", :origin => "/user/new")
 
 440           assert_redirected_to "/user/new"
 
 445     ActionMailer::Base.deliveries.clear
 
 448   def test_user_create_apple_redirect
 
 449     orig_email = "redirect_tester_apple_orig@apple.com"
 
 450     email_hmac = UsersController.message_hmac(orig_email)
 
 451     new_email =  "redirect_tester_apple@osm.org"
 
 452     display_name = "redirect_tester_apple"
 
 453     auth_uid = "123454321"
 
 455     OmniAuth.config.add_mock(:apple,
 
 457                              :info => { :email => orig_email, :name => display_name })
 
 459     assert_difference("User.count") do
 
 460       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 461         perform_enqueued_jobs do
 
 462           post auth_path(:provider => "apple", :origin => "/user/new")
 
 463           assert_redirected_to auth_success_path(:provider => "apple")
 
 465           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 466                                :email => orig_email, :email_hmac => email_hmac,
 
 467                                :auth_provider => "apple", :auth_uid => auth_uid
 
 470                :params => { :user => { :email => new_email,
 
 471                                        :email_hmac => email_hmac,
 
 472                                        :display_name => display_name,
 
 473                                        :auth_provider => "apple",
 
 474                                        :auth_uid => auth_uid } }
 
 475           assert_response :redirect
 
 482     register_email = ActionMailer::Base.deliveries.first
 
 484     assert_equal register_email.to.first, new_email
 
 485     # Check that the confirm account url is correct
 
 486     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 487     email_text_parts(register_email).each do |part|
 
 488       assert_match confirm_regex, part.body.to_s
 
 490     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 493     assert_response :success
 
 494     assert_template "confirmations/confirm"
 
 496     ActionMailer::Base.deliveries.clear
 
 498     # Go to the confirmation page
 
 499     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 500     assert_response :success
 
 501     assert_template "confirmations/confirm"
 
 503     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 504     assert_response :redirect
 
 506     assert_response :success
 
 507     assert_template "site/welcome"
 
 510   def test_user_create_facebook_success
 
 511     new_email = "newtester-facebook@osm.org"
 
 512     email_hmac = UsersController.message_hmac(new_email)
 
 513     display_name = "new_tester-facebook"
 
 514     auth_uid = "123454321"
 
 516     OmniAuth.config.add_mock(:facebook,
 
 518                              :info => { "email" => new_email, :name => display_name })
 
 520     assert_difference("User.count") do
 
 521       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
 522         perform_enqueued_jobs do
 
 523           post auth_path(:provider => "facebook", :origin => "/user/new")
 
 524           assert_redirected_to auth_success_path(:provider => "facebook")
 
 526           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 527                                :email => new_email, :email_hmac => email_hmac,
 
 528                                :auth_provider => "facebook", :auth_uid => auth_uid
 
 532                :params => { :user => { :email => new_email,
 
 533                                        :display_name => display_name,
 
 534                                        :auth_provider => "facebook",
 
 535                                        :auth_uid => auth_uid },
 
 536                             :email_hmac => email_hmac }
 
 537           assert_redirected_to welcome_path
 
 544     assert_response :success
 
 545     assert_template "site/welcome"
 
 548   def test_user_create_facebook_duplicate_email
 
 549     dup_user = create(:user)
 
 550     display_name = "new_tester-facebook"
 
 551     auth_uid = "123454321"
 
 553     OmniAuth.config.add_mock(:facebook,
 
 555                              :info => { :email => dup_user.email, :name => display_name })
 
 557     post auth_path(:provider => "facebook", :origin => "/user/new")
 
 558     assert_redirected_to auth_success_path(:provider => "facebook")
 
 560     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => dup_user.email,
 
 561                          :email_hmac => UsersController.message_hmac(dup_user.email),
 
 562                          :auth_provider => "facebook", :auth_uid => auth_uid
 
 565     assert_response :success
 
 566     assert_template "users/new"
 
 567     assert_select "form > div > input.is-invalid#user_email"
 
 570   def test_user_create_facebook_failure
 
 571     OmniAuth.config.mock_auth[:facebook] = :connection_failed
 
 573     assert_difference("User.count", 0) do
 
 574       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 575         perform_enqueued_jobs do
 
 576           post auth_path(:provider => "facebook", :origin => "/user/new")
 
 577           assert_response :redirect
 
 579           assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "connection_failed", :origin => "/user/new")
 
 581           assert_redirected_to "/user/new"
 
 587   def test_user_create_facebook_redirect
 
 588     orig_email = "redirect_tester_facebook_orig@osm.org"
 
 589     email_hmac = UsersController.message_hmac(orig_email)
 
 590     new_email = "redirect_tester_facebook@osm.org"
 
 591     display_name = "redirect_tester_facebook"
 
 592     auth_uid = "123454321"
 
 594     OmniAuth.config.add_mock(:facebook,
 
 596                              :info => { :email => orig_email, :name => display_name })
 
 598     # nothing special about this page, just need a protected page to redirect back to.
 
 599     assert_difference("User.count") do
 
 600       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 601         perform_enqueued_jobs do
 
 602           post auth_path(:provider => "facebook", :origin => "/user/new")
 
 603           assert_redirected_to auth_success_path(:provider => "facebook")
 
 605           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 606                                :email => orig_email, :email_hmac => email_hmac,
 
 607                                :auth_provider => "facebook", :auth_uid => auth_uid
 
 611                :params => { :user => { :email => new_email,
 
 612                                        :email_hmac => email_hmac,
 
 613                                        :display_name => display_name,
 
 614                                        :auth_provider => "facebook",
 
 615                                        :auth_uid => auth_uid } }
 
 616           assert_response :redirect
 
 623     register_email = ActionMailer::Base.deliveries.first
 
 625     assert_equal register_email.to.first, new_email
 
 626     # Check that the confirm account url is correct
 
 627     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 628     email_text_parts(register_email).each do |part|
 
 629       assert_match confirm_regex, part.body.to_s
 
 631     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 634     assert_response :success
 
 635     assert_template "confirmations/confirm"
 
 637     # Go to the confirmation page
 
 638     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 639     assert_response :success
 
 640     assert_template "confirmations/confirm"
 
 642     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 643     assert_response :redirect
 
 645     assert_response :success
 
 646     assert_template "site/welcome"
 
 649   def test_user_create_microsoft_success
 
 650     new_email = "newtester-microsoft@osm.org"
 
 651     email_hmac = UsersController.message_hmac(new_email)
 
 652     display_name = "new_tester-microsoft"
 
 653     auth_uid = "123454321"
 
 655     OmniAuth.config.add_mock(:microsoft,
 
 657                              :info => { "email" => new_email, :name => display_name })
 
 659     assert_difference("User.count") do
 
 660       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 661         perform_enqueued_jobs do
 
 662           post auth_path(:provider => "microsoft", :origin => "/user/new")
 
 663           assert_redirected_to auth_success_path(:provider => "microsoft")
 
 665           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 666                                :email => new_email, :email_hmac => email_hmac,
 
 667                                :auth_provider => "microsoft", :auth_uid => auth_uid
 
 670                :params => { :user => { :email => new_email,
 
 671                                        :display_name => display_name,
 
 672                                        :auth_provider => "microsoft",
 
 673                                        :auth_uid => auth_uid },
 
 674                             :email_hmac => email_hmac }
 
 675           assert_redirected_to welcome_path
 
 682     assert_response :success
 
 683     assert_template "site/welcome"
 
 686   def test_user_create_microsoft_duplicate_email
 
 687     dup_user = create(:user)
 
 688     display_name = "new_tester-microsoft"
 
 689     auth_uid = "123454321"
 
 691     OmniAuth.config.add_mock(:microsoft,
 
 693                              :info => { :email => dup_user.email, :name => display_name })
 
 695     post auth_path(:provider => "microsoft", :origin => "/user/new")
 
 696     assert_redirected_to auth_success_path(:provider => "microsoft")
 
 698     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => dup_user.email,
 
 699                          :email_hmac => UsersController.message_hmac(dup_user.email),
 
 700                          :auth_provider => "microsoft", :auth_uid => auth_uid
 
 703     assert_response :success
 
 704     assert_template "users/new"
 
 705     assert_select "form > div > input.is-invalid#user_email"
 
 708   def test_user_create_microsoft_failure
 
 709     OmniAuth.config.mock_auth[:microsoft] = :connection_failed
 
 711     assert_difference("User.count", 0) do
 
 712       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 713         perform_enqueued_jobs do
 
 714           post auth_path(:provider => "microsoft", :origin => "/user/new")
 
 715           assert_response :redirect
 
 717           assert_redirected_to auth_failure_path(:strategy => "microsoft", :message => "connection_failed", :origin => "/user/new")
 
 719           assert_redirected_to "/user/new"
 
 725   def test_user_create_microsoft_redirect
 
 726     orig_email = "redirect_tester_microsoft_orig@osm.org"
 
 727     email_hmac = UsersController.message_hmac(orig_email)
 
 728     new_email = "redirect_tester_microsoft@osm.org"
 
 729     display_name = "redirect_tester_microsoft"
 
 730     auth_uid = "123454321"
 
 732     OmniAuth.config.add_mock(:microsoft,
 
 734                              :info => { :email => orig_email, :name => display_name })
 
 736     assert_difference("User.count") do
 
 737       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 738         perform_enqueued_jobs do
 
 739           post auth_path(:provider => "microsoft", :origin => "/user/new")
 
 740           assert_redirected_to auth_success_path(:provider => "microsoft")
 
 742           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 743                                :email => orig_email, :email_hmac => email_hmac,
 
 744                                :auth_provider => "microsoft", :auth_uid => auth_uid
 
 748                :params => { :user => { :email => new_email,
 
 749                                        :email_hmac => email_hmac,
 
 750                                        :display_name => display_name,
 
 751                                        :auth_provider => "microsoft",
 
 752                                        :auth_uid => auth_uid } }
 
 753           assert_response :redirect
 
 760     register_email = ActionMailer::Base.deliveries.first
 
 762     assert_equal register_email.to.first, new_email
 
 763     # Check that the confirm account url is correct
 
 764     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 765     email_text_parts(register_email).each do |part|
 
 766       assert_match confirm_regex, part.body.to_s
 
 768     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 771     assert_response :success
 
 772     assert_template "confirmations/confirm"
 
 774     # Go to the confirmation page
 
 775     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 776     assert_response :success
 
 777     assert_template "confirmations/confirm"
 
 779     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 780     assert_response :redirect
 
 782     assert_response :success
 
 783     assert_template "site/welcome"
 
 786   def test_user_create_github_success
 
 787     new_email = "newtester-github@osm.org"
 
 788     email_hmac = UsersController.message_hmac(new_email)
 
 789     display_name = "new_tester-github"
 
 790     password = "testtest"
 
 791     auth_uid = "123454321"
 
 793     OmniAuth.config.add_mock(:github,
 
 795                              :info => { "email" => new_email, :name => display_name })
 
 797     assert_difference("User.count") do
 
 798       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
 799         perform_enqueued_jobs do
 
 800           post auth_path(:provider => "github", :origin => "/user/new")
 
 801           assert_redirected_to auth_success_path(:provider => "github")
 
 803           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 804                                :email => new_email, :email_hmac => email_hmac,
 
 805                                :auth_provider => "github", :auth_uid => auth_uid
 
 809                :params => { :user => { :email => new_email,
 
 810                                        :display_name => display_name,
 
 811                                        :auth_provider => "github",
 
 812                                        :auth_uid => "123454321",
 
 813                                        :pass_crypt => password,
 
 814                                        :pass_crypt_confirmation => password },
 
 817                             :email_hmac => email_hmac }
 
 818           assert_redirected_to welcome_path
 
 825     assert_response :success
 
 826     assert_template "site/welcome"
 
 829   def test_user_create_github_duplicate_email
 
 830     dup_user = create(:user)
 
 831     display_name = "new_tester-github"
 
 832     auth_uid = "123454321"
 
 834     OmniAuth.config.add_mock(:github,
 
 836                              :extra => { :id_info => { :openid_id => "http://localhost:1123/new.tester" } },
 
 837                              :info => { :email => dup_user.email, :name => display_name })
 
 839     post auth_path(:provider => "github", :origin => "/user/new")
 
 840     assert_redirected_to auth_success_path(:provider => "github")
 
 842     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 843                          :email => dup_user.email, :email_hmac => UsersController.message_hmac(dup_user.email),
 
 844                          :auth_provider => "github", :auth_uid => auth_uid
 
 847     assert_response :success
 
 848     assert_template "users/new"
 
 849     assert_select "form > div > input.is-invalid#user_email"
 
 852   def test_user_create_github_failure
 
 853     OmniAuth.config.mock_auth[:github] = :connection_failed
 
 855     assert_difference("User.count", 0) do
 
 856       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 857         perform_enqueued_jobs do
 
 858           post auth_path(:provider => "github", :origin => "/user/new")
 
 860           assert_redirected_to auth_failure_path(:strategy => "github", :message => "connection_failed", :origin => "/user/new")
 
 862           assert_redirected_to "/user/new"
 
 868   def test_user_create_github_redirect
 
 869     orig_email = "redirect_tester_github_orig@osm.org"
 
 870     email_hmac = UsersController.message_hmac(orig_email)
 
 871     new_email = "redirect_tester_github@osm.org"
 
 872     display_name = "redirect_tester_github"
 
 873     auth_uid = "123454321"
 
 875     OmniAuth.config.add_mock(:github,
 
 877                              :info => { :email => orig_email, :name => display_name })
 
 879     assert_difference("User.count") do
 
 880       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 881         perform_enqueued_jobs do
 
 882           post auth_path(:provider => "github", :origin => "/user/new")
 
 883           assert_redirected_to auth_success_path(:provider => "github")
 
 885           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 886                                :email => orig_email, :email_hmac => email_hmac,
 
 887                                :auth_provider => "github", :auth_uid => auth_uid
 
 890                :params => { :user => { :email => new_email,
 
 891                                        :email_hmac => email_hmac,
 
 892                                        :display_name => display_name,
 
 893                                        :auth_provider => "github",
 
 894                                        :auth_uid => auth_uid } }
 
 895           assert_response :redirect
 
 902     register_email = ActionMailer::Base.deliveries.first
 
 904     assert_equal register_email.to.first, new_email
 
 905     # Check that the confirm account url is correct
 
 906     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 907     email_text_parts(register_email).each do |part|
 
 908       assert_match confirm_regex, part.body.to_s
 
 910     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 913     assert_response :success
 
 914     assert_template "confirmations/confirm"
 
 916     # Go to the confirmation page
 
 917     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 918     assert_response :success
 
 919     assert_template "confirmations/confirm"
 
 921     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 922     assert_response :redirect
 
 924     assert_response :success
 
 925     assert_template "site/welcome"
 
 928   def test_user_create_wikipedia_success
 
 929     new_email = "newtester-wikipedia@osm.org"
 
 930     email_hmac = UsersController.message_hmac(new_email)
 
 931     display_name = "new_tester-wikipedia"
 
 932     password = "testtest"
 
 933     auth_uid = "123454321"
 
 935     OmniAuth.config.add_mock(:wikipedia,
 
 937                              :info => { :email => new_email, :name => display_name })
 
 939     assert_difference("User.count") do
 
 940       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
 941         perform_enqueued_jobs do
 
 942           post auth_path(:provider => "wikipedia", :origin => "/user/new")
 
 943           assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
 
 945           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 946                                :email => new_email, :email_hmac => email_hmac,
 
 947                                :auth_provider => "wikipedia", :auth_uid => auth_uid
 
 950                :params => { :user => { :email => new_email,
 
 951                                        :display_name => display_name,
 
 952                                        :auth_provider => "wikipedia",
 
 953                                        :auth_uid => "123454321",
 
 954                                        :pass_crypt => password,
 
 955                                        :pass_crypt_confirmation => password },
 
 958                             :email_hmac => email_hmac }
 
 959           assert_redirected_to welcome_path
 
 966     assert_response :success
 
 967     assert_template "site/welcome"
 
 970   def test_user_create_wikipedia_duplicate_email
 
 971     dup_user = create(:user)
 
 972     display_name = "new_tester-wikipedia"
 
 973     auth_uid = "123454321"
 
 975     OmniAuth.config.add_mock(:wikipedia,
 
 977                              :info => { "email" => dup_user.email, :name => display_name })
 
 979     post auth_path(:provider => "wikipedia", :origin => "/user/new")
 
 980     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
 
 982     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 983                          :email => dup_user.email, :email_hmac => UsersController.message_hmac(dup_user.email),
 
 984                          :auth_provider => "wikipedia", :auth_uid => auth_uid
 
 987     assert_response :success
 
 988     assert_template "users/new"
 
 989     assert_select "form > div > input.is-invalid#user_email"
 
 992   def test_user_create_wikipedia_failure
 
 993     OmniAuth.config.mock_auth[:wikipedia] = :connection_failed
 
 995     assert_difference("User.count", 0) do
 
 996       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 997         perform_enqueued_jobs do
 
 998           post auth_path(:provider => "wikipedia", :origin => "/user/new")
 
 999           assert_response :redirect
 
1001           assert_redirected_to auth_failure_path(:strategy => "wikipedia", :message => "connection_failed", :origin => "/user/new")
 
1003           assert_redirected_to "/user/new"
 
1009   def test_user_create_wikipedia_redirect
 
1010     orig_email = "redirect_tester_wikipedia_orig@osm.org"
 
1011     email_hmac = UsersController.message_hmac(orig_email)
 
1012     new_email = "redirect_tester_wikipedia@osm.org"
 
1013     display_name = "redirect_tester_wikipedia"
 
1014     auth_uid = "123454321"
 
1016     OmniAuth.config.add_mock(:wikipedia,
 
1018                              :info => { :email => orig_email, :name => display_name })
 
1020     # nothing special about this page, just need a protected page to redirect back to.
 
1021     assert_difference("User.count") do
 
1022       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
1023         perform_enqueued_jobs do
 
1024           post auth_path(:provider => "wikipedia", :origin => "/user/new")
 
1025           assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
 
1027           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
1028                                :email => orig_email, :email_hmac => email_hmac,
 
1029                                :auth_provider => "wikipedia", :auth_uid => auth_uid
 
1033                :params => { :user => { :email => new_email,
 
1034                                        :email_hmac => email_hmac,
 
1035                                        :display_name => display_name,
 
1036                                        :auth_provider => "wikipedia",
 
1037                                        :auth_uid => auth_uid } }
 
1038           assert_response :redirect
 
1045     register_email = ActionMailer::Base.deliveries.first
 
1047     assert_equal register_email.to.first, new_email
 
1048     # Check that the confirm account url is correct
 
1049     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
1050     email_text_parts(register_email).each do |part|
 
1051       assert_match confirm_regex, part.body.to_s
 
1053     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
1056     assert_response :success
 
1057     assert_template "confirmations/confirm"
 
1059     # Go to the confirmation page
 
1060     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
1061     assert_response :success
 
1062     assert_template "confirmations/confirm"
 
1064     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
1065     assert_response :redirect
 
1067     assert_response :success
 
1068     assert_template "site/welcome"