1 # frozen_string_literal: true
 
   5 class AccountsControllerTest < ActionDispatch::IntegrationTest
 
   7   # test all routes which lead to this controller
 
  10       { :path => "/account", :method => :get },
 
  11       { :controller => "accounts", :action => "show" }
 
  14       { :path => "/account", :method => :put },
 
  15       { :controller => "accounts", :action => "update" }
 
  18       { :path => "/account", :method => :delete },
 
  19       { :controller => "accounts", :action => "destroy" }
 
  23     assert_redirected_to "/account"
 
  26   def test_show_and_update
 
  27     # Get a user to work with - note that this user deliberately
 
  28     # conflicts with uppercase_user in the email and display name
 
  29     # fields to test that we can change other fields without any
 
  30     # validation errors being reported
 
  31     user = create(:user, :languages => [])
 
  32     _uppercase_user = build(:user, :email => user.email.upcase, :display_name => user.display_name.upcase).tap { |u| u.save(:validate => false) }
 
  34     # Make sure that you are redirected to the login page when
 
  35     # you are not logged in
 
  37     assert_redirected_to login_path(:referer => account_path)
 
  39     # Make sure we get the page when we are logged in as the right user
 
  42     assert_response :success
 
  44     assert_select "form#accountForm" do |form|
 
  45       assert_equal "post", form.attr("method").to_s
 
  46       assert_select "input[name='_method']", true
 
  47       assert_equal "/account", form.attr("action").to_s
 
  50     # Updating the description using GET should fail
 
  51     user.description = "new description"
 
  52     user.preferred_editor = "default"
 
  53     get account_path, :params => { :user => user.attributes }
 
  54     assert_response :success
 
  56     assert_not_equal user.description, User.find(user.id).description
 
  58     # Adding external authentication should redirect to the auth provider
 
  59     patch account_path, :params => { :user => user.attributes.merge(:auth_provider => "google") }
 
  60     assert_redirected_to auth_path(:provider => "google", :origin => "/account")
 
  62     assert_redirected_to %r{^https://accounts.google.com/o/oauth2/auth\?.*}
 
  64     # Changing name to one that exists should fail
 
  65     new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name)
 
  66     patch account_path, :params => { :user => new_attributes }
 
  67     assert_response :success
 
  69     assert_select ".alert-success", false
 
  70     assert_select "form#accountForm > div > input.is-invalid#user_display_name"
 
  72     # Changing name to one that exists should fail, regardless of case
 
  73     new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name.upcase)
 
  74     patch account_path, :params => { :user => new_attributes }
 
  75     assert_response :success
 
  77     assert_select ".alert-success", false
 
  78     assert_select "form#accountForm > div > input.is-invalid#user_display_name"
 
  80     # Changing name to one that doesn't exist should work
 
  81     new_attributes = user.attributes.dup.merge(:display_name => "new tester")
 
  82     patch account_path, :params => { :user => new_attributes }
 
  83     assert_redirected_to account_path
 
  85     assert_response :success
 
  87     assert_select ".alert-success", /^User information updated successfully/
 
  88     assert_select "form#accountForm > div > input#user_display_name[value=?]", "new tester"
 
  90     # Record the change of name
 
  91     user.display_name = "new tester"
 
  93     # Changing email to one that exists should fail
 
  94     user.new_email = create(:user).email
 
  95     assert_no_difference "ActionMailer::Base.deliveries.size" do
 
  96       perform_enqueued_jobs do
 
  97         patch account_path, :params => { :user => user.attributes }
 
 100     assert_response :success
 
 101     assert_template :show
 
 102     assert_select ".alert-success", false
 
 103     assert_select "form#accountForm > div > input.is-invalid#user_new_email"
 
 105     # Changing email to one that exists should fail, regardless of case
 
 106     user.new_email = create(:user).email.upcase
 
 107     assert_no_difference "ActionMailer::Base.deliveries.size" do
 
 108       perform_enqueued_jobs do
 
 109         patch account_path, :params => { :user => user.attributes }
 
 112     assert_response :success
 
 113     assert_template :show
 
 114     assert_select ".alert-success", false
 
 115     assert_select "form#accountForm > div > input.is-invalid#user_new_email"
 
 117     # Changing email to one that doesn't exist should work
 
 118     user.new_email = "new_tester@example.com"
 
 119     assert_difference "ActionMailer::Base.deliveries.size", 1 do
 
 120       perform_enqueued_jobs do
 
 121         patch account_path, :params => { :user => user.attributes }
 
 124     assert_redirected_to account_path
 
 126     assert_response :success
 
 127     assert_template :show
 
 128     assert_select ".alert-success", /^User information updated successfully/
 
 129     assert_select "form#accountForm > div > input#user_new_email[value=?]", user.new_email
 
 130     email = ActionMailer::Base.deliveries.first
 
 131     assert_equal 1, email.to.count
 
 132     assert_equal user.new_email, email.to.first
 
 135   def test_show_private_account
 
 136     user = create(:user, :data_public => false)
 
 138     # Make sure that you are redirected to the login page when
 
 139     # you are not logged in
 
 141     assert_redirected_to login_path(:referer => account_path)
 
 143     # Make sure we get the page when we are logged in as the right user
 
 146     assert_response :success
 
 147     assert_template :show
 
 148     assert_select "form#accountForm" do |form|
 
 149       assert_equal "post", form.attr("method").to_s
 
 150       assert_select "input[name='_method']", true
 
 151       assert_equal "/account", form.attr("action").to_s
 
 154     # Make sure we have a button to "go public"
 
 155     assert_select "form.button_to[action='/user/go_public']", true
 
 158   def test_destroy_allowed
 
 163     assert_response :redirect
 
 166   def test_destroy_not_allowed
 
 167     with_user_account_deletion_delay(24) do
 
 169       create(:changeset, :user => user, :created_at => Time.now.utc)
 
 173       assert_response :bad_request