3 class AccountsControllerTest < ActionDispatch::IntegrationTest
 
   5   # test all routes which lead to this controller
 
   8       { :path => "/account", :method => :get },
 
   9       { :controller => "accounts", :action => "show" }
 
  12       { :path => "/account", :method => :put },
 
  13       { :controller => "accounts", :action => "update" }
 
  16       { :path => "/account", :method => :delete },
 
  17       { :controller => "accounts", :action => "destroy" }
 
  21     assert_redirected_to "/account"
 
  24   def test_show_and_update
 
  25     # Get a user to work with - note that this user deliberately
 
  26     # conflicts with uppercase_user in the email and display name
 
  27     # fields to test that we can change other fields without any
 
  28     # validation errors being reported
 
  29     user = create(:user, :languages => [])
 
  30     _uppercase_user = build(:user, :email => user.email.upcase, :display_name => user.display_name.upcase).tap { |u| u.save(:validate => false) }
 
  32     # Make sure that you are redirected to the login page when
 
  33     # you are not logged in
 
  35     assert_redirected_to login_path(:referer => account_path)
 
  37     # Make sure we get the page when we are logged in as the right user
 
  40     assert_response :success
 
  42     assert_select "form#accountForm" do |form|
 
  43       assert_equal "post", form.attr("method").to_s
 
  44       assert_select "input[name='_method']", true
 
  45       assert_equal "/account", form.attr("action").to_s
 
  48     # Updating the description using GET should fail
 
  49     user.description = "new description"
 
  50     user.preferred_editor = "default"
 
  51     get account_path, :params => { :user => user.attributes }
 
  52     assert_response :success
 
  54     assert_not_equal user.description, User.find(user.id).description
 
  56     # Adding external authentication should redirect to the auth provider
 
  57     patch account_path, :params => { :user => user.attributes.merge(:auth_provider => "google") }
 
  58     assert_redirected_to auth_path(:provider => "google", :origin => "/account")
 
  60     assert_redirected_to %r{^https://accounts.google.com/o/oauth2/auth\?.*}
 
  62     # Changing name to one that exists should fail
 
  63     new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name)
 
  64     patch account_path, :params => { :user => new_attributes }
 
  65     assert_response :success
 
  67     assert_select ".alert-success", false
 
  68     assert_select "form#accountForm > div > input.is-invalid#user_display_name"
 
  70     # Changing name to one that exists should fail, regardless of case
 
  71     new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name.upcase)
 
  72     patch account_path, :params => { :user => new_attributes }
 
  73     assert_response :success
 
  75     assert_select ".alert-success", false
 
  76     assert_select "form#accountForm > div > input.is-invalid#user_display_name"
 
  78     # Changing name to one that doesn't exist should work
 
  79     new_attributes = user.attributes.dup.merge(:display_name => "new tester")
 
  80     patch account_path, :params => { :user => new_attributes }
 
  81     assert_redirected_to account_path
 
  83     assert_response :success
 
  85     assert_select ".alert-success", /^User information updated successfully/
 
  86     assert_select "form#accountForm > div > input#user_display_name[value=?]", "new tester"
 
  88     # Record the change of name
 
  89     user.display_name = "new tester"
 
  91     # Changing email to one that exists should fail
 
  92     user.new_email = create(:user).email
 
  93     assert_no_difference "ActionMailer::Base.deliveries.size" do
 
  94       perform_enqueued_jobs do
 
  95         patch account_path, :params => { :user => user.attributes }
 
  98     assert_response :success
 
 100     assert_select ".alert-success", false
 
 101     assert_select "form#accountForm > div > input.is-invalid#user_new_email"
 
 103     # Changing email to one that exists should fail, regardless of case
 
 104     user.new_email = create(:user).email.upcase
 
 105     assert_no_difference "ActionMailer::Base.deliveries.size" do
 
 106       perform_enqueued_jobs do
 
 107         patch account_path, :params => { :user => user.attributes }
 
 110     assert_response :success
 
 111     assert_template :show
 
 112     assert_select ".alert-success", false
 
 113     assert_select "form#accountForm > div > input.is-invalid#user_new_email"
 
 115     # Changing email to one that doesn't exist should work
 
 116     user.new_email = "new_tester@example.com"
 
 117     assert_difference "ActionMailer::Base.deliveries.size", 1 do
 
 118       perform_enqueued_jobs do
 
 119         patch account_path, :params => { :user => user.attributes }
 
 122     assert_redirected_to account_path
 
 124     assert_response :success
 
 125     assert_template :show
 
 126     assert_select ".alert-success", /^User information updated successfully/
 
 127     assert_select "form#accountForm > div > input#user_new_email[value=?]", user.new_email
 
 128     email = ActionMailer::Base.deliveries.first
 
 129     assert_equal 1, email.to.count
 
 130     assert_equal user.new_email, email.to.first
 
 133   def test_show_private_account
 
 134     user = create(:user, :data_public => false)
 
 136     # Make sure that you are redirected to the login page when
 
 137     # you are not logged in
 
 139     assert_redirected_to login_path(:referer => account_path)
 
 141     # Make sure we get the page when we are logged in as the right user
 
 144     assert_response :success
 
 145     assert_template :show
 
 146     assert_select "form#accountForm" do |form|
 
 147       assert_equal "post", form.attr("method").to_s
 
 148       assert_select "input[name='_method']", true
 
 149       assert_equal "/account", form.attr("action").to_s
 
 152     # Make sure we have a button to "go public"
 
 153     assert_select "form.button_to[action='/user/go_public']", true
 
 156   def test_destroy_allowed
 
 161     assert_response :redirect
 
 164   def test_destroy_not_allowed
 
 165     with_user_account_deletion_delay(24) do
 
 167       create(:changeset, :user => user, :created_at => Time.now.utc)
 
 171       assert_response :bad_request