]> git.openstreetmap.org Git - rails.git/blob - test/controllers/follows_controller_test.rb
Merge remote-tracking branch 'upstream/pull/5537'
[rails.git] / test / controllers / follows_controller_test.rb
1 require "test_helper"
2
3 class FollowsControllerTest < ActionDispatch::IntegrationTest
4   ##
5   # test all routes which lead to this controller
6   def test_routes
7     assert_routing(
8       { :path => "/user/username/follow", :method => :get },
9       { :controller => "follows", :action => "show", :display_name => "username" }
10     )
11     assert_routing(
12       { :path => "/user/username/follow", :method => :post },
13       { :controller => "follows", :action => "create", :display_name => "username" }
14     )
15     assert_routing(
16       { :path => "/user/username/follow", :method => :delete },
17       { :controller => "follows", :action => "destroy", :display_name => "username" }
18     )
19   end
20
21   def test_follow
22     # Get users to work with
23     user = create(:user)
24     follow = create(:user)
25
26     # Check that the users aren't already friends
27     assert_nil Follow.find_by(:follower => user, :following => follow)
28
29     # When not logged in a GET should ask us to login
30     get follow_path(follow)
31     assert_redirected_to login_path(:referer => follow_path(follow))
32
33     # When not logged in a POST should error
34     post follow_path(follow)
35     assert_response :forbidden
36     assert_nil Follow.find_by(:follower => user, :following => follow)
37
38     session_for(user)
39
40     # When logged in a GET should get a confirmation page
41     get follow_path(follow)
42     assert_response :success
43     assert_template :show
44     assert_select "a[href*='test']", 0
45     assert_nil Follow.find_by(:follower => user, :following => follow)
46
47     # When logged in a POST should add the follow
48     assert_difference "ActionMailer::Base.deliveries.size", 1 do
49       perform_enqueued_jobs do
50         post follow_path(follow)
51       end
52     end
53     assert_redirected_to user_path(follow)
54     assert_match(/You are now following/, flash[:notice])
55     assert Follow.find_by(:follower => user, :following => follow)
56     email = ActionMailer::Base.deliveries.first
57     assert_equal 1, email.to.count
58     assert_equal follow.email, email.to.first
59     ActionMailer::Base.deliveries.clear
60
61     # A second POST should report that the follow already exists
62     assert_no_difference "ActionMailer::Base.deliveries.size" do
63       perform_enqueued_jobs do
64         post follow_path(follow)
65       end
66     end
67     assert_redirected_to user_path(follow)
68     assert_match(/You already follow/, flash[:warning])
69     assert Follow.find_by(:follower => user, :following => follow)
70   end
71
72   def test_follow_with_referer
73     # Get users to work with
74     user = create(:user)
75     follow = create(:user)
76     session_for(user)
77
78     # Check that the users aren't already friends
79     assert_nil Follow.find_by(:follower => user, :following => follow)
80
81     # The GET should preserve any referer
82     get follow_path(follow), :params => { :referer => "/test" }
83     assert_response :success
84     assert_template :show
85     assert_select "a[href*='test']"
86     assert_nil Follow.find_by(:follower => user, :following => follow)
87
88     # When logged in a POST should add the follow and refer us
89     assert_difference "ActionMailer::Base.deliveries.size", 1 do
90       perform_enqueued_jobs do
91         post follow_path(follow), :params => { :referer => "/test" }
92       end
93     end
94     assert_redirected_to "/test"
95     assert_match(/You are now following/, flash[:notice])
96     assert Follow.find_by(:follower => user, :following => follow)
97     email = ActionMailer::Base.deliveries.first
98     assert_equal 1, email.to.count
99     assert_equal follow.email, email.to.first
100     ActionMailer::Base.deliveries.clear
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