openstreetmap-website/test/controllers/accounts_controller_test.rb
Andy Allan 31805df53f Remove some unnecessary calls to clear the mail queue
These were not needed at the end of most tests for quite some time,
since rails clears them by default for controller and integration tests,
and also no longer required in system tests after #5691
2025-02-16 16:16:13 +00:00

167 lines
6.2 KiB
Ruby

require "test_helper"
class AccountsControllerTest < ActionDispatch::IntegrationTest
##
# test all routes which lead to this controller
def test_routes
assert_routing(
{ :path => "/account/edit", :method => :get },
{ :controller => "accounts", :action => "edit" }
)
assert_routing(
{ :path => "/account", :method => :put },
{ :controller => "accounts", :action => "update" }
)
end
def test_account
# Get a user to work with - note that this user deliberately
# conflicts with uppercase_user in the email and display name
# fields to test that we can change other fields without any
# validation errors being reported
user = create(:user, :languages => [])
_uppercase_user = build(:user, :email => user.email.upcase, :display_name => user.display_name.upcase).tap { |u| u.save(:validate => false) }
# Make sure that you are redirected to the login page when
# you are not logged in
get edit_account_path
assert_redirected_to login_path(:referer => "/account/edit")
# Make sure we get the page when we are logged in as the right user
session_for(user)
get edit_account_path
assert_response :success
assert_template :edit
assert_select "form#accountForm" do |form|
assert_equal "post", form.attr("method").to_s
assert_select "input[name='_method']", true
assert_equal "/account", form.attr("action").to_s
end
# Updating the description using GET should fail
user.description = "new description"
user.preferred_editor = "default"
get edit_account_path, :params => { :user => user.attributes }
assert_response :success
assert_template :edit
assert_not_equal user.description, User.find(user.id).description
# Adding external authentication should redirect to the auth provider
patch account_path, :params => { :user => user.attributes.merge(:auth_provider => "google") }
assert_redirected_to auth_path(:provider => "google", :origin => "/account")
follow_redirect!
assert_redirected_to %r{^https://accounts.google.com/o/oauth2/auth\?.*}
# Changing name to one that exists should fail
new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name)
patch account_path, :params => { :user => new_attributes }
assert_response :success
assert_template :edit
assert_select ".alert-success", false
assert_select "form#accountForm > div > input.is-invalid#user_display_name"
# Changing name to one that exists should fail, regardless of case
new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name.upcase)
patch account_path, :params => { :user => new_attributes }
assert_response :success
assert_template :edit
assert_select ".alert-success", false
assert_select "form#accountForm > div > input.is-invalid#user_display_name"
# Changing name to one that doesn't exist should work
new_attributes = user.attributes.dup.merge(:display_name => "new tester")
patch account_path, :params => { :user => new_attributes }
assert_redirected_to edit_account_url
get edit_account_path
assert_response :success
assert_template :edit
assert_select ".alert-success", /^User information updated successfully/
assert_select "form#accountForm > div > input#user_display_name[value=?]", "new tester"
# Record the change of name
user.display_name = "new tester"
# Changing email to one that exists should fail
user.new_email = create(:user).email
assert_no_difference "ActionMailer::Base.deliveries.size" do
perform_enqueued_jobs do
patch account_path, :params => { :user => user.attributes }
end
end
assert_response :success
assert_template :edit
assert_select ".alert-success", false
assert_select "form#accountForm > div > input.is-invalid#user_new_email"
# Changing email to one that exists should fail, regardless of case
user.new_email = create(:user).email.upcase
assert_no_difference "ActionMailer::Base.deliveries.size" do
perform_enqueued_jobs do
patch account_path, :params => { :user => user.attributes }
end
end
assert_response :success
assert_template :edit
assert_select ".alert-success", false
assert_select "form#accountForm > div > input.is-invalid#user_new_email"
# Changing email to one that doesn't exist should work
user.new_email = "new_tester@example.com"
assert_difference "ActionMailer::Base.deliveries.size", 1 do
perform_enqueued_jobs do
patch account_path, :params => { :user => user.attributes }
end
end
assert_redirected_to edit_account_url
get edit_account_path
assert_response :success
assert_template :edit
assert_select ".alert-success", /^User information updated successfully/
assert_select "form#accountForm > div > input#user_new_email[value=?]", user.new_email
email = ActionMailer::Base.deliveries.first
assert_equal 1, email.to.count
assert_equal user.new_email, email.to.first
end
def test_private_account
user = create(:user, :data_public => false)
# Make sure that you are redirected to the login page when
# you are not logged in
get edit_account_path
assert_redirected_to login_path(:referer => "/account/edit")
# Make sure we get the page when we are logged in as the right user
session_for(user)
get edit_account_path
assert_response :success
assert_template :edit
assert_select "form#accountForm" do |form|
assert_equal "post", form.attr("method").to_s
assert_select "input[name='_method']", true
assert_equal "/account", form.attr("action").to_s
end
# Make sure we have a button to "go public"
assert_select "form.button_to[action='/user/go_public']", true
end
def test_destroy_allowed
user = create(:user)
session_for(user)
delete account_path
assert_response :redirect
end
def test_destroy_not_allowed
with_user_account_deletion_delay(24) do
user = create(:user)
create(:changeset, :user => user, :created_at => Time.now.utc)
session_for(user)
delete account_path
assert_response :bad_request
end
end
end