]> git.openstreetmap.org Git - rails.git/blob - test/controllers/api/changeset_comments_controller_test.rb
Split api changeset comment create scope and terms tests
[rails.git] / test / controllers / api / changeset_comments_controller_test.rb
1 require "test_helper"
2
3 module Api
4   class ChangesetCommentsControllerTest < ActionDispatch::IntegrationTest
5     ##
6     # test all routes which lead to this controller
7     def test_routes
8       assert_routing(
9         { :path => "/api/0.6/changeset/1/comment", :method => :post },
10         { :controller => "api/changeset_comments", :action => "create", :id => "1" }
11       )
12       assert_routing(
13         { :path => "/api/0.6/changeset/1/comment.json", :method => :post },
14         { :controller => "api/changeset_comments", :action => "create", :id => "1", :format => "json" }
15       )
16       assert_routing(
17         { :path => "/api/0.6/changeset/comment/1/hide", :method => :post },
18         { :controller => "api/changeset_comments", :action => "destroy", :id => "1" }
19       )
20       assert_routing(
21         { :path => "/api/0.6/changeset/comment/1/hide.json", :method => :post },
22         { :controller => "api/changeset_comments", :action => "destroy", :id => "1", :format => "json" }
23       )
24       assert_routing(
25         { :path => "/api/0.6/changeset/comment/1/unhide", :method => :post },
26         { :controller => "api/changeset_comments", :action => "restore", :id => "1" }
27       )
28       assert_routing(
29         { :path => "/api/0.6/changeset/comment/1/unhide.json", :method => :post },
30         { :controller => "api/changeset_comments", :action => "restore", :id => "1", :format => "json" }
31       )
32     end
33
34     ##
35     # create comment success
36     def test_create
37       user = create(:user)
38       user2 = create(:user)
39       private_user = create(:user, :data_public => false)
40       suspended_user = create(:user, :suspended)
41       deleted_user = create(:user, :deleted)
42       private_user_closed_changeset = create(:changeset, :closed, :user => private_user)
43
44       auth_header = bearer_authorization_header user
45
46       assert_difference "ChangesetComment.count", 1 do
47         assert_no_difference "ActionMailer::Base.deliveries.size" do
48           perform_enqueued_jobs do
49             post changeset_comment_path(private_user_closed_changeset, :text => "This is a comment"), :headers => auth_header
50           end
51         end
52       end
53       assert_response :success
54
55       changeset = create(:changeset, :closed, :user => private_user)
56       changeset.subscribers.push(private_user)
57       changeset.subscribers.push(user)
58       changeset.subscribers.push(suspended_user)
59       changeset.subscribers.push(deleted_user)
60
61       assert_difference "ChangesetComment.count", 1 do
62         assert_difference "ActionMailer::Base.deliveries.size", 1 do
63           perform_enqueued_jobs do
64             post changeset_comment_path(changeset, :text => "This is a comment"), :headers => auth_header
65           end
66         end
67       end
68       assert_response :success
69
70       email = ActionMailer::Base.deliveries.first
71       assert_equal 1, email.to.length
72       assert_equal "[OpenStreetMap] #{user.display_name} has commented on one of your changesets", email.subject
73       assert_equal private_user.email, email.to.first
74
75       ActionMailer::Base.deliveries.clear
76
77       auth_header = bearer_authorization_header user2
78
79       assert_difference "ChangesetComment.count", 1 do
80         assert_difference "ActionMailer::Base.deliveries.size", 2 do
81           perform_enqueued_jobs do
82             post changeset_comment_path(changeset, :text => "This is a comment"), :headers => auth_header
83           end
84         end
85       end
86       assert_response :success
87
88       email = ActionMailer::Base.deliveries.find { |e| e.to.first == private_user.email }
89       assert_not_nil email
90       assert_equal 1, email.to.length
91       assert_equal "[OpenStreetMap] #{user2.display_name} has commented on one of your changesets", email.subject
92
93       email = ActionMailer::Base.deliveries.find { |e| e.to.first == user.email }
94       assert_not_nil email
95       assert_equal 1, email.to.length
96       assert_equal "[OpenStreetMap] #{user2.display_name} has commented on a changeset you are interested in", email.subject
97
98       ActionMailer::Base.deliveries.clear
99     end
100
101     def test_create_by_unauthorized
102       assert_no_difference "ChangesetComment.count" do
103         post changeset_comment_path(create(:changeset, :closed), :text => "This is a comment")
104         assert_response :unauthorized
105       end
106     end
107
108     def test_create_on_missing_changeset
109       assert_no_difference "ChangesetComment.count" do
110         post changeset_comment_path(999111, :text => "This is a comment"), :headers => bearer_authorization_header
111         assert_response :not_found
112       end
113     end
114
115     def test_create_on_open_changeset
116       assert_no_difference "ChangesetComment.count" do
117         post changeset_comment_path(create(:changeset), :text => "This is a comment"), :headers => bearer_authorization_header
118         assert_response :conflict
119       end
120     end
121
122     def test_create_without_text
123       assert_no_difference "ChangesetComment.count" do
124         post changeset_comment_path(create(:changeset, :closed)), :headers => bearer_authorization_header
125         assert_response :bad_request
126       end
127     end
128
129     def test_create_with_empty_text
130       assert_no_difference "ChangesetComment.count" do
131         post changeset_comment_path(create(:changeset, :closed), :text => ""), :headers => bearer_authorization_header
132         assert_response :bad_request
133       end
134     end
135
136     def test_create_when_not_agreed_to_terms
137       user = create(:user, :terms_agreed => nil)
138       auth_header = bearer_authorization_header user
139       changeset = create(:changeset, :closed)
140
141       assert_difference "ChangesetComment.count", 0 do
142         post changeset_comment_path(changeset), :params => { :text => "This is a comment" }, :headers => auth_header
143         assert_response :forbidden
144       end
145     end
146
147     def test_create_with_write_api_scope
148       user = create(:user)
149       auth_header = bearer_authorization_header user, :scopes => %w[write_api]
150       changeset = create(:changeset, :closed)
151
152       assert_difference "ChangesetComment.count", 1 do
153         post changeset_comment_path(changeset), :params => { :text => "This is a comment" }, :headers => auth_header
154         assert_response :success
155       end
156     end
157
158     ##
159     # create comment rate limit for new users
160     def test_create_by_new_user_with_rate_limit
161       changeset = create(:changeset, :closed)
162       user = create(:user)
163
164       auth_header = bearer_authorization_header user
165
166       assert_difference "ChangesetComment.count", Settings.initial_changeset_comments_per_hour do
167         1.upto(Settings.initial_changeset_comments_per_hour) do |count|
168           post changeset_comment_path(changeset, :text => "Comment #{count}"), :headers => auth_header
169           assert_response :success
170         end
171       end
172
173       assert_no_difference "ChangesetComment.count" do
174         post changeset_comment_path(changeset, :text => "One comment too many"), :headers => auth_header
175         assert_response :too_many_requests
176       end
177     end
178
179     ##
180     # create comment rate limit for experienced users
181     def test_create_by_experienced_user_with_rate_limit
182       changeset = create(:changeset, :closed)
183       user = create(:user)
184       create_list(:changeset_comment, Settings.comments_to_max_changeset_comments, :author_id => user.id, :created_at => Time.now.utc - 1.day)
185
186       auth_header = bearer_authorization_header user
187
188       assert_difference "ChangesetComment.count", Settings.max_changeset_comments_per_hour do
189         1.upto(Settings.max_changeset_comments_per_hour) do |count|
190           post changeset_comment_path(changeset, :text => "Comment #{count}"), :headers => auth_header
191           assert_response :success
192         end
193       end
194
195       assert_no_difference "ChangesetComment.count" do
196         post changeset_comment_path(changeset, :text => "One comment too many"), :headers => auth_header
197         assert_response :too_many_requests
198       end
199     end
200
201     ##
202     # create comment rate limit for reported users
203     def test_create_by_reported_user_with_rate_limit
204       changeset = create(:changeset, :closed)
205       user = create(:user)
206       create(:issue_with_reports, :reportable => user, :reported_user => user)
207
208       auth_header = bearer_authorization_header user
209
210       assert_difference "ChangesetComment.count", Settings.initial_changeset_comments_per_hour / 2 do
211         1.upto(Settings.initial_changeset_comments_per_hour / 2) do |count|
212           post changeset_comment_path(changeset, :text => "Comment #{count}"), :headers => auth_header
213           assert_response :success
214         end
215       end
216
217       assert_no_difference "ChangesetComment.count" do
218         post changeset_comment_path(changeset, :text => "One comment too many"), :headers => auth_header
219         assert_response :too_many_requests
220       end
221     end
222
223     ##
224     # create comment rate limit for moderator users
225     def test_create_by_moderator_user_with_rate_limit
226       changeset = create(:changeset, :closed)
227       user = create(:moderator_user)
228
229       auth_header = bearer_authorization_header user
230
231       assert_difference "ChangesetComment.count", Settings.moderator_changeset_comments_per_hour do
232         1.upto(Settings.moderator_changeset_comments_per_hour) do |count|
233           post changeset_comment_path(changeset, :text => "Comment #{count}"), :headers => auth_header
234           assert_response :success
235         end
236       end
237
238       assert_no_difference "ChangesetComment.count" do
239         post changeset_comment_path(changeset, :text => "One comment too many"), :headers => auth_header
240         assert_response :too_many_requests
241       end
242     end
243
244     ##
245     # test hide comment fail
246     def test_hide_fail
247       # unauthorized
248       comment = create(:changeset_comment)
249       assert comment.visible
250
251       post changeset_comment_hide_path(comment)
252       assert_response :unauthorized
253       assert comment.reload.visible
254
255       auth_header = bearer_authorization_header
256
257       # not a moderator
258       post changeset_comment_hide_path(comment), :headers => auth_header
259       assert_response :forbidden
260       assert comment.reload.visible
261
262       auth_header = bearer_authorization_header create(:moderator_user)
263
264       # bad comment id
265       post changeset_comment_hide_path(999111), :headers => auth_header
266       assert_response :not_found
267       assert comment.reload.visible
268     end
269
270     ##
271     # test hide comment succes
272     def test_hide
273       comment = create(:changeset_comment)
274       assert comment.visible
275
276       auth_header = bearer_authorization_header create(:moderator_user)
277
278       post changeset_comment_hide_path(comment), :headers => auth_header
279       assert_response :success
280       assert_not comment.reload.visible
281     end
282
283     ##
284     # test unhide comment fail
285     def test_unhide_fail
286       # unauthorized
287       comment = create(:changeset_comment, :visible => false)
288       assert_not comment.visible
289
290       post changeset_comment_unhide_path(comment)
291       assert_response :unauthorized
292       assert_not comment.reload.visible
293
294       auth_header = bearer_authorization_header
295
296       # not a moderator
297       post changeset_comment_unhide_path(comment), :headers => auth_header
298       assert_response :forbidden
299       assert_not comment.reload.visible
300
301       auth_header = bearer_authorization_header create(:moderator_user)
302
303       # bad comment id
304       post changeset_comment_unhide_path(999111), :headers => auth_header
305       assert_response :not_found
306       assert_not comment.reload.visible
307     end
308
309     ##
310     # test unhide comment succes
311     def test_unhide
312       comment = create(:changeset_comment, :visible => false)
313       assert_not comment.visible
314
315       auth_header = bearer_authorization_header create(:moderator_user)
316
317       post changeset_comment_unhide_path(comment), :headers => auth_header
318       assert_response :success
319       assert comment.reload.visible
320     end
321   end
322 end