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[:google] = nil
 
  12     OmniAuth.config.mock_auth[:facebook] = nil
 
  13     OmniAuth.config.mock_auth[:microsoft] = nil
 
  14     OmniAuth.config.mock_auth[:github] = nil
 
  15     OmniAuth.config.mock_auth[:wikipedia] = nil
 
  16     OmniAuth.config.test_mode = false
 
  19   def test_create_user_form
 
  22     assert_response :success
 
  23     assert_template "users/new"
 
  26   def test_user_create_submit_duplicate_email
 
  27     dup_email = create(:user).email
 
  28     display_name = "new_tester"
 
  29     assert_difference("User.count", 0) do
 
  30       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
  31         perform_enqueued_jobs do
 
  33                :params => { :user => { :email => dup_email,
 
  34                                        :display_name => display_name,
 
  35                                        :pass_crypt => "testtest",
 
  36                                        :pass_crypt_confirmation => "testtest" } }
 
  40     assert_response :success
 
  41     assert_template "users/new"
 
  43     assert_select "form > div > input.is-invalid#user_email"
 
  46   def test_user_create_association_submit_duplicate_email
 
  47     dup_email = create(:user).email
 
  48     display_name = "new_tester"
 
  49     assert_difference("User.count", 0) do
 
  50       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
  51         perform_enqueued_jobs do
 
  53                :params => { :user => { :email => dup_email,
 
  54                                        :display_name => display_name,
 
  55                                        :pass_crypt => "testtest",
 
  56                                        :pass_crypt_confirmation => "testtest",
 
  57                                        :auth_provider => "google",
 
  58                                        :auth_uid => "123454321" } }
 
  62     assert_response :success
 
  63     assert_template "users/new"
 
  65     assert_select "form > div > input.is-invalid#user_email"
 
  68   def test_user_create_submit_duplicate_username
 
  69     dup_display_name = create(:user).display_name
 
  71     assert_difference("User.count", 0) do
 
  72       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
  73         perform_enqueued_jobs do
 
  75                :params => { :user => { :email => email,
 
  76                                        :display_name => dup_display_name,
 
  77                                        :pass_crypt => "testtest",
 
  78                                        :pass_crypt_confirmation => "testtest" } }
 
  82     assert_response :success
 
  83     assert_template "users/new"
 
  84     assert_select "form > div > input.is-invalid#user_display_name"
 
  87   def test_user_create_submit_mismatched_passwords
 
  88     email = "newtester@osm.org"
 
  89     display_name = "new_tester"
 
  90     assert_difference("User.count", 0) do
 
  91       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
  92         perform_enqueued_jobs do
 
  94                :params => { :user => { :email => email,
 
  95                                        :display_name => display_name,
 
  96                                        :pass_crypt => "testtest",
 
  97                                        :pass_crypt_confirmation => "blahblah" } }
 
 101     assert_response :success
 
 102     assert_template "users/new"
 
 103     assert_select "form > div > div > div > input.is-invalid#user_pass_crypt_confirmation"
 
 106   def test_user_create_association_submit_duplicate_username
 
 107     dup_display_name = create(:user).display_name
 
 109     assert_difference("User.count", 0) do
 
 110       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
 111         perform_enqueued_jobs do
 
 113                :params => { :user => { :email => email,
 
 114                                        :display_name => dup_display_name,
 
 115                                        :auth_provider => "google",
 
 116                                        :auth_uid => "123454321" } }
 
 120     assert_response :success
 
 121     assert_template "users/new"
 
 122     assert_select "form > div > input.is-invalid#user_display_name"
 
 125   def test_user_create_success
 
 126     new_email = "newtester@osm.org"
 
 127     display_name = "new_tester"
 
 129     assert_difference("User.count", 1) do
 
 130       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 131         perform_enqueued_jobs do
 
 133                :params => { :user => { :email => new_email,
 
 134                                        :display_name => display_name,
 
 135                                        :pass_crypt => "testtest",
 
 136                                        :pass_crypt_confirmation => "testtest" } }
 
 137           assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
 
 143     assert_response :success
 
 144     assert_template "confirmations/confirm"
 
 146     user = User.find_by(:email => "newtester@osm.org")
 
 148     assert_not_predicate user, :active?
 
 150     register_email = ActionMailer::Base.deliveries.first
 
 151     assert_equal register_email.to.first, new_email
 
 152     found_confirmation_url = register_email.parts.first.parts.first.to_s =~ %r{\shttp://test.host(/\S+)\s}
 
 153     assert found_confirmation_url
 
 154     confirmation_url = Regexp.last_match(1)
 
 156     post confirmation_url
 
 158     assert_redirected_to welcome_path
 
 161     assert_predicate user, :active?
 
 163     assert_equal user, User.authenticate(:username => new_email, :password => "testtest")
 
 166   # Check that the user can successfully recover their password
 
 167   # def test_lost_password_recovery_success
 
 168   #   Open the lost password form
 
 169   #   Submit the lost password form
 
 171   #   Submit the reset password token
 
 172   #   Check that the password has changed, and the user can login
 
 175   def test_user_create_redirect
 
 176     new_email = "redirect_tester@osm.org"
 
 177     display_name = "redirect_tester"
 
 178     password = "testtest"
 
 179     # nothing special about this page, just need a protected page to redirect back to.
 
 180     referer = "/traces/mine"
 
 181     assert_difference("User.count") do
 
 182       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 183         perform_enqueued_jobs do
 
 185                :params => { :user => { :email => new_email,
 
 186                                        :display_name => display_name,
 
 187                                        :pass_crypt => password,
 
 188                                        :pass_crypt_confirmation => password },
 
 189                             :referer => referer }
 
 190           assert_response(:redirect)
 
 191           assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
 
 198     register_email = ActionMailer::Base.deliveries.first
 
 200     assert_equal register_email.to.first, new_email
 
 201     # Check that the confirm account url is correct
 
 202     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 203     email_text_parts(register_email).each do |part|
 
 204       assert_match confirm_regex, part.body.to_s
 
 206     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 209     assert_response :success
 
 210     assert_template "confirmations/confirm"
 
 212     # Go to the confirmation page
 
 213     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 214     assert_response :success
 
 215     assert_template "confirmations/confirm"
 
 217     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 218     assert_response :redirect
 
 220     assert_response :success
 
 221     assert_template "site/welcome"
 
 224   def test_user_create_google_success
 
 225     new_email = "newtester-google@osm.org"
 
 226     email_hmac = UsersController.message_hmac(new_email)
 
 227     display_name = "new_tester-google"
 
 228     auth_uid = "123454321"
 
 230     OmniAuth.config.add_mock(:google,
 
 232                              :extra => { :id_info => { :openid_id => "http://localhost:1123/new.tester" } },
 
 233                              :info => { :email => new_email, :name => display_name })
 
 235     assert_difference("User.count") do
 
 236       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
 237         perform_enqueued_jobs do
 
 238           post auth_path(:provider => "google", :origin => "/user/new")
 
 239           assert_redirected_to auth_success_path(:provider => "google")
 
 241           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 242                                :email => new_email, :email_hmac => email_hmac,
 
 243                                :auth_provider => "google", :auth_uid => auth_uid
 
 247                :params => { :user => { :email => new_email,
 
 248                                        :display_name => display_name,
 
 249                                        :auth_provider => "google",
 
 250                                        :auth_uid => auth_uid },
 
 251                             :email_hmac => email_hmac }
 
 252           assert_redirected_to welcome_path
 
 259     assert_response :success
 
 260     assert_template "site/welcome"
 
 263   def test_user_create_google_duplicate_email
 
 264     dup_user = create(:user)
 
 265     display_name = "new_tester-google"
 
 266     auth_uid = "123454321"
 
 268     OmniAuth.config.add_mock(:google,
 
 270                              :extra => { :id_info => { :openid_id => "http://localhost:1123/new.tester" } },
 
 271                              :info => { :email => dup_user.email, :name => display_name })
 
 273     post auth_path(:provider => "google", :origin => "/user/new")
 
 274     assert_redirected_to auth_success_path(:provider => "google")
 
 276     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => dup_user.email,
 
 277                          :email_hmac => UsersController.message_hmac(dup_user.email),
 
 278                          :auth_provider => "google", :auth_uid => auth_uid
 
 281     assert_response :success
 
 282     assert_template "users/new"
 
 283     assert_select "form > div > input.is-invalid#user_email"
 
 286   def test_user_create_google_failure
 
 287     OmniAuth.config.mock_auth[:google] = :connection_failed
 
 289     assert_difference("User.count", 0) do
 
 290       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 291         perform_enqueued_jobs do
 
 292           post auth_path(:provider => "google", :origin => "/user/new")
 
 293           assert_response :redirect
 
 295           assert_redirected_to auth_failure_path(:strategy => "google", :message => "connection_failed", :origin => "/user/new")
 
 297           assert_redirected_to "/user/new"
 
 303   def test_user_create_google_redirect
 
 304     orig_email = "redirect_tester_google_orig@google.com"
 
 305     email_hmac = UsersController.message_hmac(orig_email)
 
 306     new_email =  "redirect_tester_google@osm.org"
 
 307     display_name = "redirect_tester_google"
 
 308     auth_uid = "123454321"
 
 310     OmniAuth.config.add_mock(:google,
 
 312                              :extra => { :id_info => { :openid_id => "http://localhost:1123/new.tester" } },
 
 313                              :info => { :email => orig_email, :name => display_name })
 
 315     assert_difference("User.count") do
 
 316       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 317         perform_enqueued_jobs do
 
 318           post auth_path(:provider => "google", :origin => "/user/new")
 
 319           assert_redirected_to auth_success_path(:provider => "google")
 
 321           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 322                                :email => orig_email, :email_hmac => email_hmac,
 
 323                                :auth_provider => "google", :auth_uid => auth_uid
 
 326                :params => { :user => { :email => new_email,
 
 327                                        :email_hmac => email_hmac,
 
 328                                        :display_name => display_name,
 
 329                                        :auth_provider => "google",
 
 330                                        :auth_uid => auth_uid } }
 
 331           assert_response :redirect
 
 338     register_email = ActionMailer::Base.deliveries.first
 
 340     assert_equal register_email.to.first, new_email
 
 341     # Check that the confirm account url is correct
 
 342     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 343     email_text_parts(register_email).each do |part|
 
 344       assert_match confirm_regex, part.body.to_s
 
 346     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 349     assert_response :success
 
 350     assert_template "confirmations/confirm"
 
 352     # Go to the confirmation page
 
 353     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 354     assert_response :success
 
 355     assert_template "confirmations/confirm"
 
 357     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 358     assert_response :redirect
 
 360     assert_response :success
 
 361     assert_template "site/welcome"
 
 364   def test_user_create_facebook_success
 
 365     new_email = "newtester-facebook@osm.org"
 
 366     email_hmac = UsersController.message_hmac(new_email)
 
 367     display_name = "new_tester-facebook"
 
 368     auth_uid = "123454321"
 
 370     OmniAuth.config.add_mock(:facebook,
 
 372                              :info => { "email" => new_email, :name => display_name })
 
 374     assert_difference("User.count") do
 
 375       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
 376         perform_enqueued_jobs do
 
 377           post auth_path(:provider => "facebook", :origin => "/user/new")
 
 378           assert_redirected_to auth_success_path(:provider => "facebook")
 
 380           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 381                                :email => new_email, :email_hmac => email_hmac,
 
 382                                :auth_provider => "facebook", :auth_uid => auth_uid
 
 386                :params => { :user => { :email => new_email,
 
 387                                        :display_name => display_name,
 
 388                                        :auth_provider => "facebook",
 
 389                                        :auth_uid => auth_uid },
 
 390                             :email_hmac => email_hmac }
 
 391           assert_redirected_to welcome_path
 
 398     assert_response :success
 
 399     assert_template "site/welcome"
 
 402   def test_user_create_facebook_duplicate_email
 
 403     dup_user = create(:user)
 
 404     display_name = "new_tester-facebook"
 
 405     auth_uid = "123454321"
 
 407     OmniAuth.config.add_mock(:facebook,
 
 409                              :info => { :email => dup_user.email, :name => display_name })
 
 411     post auth_path(:provider => "facebook", :origin => "/user/new")
 
 412     assert_redirected_to auth_success_path(:provider => "facebook")
 
 414     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => dup_user.email,
 
 415                          :email_hmac => UsersController.message_hmac(dup_user.email),
 
 416                          :auth_provider => "facebook", :auth_uid => auth_uid
 
 419     assert_response :success
 
 420     assert_template "users/new"
 
 421     assert_select "form > div > input.is-invalid#user_email"
 
 424   def test_user_create_facebook_failure
 
 425     OmniAuth.config.mock_auth[:facebook] = :connection_failed
 
 427     assert_difference("User.count", 0) do
 
 428       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 429         perform_enqueued_jobs do
 
 430           post auth_path(:provider => "facebook", :origin => "/user/new")
 
 431           assert_response :redirect
 
 433           assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "connection_failed", :origin => "/user/new")
 
 435           assert_redirected_to "/user/new"
 
 441   def test_user_create_facebook_redirect
 
 442     orig_email = "redirect_tester_facebook_orig@osm.org"
 
 443     email_hmac = UsersController.message_hmac(orig_email)
 
 444     new_email = "redirect_tester_facebook@osm.org"
 
 445     display_name = "redirect_tester_facebook"
 
 446     auth_uid = "123454321"
 
 448     OmniAuth.config.add_mock(:facebook,
 
 450                              :info => { :email => orig_email, :name => display_name })
 
 452     # nothing special about this page, just need a protected page to redirect back to.
 
 453     assert_difference("User.count") do
 
 454       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 455         perform_enqueued_jobs do
 
 456           post auth_path(:provider => "facebook", :origin => "/user/new")
 
 457           assert_redirected_to auth_success_path(:provider => "facebook")
 
 459           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 460                                :email => orig_email, :email_hmac => email_hmac,
 
 461                                :auth_provider => "facebook", :auth_uid => auth_uid
 
 465                :params => { :user => { :email => new_email,
 
 466                                        :email_hmac => email_hmac,
 
 467                                        :display_name => display_name,
 
 468                                        :auth_provider => "facebook",
 
 469                                        :auth_uid => auth_uid } }
 
 470           assert_response :redirect
 
 477     register_email = ActionMailer::Base.deliveries.first
 
 479     assert_equal register_email.to.first, new_email
 
 480     # Check that the confirm account url is correct
 
 481     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 482     email_text_parts(register_email).each do |part|
 
 483       assert_match confirm_regex, part.body.to_s
 
 485     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 488     assert_response :success
 
 489     assert_template "confirmations/confirm"
 
 491     # Go to the confirmation page
 
 492     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 493     assert_response :success
 
 494     assert_template "confirmations/confirm"
 
 496     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 497     assert_response :redirect
 
 499     assert_response :success
 
 500     assert_template "site/welcome"
 
 503   def test_user_create_microsoft_success
 
 504     new_email = "newtester-microsoft@osm.org"
 
 505     email_hmac = UsersController.message_hmac(new_email)
 
 506     display_name = "new_tester-microsoft"
 
 507     auth_uid = "123454321"
 
 509     OmniAuth.config.add_mock(:microsoft,
 
 511                              :info => { "email" => new_email, :name => display_name })
 
 513     assert_difference("User.count") do
 
 514       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 515         perform_enqueued_jobs do
 
 516           post auth_path(:provider => "microsoft", :origin => "/user/new")
 
 517           assert_redirected_to auth_success_path(:provider => "microsoft")
 
 519           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 520                                :email => new_email, :email_hmac => email_hmac,
 
 521                                :auth_provider => "microsoft", :auth_uid => auth_uid
 
 524                :params => { :user => { :email => new_email,
 
 525                                        :display_name => display_name,
 
 526                                        :auth_provider => "microsoft",
 
 527                                        :auth_uid => auth_uid },
 
 528                             :email_hmac => email_hmac }
 
 529           assert_redirected_to welcome_path
 
 536     assert_response :success
 
 537     assert_template "site/welcome"
 
 540   def test_user_create_microsoft_duplicate_email
 
 541     dup_user = create(:user)
 
 542     display_name = "new_tester-microsoft"
 
 543     auth_uid = "123454321"
 
 545     OmniAuth.config.add_mock(:microsoft,
 
 547                              :info => { :email => dup_user.email, :name => display_name })
 
 549     post auth_path(:provider => "microsoft", :origin => "/user/new")
 
 550     assert_redirected_to auth_success_path(:provider => "microsoft")
 
 552     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => dup_user.email,
 
 553                          :email_hmac => UsersController.message_hmac(dup_user.email),
 
 554                          :auth_provider => "microsoft", :auth_uid => auth_uid
 
 557     assert_response :success
 
 558     assert_template "users/new"
 
 559     assert_select "form > div > input.is-invalid#user_email"
 
 562   def test_user_create_microsoft_failure
 
 563     OmniAuth.config.mock_auth[:microsoft] = :connection_failed
 
 565     assert_difference("User.count", 0) do
 
 566       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 567         perform_enqueued_jobs do
 
 568           post auth_path(:provider => "microsoft", :origin => "/user/new")
 
 569           assert_response :redirect
 
 571           assert_redirected_to auth_failure_path(:strategy => "microsoft", :message => "connection_failed", :origin => "/user/new")
 
 573           assert_redirected_to "/user/new"
 
 579   def test_user_create_microsoft_redirect
 
 580     orig_email = "redirect_tester_microsoft_orig@osm.org"
 
 581     email_hmac = UsersController.message_hmac(orig_email)
 
 582     new_email = "redirect_tester_microsoft@osm.org"
 
 583     display_name = "redirect_tester_microsoft"
 
 584     auth_uid = "123454321"
 
 586     OmniAuth.config.add_mock(:microsoft,
 
 588                              :info => { :email => orig_email, :name => display_name })
 
 590     assert_difference("User.count") do
 
 591       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 592         perform_enqueued_jobs do
 
 593           post auth_path(:provider => "microsoft", :origin => "/user/new")
 
 594           assert_redirected_to auth_success_path(:provider => "microsoft")
 
 596           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 597                                :email => orig_email, :email_hmac => email_hmac,
 
 598                                :auth_provider => "microsoft", :auth_uid => auth_uid
 
 602                :params => { :user => { :email => new_email,
 
 603                                        :email_hmac => email_hmac,
 
 604                                        :display_name => display_name,
 
 605                                        :auth_provider => "microsoft",
 
 606                                        :auth_uid => auth_uid } }
 
 607           assert_response :redirect
 
 614     register_email = ActionMailer::Base.deliveries.first
 
 616     assert_equal register_email.to.first, new_email
 
 617     # Check that the confirm account url is correct
 
 618     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 619     email_text_parts(register_email).each do |part|
 
 620       assert_match confirm_regex, part.body.to_s
 
 622     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 625     assert_response :success
 
 626     assert_template "confirmations/confirm"
 
 628     # Go to the confirmation page
 
 629     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 630     assert_response :success
 
 631     assert_template "confirmations/confirm"
 
 633     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 634     assert_response :redirect
 
 636     assert_response :success
 
 637     assert_template "site/welcome"
 
 640   def test_user_create_github_success
 
 641     new_email = "newtester-github@osm.org"
 
 642     email_hmac = UsersController.message_hmac(new_email)
 
 643     display_name = "new_tester-github"
 
 644     password = "testtest"
 
 645     auth_uid = "123454321"
 
 647     OmniAuth.config.add_mock(:github,
 
 649                              :info => { "email" => new_email, :name => display_name })
 
 651     assert_difference("User.count") do
 
 652       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
 653         perform_enqueued_jobs do
 
 654           post auth_path(:provider => "github", :origin => "/user/new")
 
 655           assert_redirected_to auth_success_path(:provider => "github")
 
 657           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 658                                :email => new_email, :email_hmac => email_hmac,
 
 659                                :auth_provider => "github", :auth_uid => auth_uid
 
 663                :params => { :user => { :email => new_email,
 
 664                                        :display_name => display_name,
 
 665                                        :auth_provider => "github",
 
 666                                        :auth_uid => "123454321",
 
 667                                        :pass_crypt => password,
 
 668                                        :pass_crypt_confirmation => password },
 
 671                             :email_hmac => email_hmac }
 
 672           assert_redirected_to welcome_path
 
 679     assert_response :success
 
 680     assert_template "site/welcome"
 
 683   def test_user_create_github_duplicate_email
 
 684     dup_user = create(:user)
 
 685     display_name = "new_tester-github"
 
 686     auth_uid = "123454321"
 
 688     OmniAuth.config.add_mock(:github,
 
 690                              :extra => { :id_info => { :openid_id => "http://localhost:1123/new.tester" } },
 
 691                              :info => { :email => dup_user.email, :name => display_name })
 
 693     post auth_path(:provider => "github", :origin => "/user/new")
 
 694     assert_redirected_to auth_success_path(:provider => "github")
 
 696     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 697                          :email => dup_user.email, :email_hmac => UsersController.message_hmac(dup_user.email),
 
 698                          :auth_provider => "github", :auth_uid => auth_uid
 
 701     assert_response :success
 
 702     assert_template "users/new"
 
 703     assert_select "form > div > input.is-invalid#user_email"
 
 706   def test_user_create_github_failure
 
 707     OmniAuth.config.mock_auth[:github] = :connection_failed
 
 709     assert_difference("User.count", 0) do
 
 710       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 711         perform_enqueued_jobs do
 
 712           post auth_path(:provider => "github", :origin => "/user/new")
 
 714           assert_redirected_to auth_failure_path(:strategy => "github", :message => "connection_failed", :origin => "/user/new")
 
 716           assert_redirected_to "/user/new"
 
 722   def test_user_create_github_redirect
 
 723     orig_email = "redirect_tester_github_orig@osm.org"
 
 724     email_hmac = UsersController.message_hmac(orig_email)
 
 725     new_email = "redirect_tester_github@osm.org"
 
 726     display_name = "redirect_tester_github"
 
 727     auth_uid = "123454321"
 
 729     OmniAuth.config.add_mock(:github,
 
 731                              :info => { :email => orig_email, :name => display_name })
 
 733     assert_difference("User.count") do
 
 734       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 735         perform_enqueued_jobs do
 
 736           post auth_path(:provider => "github", :origin => "/user/new")
 
 737           assert_redirected_to auth_success_path(:provider => "github")
 
 739           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 740                                :email => orig_email, :email_hmac => email_hmac,
 
 741                                :auth_provider => "github", :auth_uid => auth_uid
 
 744                :params => { :user => { :email => new_email,
 
 745                                        :email_hmac => email_hmac,
 
 746                                        :display_name => display_name,
 
 747                                        :auth_provider => "github",
 
 748                                        :auth_uid => auth_uid } }
 
 749           assert_response :redirect
 
 756     register_email = ActionMailer::Base.deliveries.first
 
 758     assert_equal register_email.to.first, new_email
 
 759     # Check that the confirm account url is correct
 
 760     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 761     email_text_parts(register_email).each do |part|
 
 762       assert_match confirm_regex, part.body.to_s
 
 764     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 767     assert_response :success
 
 768     assert_template "confirmations/confirm"
 
 770     # Go to the confirmation page
 
 771     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 772     assert_response :success
 
 773     assert_template "confirmations/confirm"
 
 775     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 776     assert_response :redirect
 
 778     assert_response :success
 
 779     assert_template "site/welcome"
 
 782   def test_user_create_wikipedia_success
 
 783     new_email = "newtester-wikipedia@osm.org"
 
 784     email_hmac = UsersController.message_hmac(new_email)
 
 785     display_name = "new_tester-wikipedia"
 
 786     password = "testtest"
 
 787     auth_uid = "123454321"
 
 789     OmniAuth.config.add_mock(:wikipedia,
 
 791                              :info => { :email => new_email, :name => display_name })
 
 793     assert_difference("User.count") do
 
 794       assert_no_difference("ActionMailer::Base.deliveries.size") do
 
 795         perform_enqueued_jobs do
 
 796           post auth_path(:provider => "wikipedia", :origin => "/user/new")
 
 797           assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
 
 799           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 800                                :email => new_email, :email_hmac => email_hmac,
 
 801                                :auth_provider => "wikipedia", :auth_uid => auth_uid
 
 804                :params => { :user => { :email => new_email,
 
 805                                        :display_name => display_name,
 
 806                                        :auth_provider => "wikipedia",
 
 807                                        :auth_uid => "123454321",
 
 808                                        :pass_crypt => password,
 
 809                                        :pass_crypt_confirmation => password },
 
 812                             :email_hmac => email_hmac }
 
 813           assert_redirected_to welcome_path
 
 820     assert_response :success
 
 821     assert_template "site/welcome"
 
 824   def test_user_create_wikipedia_duplicate_email
 
 825     dup_user = create(:user)
 
 826     display_name = "new_tester-wikipedia"
 
 827     auth_uid = "123454321"
 
 829     OmniAuth.config.add_mock(:wikipedia,
 
 831                              :info => { "email" => dup_user.email, :name => display_name })
 
 833     post auth_path(:provider => "wikipedia", :origin => "/user/new")
 
 834     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
 
 836     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 837                          :email => dup_user.email, :email_hmac => UsersController.message_hmac(dup_user.email),
 
 838                          :auth_provider => "wikipedia", :auth_uid => auth_uid
 
 841     assert_response :success
 
 842     assert_template "users/new"
 
 843     assert_select "form > div > input.is-invalid#user_email"
 
 846   def test_user_create_wikipedia_failure
 
 847     OmniAuth.config.mock_auth[:wikipedia] = :connection_failed
 
 849     assert_difference("User.count", 0) do
 
 850       assert_difference("ActionMailer::Base.deliveries.size", 0) do
 
 851         perform_enqueued_jobs do
 
 852           post auth_path(:provider => "wikipedia", :origin => "/user/new")
 
 853           assert_response :redirect
 
 855           assert_redirected_to auth_failure_path(:strategy => "wikipedia", :message => "connection_failed", :origin => "/user/new")
 
 857           assert_redirected_to "/user/new"
 
 863   def test_user_create_wikipedia_redirect
 
 864     orig_email = "redirect_tester_wikipedia_orig@osm.org"
 
 865     email_hmac = UsersController.message_hmac(orig_email)
 
 866     new_email = "redirect_tester_wikipedia@osm.org"
 
 867     display_name = "redirect_tester_wikipedia"
 
 868     auth_uid = "123454321"
 
 870     OmniAuth.config.add_mock(:wikipedia,
 
 872                              :info => { :email => orig_email, :name => display_name })
 
 874     # nothing special about this page, just need a protected page to redirect back to.
 
 875     assert_difference("User.count") do
 
 876       assert_difference("ActionMailer::Base.deliveries.size", 1) do
 
 877         perform_enqueued_jobs do
 
 878           post auth_path(:provider => "wikipedia", :origin => "/user/new")
 
 879           assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
 
 881           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
 
 882                                :email => orig_email, :email_hmac => email_hmac,
 
 883                                :auth_provider => "wikipedia", :auth_uid => auth_uid
 
 887                :params => { :user => { :email => new_email,
 
 888                                        :email_hmac => email_hmac,
 
 889                                        :display_name => display_name,
 
 890                                        :auth_provider => "wikipedia",
 
 891                                        :auth_uid => auth_uid } }
 
 892           assert_response :redirect
 
 899     register_email = ActionMailer::Base.deliveries.first
 
 901     assert_equal register_email.to.first, new_email
 
 902     # Check that the confirm account url is correct
 
 903     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
 
 904     email_text_parts(register_email).each do |part|
 
 905       assert_match confirm_regex, part.body.to_s
 
 907     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
 
 910     assert_response :success
 
 911     assert_template "confirmations/confirm"
 
 913     # Go to the confirmation page
 
 914     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 915     assert_response :success
 
 916     assert_template "confirmations/confirm"
 
 918     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
 
 919     assert_response :redirect
 
 921     assert_response :success
 
 922     assert_template "site/welcome"