Update bundle
[rails.git] / test / controllers / accounts_controller_test.rb
1 require "test_helper"
2
3 class AccountsControllerTest < ActionDispatch::IntegrationTest
4   ##
5   # test all routes which lead to this controller
6   def test_routes
7     assert_routing(
8       { :path => "/account/edit", :method => :get },
9       { :controller => "accounts", :action => "edit" }
10     )
11     assert_routing(
12       { :path => "/account", :method => :put },
13       { :controller => "accounts", :action => "update" }
14     )
15   end
16
17   def test_account
18     # Get a user to work with - note that this user deliberately
19     # conflicts with uppercase_user in the email and display name
20     # fields to test that we can change other fields without any
21     # validation errors being reported
22     user = create(:user, :languages => [])
23     _uppercase_user = build(:user, :email => user.email.upcase, :display_name => user.display_name.upcase).tap { |u| u.save(:validate => false) }
24
25     # Make sure that you are redirected to the login page when
26     # you are not logged in
27     get edit_account_path
28     assert_response :redirect
29     assert_redirected_to login_path(:referer => "/account/edit")
30
31     # Make sure we get the page when we are logged in as the right user
32     session_for(user)
33     get edit_account_path
34     assert_response :success
35     assert_template :edit
36     assert_select "form#accountForm" do |form|
37       assert_equal "post", form.attr("method").to_s
38       assert_select "input[name='_method']", true
39       assert_equal "/account", form.attr("action").to_s
40     end
41
42     # Updating the description using GET should fail
43     user.description = "new description"
44     user.preferred_editor = "default"
45     get edit_account_path, :params => { :user => user.attributes }
46     assert_response :success
47     assert_template :edit
48     assert_not_equal user.description, User.find(user.id).description
49
50     # Adding external authentication should redirect to the auth provider
51     patch account_path, :params => { :user => user.attributes.merge(:auth_provider => "google") }
52     assert_response :redirect
53     assert_redirected_to auth_path(:provider => "google", :origin => "/account")
54     follow_redirect!
55     assert_response :redirect
56     assert_redirected_to %r{^https://accounts.google.com/o/oauth2/auth\?.*}
57
58     # Changing name to one that exists should fail
59     new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name)
60     patch account_path, :params => { :user => new_attributes }
61     assert_response :success
62     assert_template :edit
63     assert_select ".notice", false
64     assert_select "form#accountForm > div.form-group > input.is-invalid#user_display_name"
65
66     # Changing name to one that exists should fail, regardless of case
67     new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name.upcase)
68     patch account_path, :params => { :user => new_attributes }
69     assert_response :success
70     assert_template :edit
71     assert_select ".notice", false
72     assert_select "form#accountForm > div.form-group > input.is-invalid#user_display_name"
73
74     # Changing name to one that doesn't exist should work
75     new_attributes = user.attributes.dup.merge(:display_name => "new tester")
76     patch account_path, :params => { :user => new_attributes }
77     assert_response :redirect
78     assert_redirected_to edit_account_url
79     get edit_account_path
80     assert_response :success
81     assert_template :edit
82     assert_select ".notice", /^User information updated successfully/
83     assert_select "form#accountForm > div.form-group > input#user_display_name[value=?]", "new tester"
84
85     # Record the change of name
86     user.display_name = "new tester"
87
88     # Changing email to one that exists should fail
89     user.new_email = create(:user).email
90     assert_no_difference "ActionMailer::Base.deliveries.size" do
91       perform_enqueued_jobs do
92         patch account_path, :params => { :user => user.attributes }
93       end
94     end
95     assert_response :success
96     assert_template :edit
97     assert_select ".notice", false
98     assert_select "form#accountForm > div.form-group > input.is-invalid#user_new_email"
99
100     # Changing email to one that exists should fail, regardless of case
101     user.new_email = create(:user).email.upcase
102     assert_no_difference "ActionMailer::Base.deliveries.size" do
103       perform_enqueued_jobs do
104         patch account_path, :params => { :user => user.attributes }
105       end
106     end
107     assert_response :success
108     assert_template :edit
109     assert_select ".notice", false
110     assert_select "form#accountForm > div.form-group > input.is-invalid#user_new_email"
111
112     # Changing email to one that doesn't exist should work
113     user.new_email = "new_tester@example.com"
114     assert_difference "ActionMailer::Base.deliveries.size", 1 do
115       perform_enqueued_jobs do
116         patch account_path, :params => { :user => user.attributes }
117       end
118     end
119     assert_response :redirect
120     assert_redirected_to edit_account_url
121     get edit_account_path
122     assert_response :success
123     assert_template :edit
124     assert_select ".notice", /^User information updated successfully/
125     assert_select "form#accountForm > div.form-group > input#user_new_email[value=?]", user.new_email
126     email = ActionMailer::Base.deliveries.first
127     assert_equal 1, email.to.count
128     assert_equal user.new_email, email.to.first
129     ActionMailer::Base.deliveries.clear
130   end
131
132   def test_private_account
133     user = create(:user, :data_public => false)
134
135     # Make sure that you are redirected to the login page when
136     # you are not logged in
137     get edit_account_path
138     assert_response :redirect
139     assert_redirected_to login_path(:referer => "/account/edit")
140
141     # Make sure we get the page when we are logged in as the right user
142     session_for(user)
143     get edit_account_path
144     assert_response :success
145     assert_template :edit
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
150     end
151
152     # Make sure we have a button to "go public"
153     assert_select "form.button_to[action='/user/go_public']", true
154   end
155 end