]> git.openstreetmap.org Git - rails.git/blob - test/controllers/accounts_controller_test.rb
Refactor the account edit/update pages out into a separate accounts controller
[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     put account_path, :params => { :user => user.attributes.merge(:auth_provider => "openid", :auth_uid => "gmail.com") }
52     assert_response :redirect
53     assert_redirected_to auth_path(:provider => "openid", :openid_url => "https://www.google.com/accounts/o8/id", :origin => "/account")
54
55     # Changing name to one that exists should fail
56     new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name)
57     put account_path, :params => { :user => new_attributes }
58     assert_response :success
59     assert_template :edit
60     assert_select ".notice", false
61     assert_select "form#accountForm > div.form-group > input.is-invalid#user_display_name"
62
63     # Changing name to one that exists should fail, regardless of case
64     new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name.upcase)
65     put account_path, :params => { :user => new_attributes }
66     assert_response :success
67     assert_template :edit
68     assert_select ".notice", false
69     assert_select "form#accountForm > div.form-group > input.is-invalid#user_display_name"
70
71     # Changing name to one that doesn't exist should work
72     new_attributes = user.attributes.dup.merge(:display_name => "new tester")
73     put account_path, :params => { :user => new_attributes }
74     assert_response :redirect
75     assert_redirected_to edit_account_url
76     get edit_account_path
77     assert_response :success
78     assert_template :edit
79     assert_select ".notice", /^User information updated successfully/
80     assert_select "form#accountForm > div.form-group > input#user_display_name[value=?]", "new tester"
81
82     # Record the change of name
83     user.display_name = "new tester"
84
85     # Changing email to one that exists should fail
86     user.new_email = create(:user).email
87     assert_no_difference "ActionMailer::Base.deliveries.size" do
88       perform_enqueued_jobs do
89         put account_path, :params => { :user => user.attributes }
90       end
91     end
92     assert_response :success
93     assert_template :edit
94     assert_select ".notice", false
95     assert_select "form#accountForm > div.form-group > input.is-invalid#user_new_email"
96
97     # Changing email to one that exists should fail, regardless of case
98     user.new_email = create(:user).email.upcase
99     assert_no_difference "ActionMailer::Base.deliveries.size" do
100       perform_enqueued_jobs do
101         put account_path, :params => { :user => user.attributes }
102       end
103     end
104     assert_response :success
105     assert_template :edit
106     assert_select ".notice", false
107     assert_select "form#accountForm > div.form-group > input.is-invalid#user_new_email"
108
109     # Changing email to one that doesn't exist should work
110     user.new_email = "new_tester@example.com"
111     assert_difference "ActionMailer::Base.deliveries.size", 1 do
112       perform_enqueued_jobs do
113         put account_path, :params => { :user => user.attributes }
114       end
115     end
116     assert_response :redirect
117     assert_redirected_to edit_account_url
118     get edit_account_path
119     assert_response :success
120     assert_template :edit
121     assert_select ".notice", /^User information updated successfully/
122     assert_select "form#accountForm > div.form-group > input#user_new_email[value=?]", user.new_email
123     email = ActionMailer::Base.deliveries.first
124     assert_equal 1, email.to.count
125     assert_equal user.new_email, email.to.first
126     ActionMailer::Base.deliveries.clear
127   end
128 end