]> git.openstreetmap.org Git - rails.git/blob - test/controllers/follows_controller_test.rb
Create relation version redaction resource
[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
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)
64       end
65     end
66     assert_redirected_to user_path(follow)
67     assert_match(/You already follow/, flash[:warning])
68     assert Follow.find_by(:follower => user, :following => follow)
69   end
70
71   def test_follow_with_referer
72     # Get users to work with
73     user = create(:user)
74     follow = create(:user)
75     session_for(user)
76
77     # Check that the users aren't already friends
78     assert_nil Follow.find_by(:follower => user, :following => follow)
79
80     # The GET should preserve any referer
81     get follow_path(follow), :params => { :referer => "/test" }
82     assert_response :success
83     assert_template :show
84     assert_select "a[href*='test']"
85     assert_nil Follow.find_by(:follower => user, :following => follow)
86
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" }
91       end
92     end
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
99   end
100
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
107   end
108
109   def test_unfollow
110     # Get users to work with
111     user = create(:user)
112     follow = create(:user)
113     create(:follow, :follower => user, :following => follow)
114
115     # Check that the users are friends
116     assert Follow.find_by(:follower => user, :following => follow)
117
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))
121
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)
126
127     session_for(user)
128
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)
135
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)
141
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)
147   end
148
149   def test_unfollow_with_referer
150     # Get users to work with
151     user = create(:user)
152     follow = create(:user)
153     create(:follow, :follower => user, :following => follow)
154     session_for(user)
155
156     # Check that the users are friends
157     assert Follow.find_by(:follower => user, :following => follow)
158
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)
165
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)
171   end
172
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
179   end
180 end