1 # frozen_string_literal: true
 
   5 class ConfirmationsControllerTest < ActionDispatch::IntegrationTest
 
   7   # test all routes which lead to this controller
 
  10       { :path => "/user/username/confirm", :method => :get },
 
  11       { :controller => "confirmations", :action => "confirm", :display_name => "username" }
 
  14       { :path => "/user/username/confirm", :method => :post },
 
  15       { :controller => "confirmations", :action => "confirm", :display_name => "username" }
 
  18       { :path => "/user/username/confirm/resend", :method => :post },
 
  19       { :controller => "confirmations", :action => "confirm_resend", :display_name => "username" }
 
  23       { :path => "/user/confirm", :method => :get },
 
  24       { :controller => "confirmations", :action => "confirm" }
 
  27       { :path => "/user/confirm", :method => :post },
 
  28       { :controller => "confirmations", :action => "confirm" }
 
  31       { :path => "/user/confirm-email", :method => :get },
 
  32       { :controller => "confirmations", :action => "confirm_email" }
 
  35       { :path => "/user/confirm-email", :method => :post },
 
  36       { :controller => "confirmations", :action => "confirm_email" }
 
  41     user = build(:user, :pending)
 
  42     post users_path, :params => { :user => user.attributes }
 
  43     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
 
  45     get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
 
  46     assert_response :success
 
  47     assert_template :confirm
 
  50   def test_confirm_get_already_confirmed
 
  51     user = build(:user, :pending)
 
  52     stub_gravatar_request(user.email)
 
  53     post users_path, :params => { :user => user.attributes }
 
  54     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
 
  56     # Get the confirmation page
 
  57     get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
 
  58     assert_response :success
 
  59     assert_template :confirm
 
  62     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
 
  63     assert_redirected_to welcome_path
 
  65     # Now try to get the confirmation page again
 
  66     get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
 
  67     assert_redirected_to root_path
 
  70   def test_confirm_success_no_token_no_referer
 
  71     user = build(:user, :pending)
 
  72     stub_gravatar_request(user.email)
 
  73     post users_path, :params => { :user => user.attributes }
 
  74     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
 
  78     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
 
  79     assert_redirected_to login_path
 
  80     assert_match(/Confirmed your account/, flash[:notice])
 
  83   def test_confirm_success_good_token_no_referer
 
  84     user = build(:user, :pending)
 
  85     stub_gravatar_request(user.email)
 
  86     post users_path, :params => { :user => user.attributes }
 
  87     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
 
  89     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
 
  90     assert_redirected_to welcome_path
 
  93   def test_confirm_success_bad_token_no_referer
 
  94     user = build(:user, :pending)
 
  95     stub_gravatar_request(user.email)
 
  96     post users_path, :params => { :user => user.attributes }
 
  97     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
 
 100     session_for(create(:user))
 
 102     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
 
 103     assert_redirected_to login_path
 
 104     assert_match(/Confirmed your account/, flash[:notice])
 
 107   def test_confirm_success_no_token_with_referer
 
 108     user = build(:user, :pending)
 
 109     stub_gravatar_request(user.email)
 
 110     post users_path, :params => { :user => user.attributes }
 
 111     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
 
 115     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string, :referer => new_diary_entry_path }
 
 116     assert_redirected_to login_path(:referer => new_diary_entry_path)
 
 117     assert_match(/Confirmed your account/, flash[:notice])
 
 120   def test_confirm_success_good_token_with_referer
 
 121     user = build(:user, :pending)
 
 122     stub_gravatar_request(user.email)
 
 123     post users_path, :params => { :user => user.attributes }
 
 124     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
 
 126     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string, :referer => new_diary_entry_path }
 
 127     assert_redirected_to new_diary_entry_path
 
 130   def test_confirm_success_bad_token_with_referer
 
 131     user = build(:user, :pending)
 
 132     stub_gravatar_request(user.email)
 
 133     post users_path, :params => { :user => user.attributes }
 
 134     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
 
 137     session_for(create(:user))
 
 139     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string, :referer => new_diary_entry_path }
 
 140     assert_redirected_to login_path(:referer => new_diary_entry_path)
 
 141     assert_match(/Confirmed your account/, flash[:notice])
 
 144   def test_confirm_expired_token
 
 145     user = build(:user, :pending)
 
 146     stub_gravatar_request(user.email)
 
 147     post users_path, :params => { :user => user.attributes }
 
 148     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
 
 151       post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
 
 153     assert_redirected_to :action => "confirm"
 
 154     assert_match(/confirmation code has expired/, flash[:error])
 
 157   def test_confirm_already_confirmed
 
 158     user = build(:user, :pending)
 
 159     stub_gravatar_request(user.email)
 
 160     post users_path, :params => { :user => user.attributes }
 
 161     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
 
 163     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string, :referer => new_diary_entry_path }
 
 164     assert_redirected_to new_diary_entry_path
 
 168     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
 
 169     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string, :referer => new_diary_entry_path }
 
 170     assert_redirected_to login_path
 
 171     assert_match(/already been confirmed/, flash[:error])
 
 174   def test_confirm_deleted
 
 175     user = build(:user, :pending)
 
 176     stub_gravatar_request(user.email)
 
 177     post users_path, :params => { :user => user.attributes }
 
 178     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
 
 180     User.find_by(:display_name => user.display_name).hide!
 
 182     # Get the confirmation page
 
 183     get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
 
 184     assert_redirected_to root_path
 
 187     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
 
 188     assert_response :not_found
 
 189     assert_template :no_such_user
 
 192   def test_confirm_resend_success
 
 193     user = build(:user, :pending)
 
 194     post users_path, :params => { :user => user.attributes }
 
 196     assert_difference "ActionMailer::Base.deliveries.size", 1 do
 
 197       perform_enqueued_jobs do
 
 198         post user_confirm_resend_path(user)
 
 202     assert_redirected_to login_path
 
 203     assert_equal("confirmations/resend_success_flash", flash[:notice][:partial])
 
 204     assert_equal({ :email => user.email, :sender => Settings.email_from }, flash[:notice][:locals])
 
 206     email = ActionMailer::Base.deliveries.last
 
 208     assert_equal user.email, email.to.first
 
 211   def test_confirm_resend_deleted
 
 212     user = build(:user, :pending)
 
 213     post users_path, :params => { :user => user.attributes }
 
 215     User.find_by(:display_name => user.display_name).hide!
 
 217     assert_no_difference "ActionMailer::Base.deliveries.size" do
 
 218       perform_enqueued_jobs do
 
 219         post user_confirm_resend_path(user)
 
 223     assert_redirected_to login_path
 
 224     assert_match "User #{user.display_name} not found.", flash[:error]
 
 227   def test_confirm_resend_unknown_user
 
 228     assert_no_difference "ActionMailer::Base.deliveries.size" do
 
 229       perform_enqueued_jobs do
 
 230         post user_confirm_resend_path(:display_name => "No Such User")
 
 234     assert_redirected_to login_path
 
 235     assert_match "User No Such User not found.", flash[:error]
 
 238   def test_confirm_email_get
 
 240     confirm_string = user.generate_token_for(:new_email)
 
 242     get user_confirm_email_path, :params => { :confirm_string => confirm_string }
 
 243     assert_response :success
 
 244     assert_template :confirm_email
 
 247   def test_confirm_email_success
 
 248     user = create(:user, :new_email => "test-new@example.com")
 
 249     stub_gravatar_request(user.new_email)
 
 250     confirm_string = user.generate_token_for(:new_email)
 
 252     post user_confirm_email_path, :params => { :confirm_string => confirm_string }
 
 253     assert_redirected_to account_path
 
 254     assert_match(/Confirmed your change of email address/, flash[:notice])
 
 257   def test_confirm_email_already_confirmed
 
 259     confirm_string = user.generate_token_for(:new_email)
 
 261     post user_confirm_email_path, :params => { :confirm_string => confirm_string }
 
 262     assert_redirected_to account_path
 
 263     assert_match(/already been confirmed/, flash[:error])
 
 266   def test_confirm_email_bad_token
 
 267     post user_confirm_email_path, :params => { :confirm_string => "XXXXX" }
 
 268     assert_redirected_to account_path
 
 269     assert_match(/confirmation code has expired or does not exist/, flash[:error])
 
 273   # test if testing for a gravatar works
 
 274   # this happens when the email is actually changed
 
 275   # which is triggered by the confirmation mail
 
 276   def test_gravatar_auto_enable
 
 277     # switch to email that has a gravatar
 
 278     user = create(:user, :new_email => "test-new@example.com")
 
 279     stub_gravatar_request(user.new_email, 200)
 
 280     confirm_string = user.generate_token_for(:new_email)
 
 281     # precondition gravatar should be turned off
 
 282     assert_not user.image_use_gravatar
 
 283     post user_confirm_email_path, :params => { :confirm_string => confirm_string }
 
 284     assert_redirected_to account_path
 
 285     assert_match(/Confirmed your change of email address/, flash[:notice])
 
 286     # gravatar use should now be enabled
 
 287     assert User.find(user.id).image_use_gravatar
 
 290   def test_gravatar_auto_disable
 
 291     # switch to email without a gravatar
 
 292     user = create(:user, :new_email => "test-new@example.com", :image_use_gravatar => true)
 
 293     stub_gravatar_request(user.new_email, 404)
 
 294     confirm_string = user.generate_token_for(:new_email)
 
 295     # precondition gravatar should be turned on
 
 296     assert user.image_use_gravatar
 
 297     post user_confirm_email_path, :params => { :confirm_string => confirm_string }
 
 298     assert_redirected_to account_path
 
 299     assert_match(/Confirmed your change of email address/, flash[:notice])
 
 300     # gravatar use should now be disabled
 
 301     assert_not User.find(user.id).image_use_gravatar