]> git.openstreetmap.org Git - rails.git/blob - test/controllers/follows_controller_test.rb
Merge pull request #6394 from openstreetmap/dependabot/github_actions/ruby/setup...
[rails.git] / test / controllers / follows_controller_test.rb
1 # frozen_string_literal: true
2
3 require "test_helper"
4
5 class FollowsControllerTest < ActionDispatch::IntegrationTest
6   ##
7   # test all routes which lead to this controller
8   def test_routes
9     assert_routing(
10       { :path => "/user/username/follow", :method => :get },
11       { :controller => "follows", :action => "show", :display_name => "username" }
12     )
13     assert_routing(
14       { :path => "/user/username/follow", :method => :post },
15       { :controller => "follows", :action => "create", :display_name => "username" }
16     )
17     assert_routing(
18       { :path => "/user/username/follow", :method => :delete },
19       { :controller => "follows", :action => "destroy", :display_name => "username" }
20     )
21   end
22
23   def test_follow
24     # Get users to work with
25     user = create(:user)
26     follow = create(:user)
27
28     # Check that the users aren't already friends
29     assert_nil Follow.find_by(:follower => user, :following => follow)
30
31     # When not logged in a GET should ask us to login
32     get follow_path(follow)
33     assert_redirected_to login_path(:referer => follow_path(follow))
34
35     # When not logged in a POST should error
36     post follow_path(follow)
37     assert_response :forbidden
38     assert_nil Follow.find_by(:follower => user, :following => follow)
39
40     session_for(user)
41
42     # When logged in a GET should get a confirmation page
43     get follow_path(follow)
44     assert_response :success
45     assert_template :show
46     assert_select "a[href*='test']", 0
47     assert_nil Follow.find_by(:follower => user, :following => follow)
48
49     # When logged in a POST should add the follow
50     assert_difference "ActionMailer::Base.deliveries.size", 1 do
51       perform_enqueued_jobs do
52         post follow_path(follow)
53       end
54     end
55     assert_redirected_to user_path(follow)
56     assert_match(/You are now following/, flash[:notice])
57     assert Follow.find_by(:follower => user, :following => follow)
58     email = ActionMailer::Base.deliveries.first
59     assert_equal 1, email.to.count
60     assert_equal follow.email, email.to.first
61
62     # A second POST should report that the follow already exists
63     assert_no_difference "ActionMailer::Base.deliveries.size" do
64       perform_enqueued_jobs do
65         post follow_path(follow)
66       end
67     end
68     assert_redirected_to user_path(follow)
69     assert_match(/You already follow/, flash[:warning])
70     assert Follow.find_by(:follower => user, :following => follow)
71   end
72
73   def test_follow_with_referer
74     # Get users to work with
75     user = create(:user)
76     follow = create(:user)
77     session_for(user)
78
79     # Check that the users aren't already friends
80     assert_nil Follow.find_by(:follower => user, :following => follow)
81
82     # The GET should preserve any referer
83     get follow_path(follow), :params => { :referer => "/test" }
84     assert_response :success
85     assert_template :show
86     assert_select "a[href*='test']"
87     assert_nil Follow.find_by(:follower => user, :following => follow)
88
89     # When logged in a POST should add the follow and refer us
90     assert_difference "ActionMailer::Base.deliveries.size", 1 do
91       perform_enqueued_jobs do
92         post follow_path(follow), :params => { :referer => "/test" }
93       end
94     end
95     assert_redirected_to "/test"
96     assert_match(/You are now following/, flash[:notice])
97     assert Follow.find_by(:follower => user, :following => follow)
98     email = ActionMailer::Base.deliveries.first
99     assert_equal 1, email.to.count
100     assert_equal follow.email, email.to.first
101   end
102
103   def test_follow_unknown_user
104     # Should error when a bogus user is specified
105     session_for(create(:user))
106     get follow_path("No Such User")
107     assert_response :not_found
108     assert_template :no_such_user
109   end
110
111   def test_unfollow
112     # Get users to work with
113     user = create(:user)
114     follow = create(:user)
115     create(:follow, :follower => user, :following => follow)
116
117     # Check that the users are friends
118     assert Follow.find_by(:follower => user, :following => follow)
119
120     # When not logged in a GET should ask us to login
121     get follow_path(follow)
122     assert_redirected_to login_path(:referer => follow_path(follow))
123
124     # When not logged in a POST should error
125     delete follow_path, :params => { :display_name => follow.display_name }
126     assert_response :forbidden
127     assert Follow.find_by(:follower => user, :following => follow)
128
129     session_for(user)
130
131     # When logged in a GET should get a confirmation page
132     get follow_path(follow)
133     assert_response :success
134     assert_template :show
135     assert_select "a[href*='test']", 0
136     assert Follow.find_by(:follower => user, :following => follow)
137
138     # When logged in a DELETE should remove the follow
139     delete follow_path(follow)
140     assert_redirected_to user_path(follow)
141     assert_match(/You successfully unfollowed/, flash[:notice])
142     assert_nil Follow.find_by(:follower => user, :following => follow)
143
144     # A second DELETE should report that the follow does not exist
145     delete follow_path(follow)
146     assert_redirected_to user_path(follow)
147     assert_match(/You are not following/, flash[:error])
148     assert_nil Follow.find_by(:follower => user, :following => follow)
149   end
150
151   def test_unfollow_with_referer
152     # Get users to work with
153     user = create(:user)
154     follow = create(:user)
155     create(:follow, :follower => user, :following => follow)
156     session_for(user)
157
158     # Check that the users are friends
159     assert Follow.find_by(:follower => user, :following => follow)
160
161     # The GET should preserve any referer
162     get follow_path(follow), :params => { :referer => "/test" }
163     assert_response :success
164     assert_template :show
165     assert_select "a[href*='test']"
166     assert Follow.find_by(:follower => user, :following => follow)
167
168     # When logged in a POST should remove the follow and refer
169     delete follow_path(follow), :params => { :referer => "/test" }
170     assert_redirected_to "/test"
171     assert_match(/You successfully unfollowed/, flash[:notice])
172     assert_nil Follow.find_by(:follower => user, :following => follow)
173   end
174
175   def test_unfollow_unknown_user
176     # Should error when a bogus user is specified
177     session_for(create(:user))
178     get follow_path("No Such User")
179     assert_response :not_found
180     assert_template :no_such_user
181   end
182 end