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