3 class FollowsControllerTest < ActionDispatch::IntegrationTest
5 # test all routes which lead to this controller
8 { :path => "/user/username/follow", :method => :get },
9 { :controller => "follows", :action => "show", :display_name => "username" }
12 { :path => "/user/username/follow", :method => :post },
13 { :controller => "follows", :action => "create", :display_name => "username" }
16 { :path => "/user/username/follow", :method => :delete },
17 { :controller => "follows", :action => "destroy", :display_name => "username" }
22 # Get users to work with
24 follow = create(:user)
26 # Check that the users aren't already friends
27 assert_nil Follow.find_by(:follower => user, :following => follow)
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))
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)
40 # When logged in a GET should get a confirmation page
41 get follow_path(follow)
42 assert_response :success
44 assert_select "a[href*='test']", 0
45 assert_nil Follow.find_by(:follower => user, :following => follow)
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)
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
60 # A second POST should report that the follow already exists
61 assert_no_difference "ActionMailer::Base.deliveries.size" do
62 perform_enqueued_jobs do
63 post follow_path(follow)
66 assert_redirected_to user_path(follow)
67 assert_match(/You already follow/, flash[:warning])
68 assert Follow.find_by(:follower => user, :following => follow)
71 def test_follow_with_referer
72 # Get users to work with
74 follow = create(:user)
77 # Check that the users aren't already friends
78 assert_nil Follow.find_by(:follower => user, :following => follow)
80 # The GET should preserve any referer
81 get follow_path(follow), :params => { :referer => "/test" }
82 assert_response :success
84 assert_select "a[href*='test']"
85 assert_nil Follow.find_by(:follower => user, :following => follow)
87 # When logged in a POST should add the follow and refer us
88 assert_difference "ActionMailer::Base.deliveries.size", 1 do
89 perform_enqueued_jobs do
90 post follow_path(follow), :params => { :referer => "/test" }
93 assert_redirected_to "/test"
94 assert_match(/You are now following/, flash[:notice])
95 assert Follow.find_by(:follower => user, :following => follow)
96 email = ActionMailer::Base.deliveries.first
97 assert_equal 1, email.to.count
98 assert_equal follow.email, email.to.first
101 def test_follow_unknown_user
102 # Should error when a bogus user is specified
103 session_for(create(:user))
104 get follow_path("No Such User")
105 assert_response :not_found
106 assert_template :no_such_user
110 # Get users to work with
112 follow = create(:user)
113 create(:follow, :follower => user, :following => follow)
115 # Check that the users are friends
116 assert Follow.find_by(:follower => user, :following => follow)
118 # When not logged in a GET should ask us to login
119 get follow_path(follow)
120 assert_redirected_to login_path(:referer => follow_path(follow))
122 # When not logged in a POST should error
123 delete follow_path, :params => { :display_name => follow.display_name }
124 assert_response :forbidden
125 assert Follow.find_by(:follower => user, :following => follow)
129 # When logged in a GET should get a confirmation page
130 get follow_path(follow)
131 assert_response :success
132 assert_template :show
133 assert_select "a[href*='test']", 0
134 assert Follow.find_by(:follower => user, :following => follow)
136 # When logged in a DELETE should remove the follow
137 delete follow_path(follow)
138 assert_redirected_to user_path(follow)
139 assert_match(/You successfully unfollowed/, flash[:notice])
140 assert_nil Follow.find_by(:follower => user, :following => follow)
142 # A second DELETE should report that the follow does not exist
143 delete follow_path(follow)
144 assert_redirected_to user_path(follow)
145 assert_match(/You are not following/, flash[:error])
146 assert_nil Follow.find_by(:follower => user, :following => follow)
149 def test_unfollow_with_referer
150 # Get users to work with
152 follow = create(:user)
153 create(:follow, :follower => user, :following => follow)
156 # Check that the users are friends
157 assert Follow.find_by(:follower => user, :following => follow)
159 # The GET should preserve any referer
160 get follow_path(follow), :params => { :referer => "/test" }
161 assert_response :success
162 assert_template :show
163 assert_select "a[href*='test']"
164 assert Follow.find_by(:follower => user, :following => follow)
166 # When logged in a POST should remove the follow and refer
167 delete follow_path(follow), :params => { :referer => "/test" }
168 assert_redirected_to "/test"
169 assert_match(/You successfully unfollowed/, flash[:notice])
170 assert_nil Follow.find_by(:follower => user, :following => follow)
173 def test_unfollow_unknown_user
174 # Should error when a bogus user is specified
175 session_for(create(:user))
176 get follow_path("No Such User")
177 assert_response :not_found
178 assert_template :no_such_user