1 # frozen_string_literal: true
5 class FollowsControllerTest < ActionDispatch::IntegrationTest
7 # test all routes which lead to this controller
10 { :path => "/user/username/follow", :method => :get },
11 { :controller => "follows", :action => "show", :display_name => "username" }
14 { :path => "/user/username/follow", :method => :post },
15 { :controller => "follows", :action => "create", :display_name => "username" }
18 { :path => "/user/username/follow", :method => :delete },
19 { :controller => "follows", :action => "destroy", :display_name => "username" }
24 # Get users to work with
26 follow = create(:user)
28 # Check that the users aren't already friends
29 assert_nil Follow.find_by(:follower => user, :following => follow)
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))
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)
42 # When logged in a GET should get a confirmation page
43 get follow_path(follow)
44 assert_response :success
46 assert_select "a[href*='test']", 0
47 assert_nil Follow.find_by(:follower => user, :following => follow)
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)
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
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)
68 assert_redirected_to user_path(follow)
69 assert_match(/You already follow/, flash[:warning])
70 assert Follow.find_by(:follower => user, :following => follow)
73 def test_follow_with_referer
74 # Get users to work with
76 follow = create(:user)
79 # Check that the users aren't already friends
80 assert_nil Follow.find_by(:follower => user, :following => follow)
82 # The GET should preserve any referer
83 get follow_path(follow), :params => { :referer => "/test" }
84 assert_response :success
86 assert_select "a[href*='test']"
87 assert_nil Follow.find_by(:follower => user, :following => follow)
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" }
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
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
112 # Get users to work with
114 follow = create(:user)
115 create(:follow, :follower => user, :following => follow)
117 # Check that the users are friends
118 assert Follow.find_by(:follower => user, :following => follow)
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))
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)
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)
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)
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)
151 def test_unfollow_with_referer
152 # Get users to work with
154 follow = create(:user)
155 create(:follow, :follower => user, :following => follow)
158 # Check that the users are friends
159 assert Follow.find_by(:follower => user, :following => follow)
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)
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)
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