4 class ChangesetCommentsControllerTest < ActionDispatch::IntegrationTest
6 # test all routes which lead to this controller
9 { :path => "/api/0.6/changeset/1/comment", :method => :post },
10 { :controller => "api/changeset_comments", :action => "create", :id => "1" }
13 { :path => "/api/0.6/changeset/1/comment.json", :method => :post },
14 { :controller => "api/changeset_comments", :action => "create", :id => "1", :format => "json" }
17 { :path => "/api/0.6/changeset/comment/1/hide", :method => :post },
18 { :controller => "api/changeset_comments", :action => "destroy", :id => "1" }
21 { :path => "/api/0.6/changeset/comment/1/hide.json", :method => :post },
22 { :controller => "api/changeset_comments", :action => "destroy", :id => "1", :format => "json" }
25 { :path => "/api/0.6/changeset/comment/1/unhide", :method => :post },
26 { :controller => "api/changeset_comments", :action => "restore", :id => "1" }
29 { :path => "/api/0.6/changeset/comment/1/unhide.json", :method => :post },
30 { :controller => "api/changeset_comments", :action => "restore", :id => "1", :format => "json" }
34 def test_create_by_unauthorized
35 assert_no_difference "ChangesetComment.count" do
36 post changeset_comment_path(create(:changeset, :closed), :text => "This is a comment")
37 assert_response :unauthorized
41 def test_create_on_missing_changeset
42 assert_no_difference "ChangesetComment.count" do
43 post changeset_comment_path(999111, :text => "This is a comment"), :headers => bearer_authorization_header
44 assert_response :not_found
48 def test_create_on_open_changeset
49 assert_no_difference "ChangesetComment.count" do
50 post changeset_comment_path(create(:changeset), :text => "This is a comment"), :headers => bearer_authorization_header
51 assert_response :conflict
55 def test_create_without_text
56 assert_no_difference "ChangesetComment.count" do
57 post changeset_comment_path(create(:changeset, :closed)), :headers => bearer_authorization_header
58 assert_response :bad_request
62 def test_create_with_empty_text
63 assert_no_difference "ChangesetComment.count" do
64 post changeset_comment_path(create(:changeset, :closed), :text => ""), :headers => bearer_authorization_header
65 assert_response :bad_request
69 def test_create_when_not_agreed_to_terms
70 user = create(:user, :terms_agreed => nil)
71 auth_header = bearer_authorization_header user
72 changeset = create(:changeset, :closed)
74 assert_difference "ChangesetComment.count", 0 do
75 post changeset_comment_path(changeset), :params => { :text => "This is a comment" }, :headers => auth_header
76 assert_response :forbidden
80 def test_create_with_write_api_scope
82 auth_header = bearer_authorization_header user, :scopes => %w[write_api]
83 changeset = create(:changeset, :closed)
85 assert_difference "ChangesetComment.count", 1 do
86 post changeset_comment_path(changeset), :params => { :text => "This is a comment" }, :headers => auth_header
87 assert_response :success
90 comment = ChangesetComment.last
91 assert_equal changeset.id, comment.changeset_id
92 assert_equal user.id, comment.author_id
93 assert_equal "This is a comment", comment.body
94 assert comment.visible
97 def test_create_on_changeset_with_no_subscribers
98 changeset = create(:changeset, :closed)
99 auth_header = bearer_authorization_header
101 assert_difference "ChangesetComment.count", 1 do
102 assert_no_difference "ActionMailer::Base.deliveries.size" do
103 perform_enqueued_jobs do
104 post changeset_comment_path(changeset, :text => "This is a comment"), :headers => auth_header
105 assert_response :success
111 def test_create_on_changeset_with_commenter_subscriber
113 changeset = create(:changeset, :closed, :user => user)
114 changeset.subscribers << user
115 auth_header = bearer_authorization_header user
117 assert_difference "ChangesetComment.count", 1 do
118 assert_no_difference "ActionMailer::Base.deliveries.size" do
119 perform_enqueued_jobs do
120 post changeset_comment_path(changeset, :text => "This is a comment"), :headers => auth_header
121 assert_response :success
127 def test_create_on_changeset_with_invisible_subscribers
128 changeset = create(:changeset, :closed)
129 changeset.subscribers << create(:user, :suspended)
130 changeset.subscribers << create(:user, :deleted)
131 auth_header = bearer_authorization_header
133 assert_difference "ChangesetComment.count", 1 do
134 assert_no_difference "ActionMailer::Base.deliveries.size" do
135 perform_enqueued_jobs do
136 post changeset_comment_path(changeset, :text => "This is a comment"), :headers => auth_header
137 assert_response :success
143 def test_create_on_changeset_with_changeset_creator_subscriber
144 creator_user = create(:user)
145 changeset = create(:changeset, :closed, :user => creator_user)
146 changeset.subscribers << creator_user
147 commenter_user = create(:user)
148 auth_header = bearer_authorization_header commenter_user
150 assert_difference "ChangesetComment.count", 1 do
151 assert_difference "ActionMailer::Base.deliveries.size", 1 do
152 perform_enqueued_jobs do
153 post changeset_comment_path(changeset, :text => "This is a comment"), :headers => auth_header
154 assert_response :success
159 email = ActionMailer::Base.deliveries.first
160 assert_equal 1, email.to.length
161 assert_equal "[OpenStreetMap] #{commenter_user.display_name} has commented on one of your changesets", email.subject
162 assert_equal creator_user.email, email.to.first
164 ActionMailer::Base.deliveries.clear
167 def test_create_on_changeset_with_changeset_creator_and_other_user_subscribers
168 creator_user = create(:user)
169 changeset = create(:changeset, :closed, :user => creator_user)
170 changeset.subscribers << creator_user
171 other_user = create(:user)
172 changeset.subscribers << other_user
173 commenter_user = create(:user)
174 auth_header = bearer_authorization_header commenter_user
176 assert_difference "ChangesetComment.count", 1 do
177 assert_difference "ActionMailer::Base.deliveries.size", 2 do
178 perform_enqueued_jobs do
179 post changeset_comment_path(changeset, :text => "This is a comment"), :headers => auth_header
180 assert_response :success
185 email = ActionMailer::Base.deliveries.find { |e| e.to.first == creator_user.email }
187 assert_equal 1, email.to.length
188 assert_equal "[OpenStreetMap] #{commenter_user.display_name} has commented on one of your changesets", email.subject
190 email = ActionMailer::Base.deliveries.find { |e| e.to.first == other_user.email }
192 assert_equal 1, email.to.length
193 assert_equal "[OpenStreetMap] #{commenter_user.display_name} has commented on a changeset you are interested in", email.subject
195 ActionMailer::Base.deliveries.clear
199 # create comment rate limit for new users
200 def test_create_by_new_user_with_rate_limit
201 changeset = create(:changeset, :closed)
204 auth_header = bearer_authorization_header user
206 assert_difference "ChangesetComment.count", Settings.initial_changeset_comments_per_hour do
207 1.upto(Settings.initial_changeset_comments_per_hour) do |count|
208 post changeset_comment_path(changeset, :text => "Comment #{count}"), :headers => auth_header
209 assert_response :success
213 assert_no_difference "ChangesetComment.count" do
214 post changeset_comment_path(changeset, :text => "One comment too many"), :headers => auth_header
215 assert_response :too_many_requests
220 # create comment rate limit for experienced users
221 def test_create_by_experienced_user_with_rate_limit
222 changeset = create(:changeset, :closed)
224 create_list(:changeset_comment, Settings.comments_to_max_changeset_comments, :author_id => user.id, :created_at => Time.now.utc - 1.day)
226 auth_header = bearer_authorization_header user
228 assert_difference "ChangesetComment.count", Settings.max_changeset_comments_per_hour do
229 1.upto(Settings.max_changeset_comments_per_hour) do |count|
230 post changeset_comment_path(changeset, :text => "Comment #{count}"), :headers => auth_header
231 assert_response :success
235 assert_no_difference "ChangesetComment.count" do
236 post changeset_comment_path(changeset, :text => "One comment too many"), :headers => auth_header
237 assert_response :too_many_requests
242 # create comment rate limit for reported users
243 def test_create_by_reported_user_with_rate_limit
244 changeset = create(:changeset, :closed)
246 create(:issue_with_reports, :reportable => user, :reported_user => user)
248 auth_header = bearer_authorization_header user
250 assert_difference "ChangesetComment.count", Settings.initial_changeset_comments_per_hour / 2 do
251 1.upto(Settings.initial_changeset_comments_per_hour / 2) do |count|
252 post changeset_comment_path(changeset, :text => "Comment #{count}"), :headers => auth_header
253 assert_response :success
257 assert_no_difference "ChangesetComment.count" do
258 post changeset_comment_path(changeset, :text => "One comment too many"), :headers => auth_header
259 assert_response :too_many_requests
264 # create comment rate limit for moderator users
265 def test_create_by_moderator_user_with_rate_limit
266 changeset = create(:changeset, :closed)
267 user = create(:moderator_user)
269 auth_header = bearer_authorization_header user
271 assert_difference "ChangesetComment.count", Settings.moderator_changeset_comments_per_hour do
272 1.upto(Settings.moderator_changeset_comments_per_hour) do |count|
273 post changeset_comment_path(changeset, :text => "Comment #{count}"), :headers => auth_header
274 assert_response :success
278 assert_no_difference "ChangesetComment.count" do
279 post changeset_comment_path(changeset, :text => "One comment too many"), :headers => auth_header
280 assert_response :too_many_requests
284 def test_hide_by_unauthorized
285 comment = create(:changeset_comment)
287 post changeset_comment_hide_path(comment)
289 assert_response :unauthorized
290 assert comment.reload.visible
293 def test_hide_by_normal_user
294 comment = create(:changeset_comment)
295 auth_header = bearer_authorization_header
297 post changeset_comment_hide_path(comment), :headers => auth_header
299 assert_response :forbidden
300 assert comment.reload.visible
303 def test_hide_missing_comment
304 auth_header = bearer_authorization_header create(:moderator_user)
306 post changeset_comment_hide_path(999111), :headers => auth_header
308 assert_response :not_found
312 # test hide comment succes
314 comment = create(:changeset_comment)
315 assert comment.visible
317 auth_header = bearer_authorization_header create(:moderator_user)
319 post changeset_comment_hide_path(comment), :headers => auth_header
320 assert_response :success
321 assert_not comment.reload.visible
324 def test_unhide_by_unauthorized
325 comment = create(:changeset_comment, :visible => false)
327 post changeset_comment_unhide_path(comment)
329 assert_response :unauthorized
330 assert_not comment.reload.visible
333 def test_unhide_by_normal_user
334 comment = create(:changeset_comment, :visible => false)
335 auth_header = bearer_authorization_header
337 post changeset_comment_unhide_path(comment), :headers => auth_header
339 assert_response :forbidden
340 assert_not comment.reload.visible
343 def test_unhide_missing_comment
344 auth_header = bearer_authorization_header create(:moderator_user)
346 post changeset_comment_unhide_path(999111), :headers => auth_header
348 assert_response :not_found
352 # test unhide comment succes
354 comment = create(:changeset_comment, :visible => false)
355 assert_not comment.visible
357 auth_header = bearer_authorization_header create(:moderator_user)
359 post changeset_comment_unhide_path(comment), :headers => auth_header
360 assert_response :success
361 assert comment.reload.visible