]> git.openstreetmap.org Git - rails.git/blob - test/controllers/api/changeset_comments_controller_test.rb
b3dc19325910939eb877ec41886ba88754a023d2
[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
157       comment = ChangesetComment.last
158       assert_equal changeset.id, comment.changeset_id
159       assert_equal user.id, comment.author_id
160       assert_equal "This is a comment", comment.body
161       assert comment.visible
162     end
163
164     ##
165     # create comment rate limit for new users
166     def test_create_by_new_user_with_rate_limit
167       changeset = create(:changeset, :closed)
168       user = create(:user)
169
170       auth_header = bearer_authorization_header user
171
172       assert_difference "ChangesetComment.count", Settings.initial_changeset_comments_per_hour do
173         1.upto(Settings.initial_changeset_comments_per_hour) do |count|
174           post changeset_comment_path(changeset, :text => "Comment #{count}"), :headers => auth_header
175           assert_response :success
176         end
177       end
178
179       assert_no_difference "ChangesetComment.count" do
180         post changeset_comment_path(changeset, :text => "One comment too many"), :headers => auth_header
181         assert_response :too_many_requests
182       end
183     end
184
185     ##
186     # create comment rate limit for experienced users
187     def test_create_by_experienced_user_with_rate_limit
188       changeset = create(:changeset, :closed)
189       user = create(:user)
190       create_list(:changeset_comment, Settings.comments_to_max_changeset_comments, :author_id => user.id, :created_at => Time.now.utc - 1.day)
191
192       auth_header = bearer_authorization_header user
193
194       assert_difference "ChangesetComment.count", Settings.max_changeset_comments_per_hour do
195         1.upto(Settings.max_changeset_comments_per_hour) do |count|
196           post changeset_comment_path(changeset, :text => "Comment #{count}"), :headers => auth_header
197           assert_response :success
198         end
199       end
200
201       assert_no_difference "ChangesetComment.count" do
202         post changeset_comment_path(changeset, :text => "One comment too many"), :headers => auth_header
203         assert_response :too_many_requests
204       end
205     end
206
207     ##
208     # create comment rate limit for reported users
209     def test_create_by_reported_user_with_rate_limit
210       changeset = create(:changeset, :closed)
211       user = create(:user)
212       create(:issue_with_reports, :reportable => user, :reported_user => user)
213
214       auth_header = bearer_authorization_header user
215
216       assert_difference "ChangesetComment.count", Settings.initial_changeset_comments_per_hour / 2 do
217         1.upto(Settings.initial_changeset_comments_per_hour / 2) do |count|
218           post changeset_comment_path(changeset, :text => "Comment #{count}"), :headers => auth_header
219           assert_response :success
220         end
221       end
222
223       assert_no_difference "ChangesetComment.count" do
224         post changeset_comment_path(changeset, :text => "One comment too many"), :headers => auth_header
225         assert_response :too_many_requests
226       end
227     end
228
229     ##
230     # create comment rate limit for moderator users
231     def test_create_by_moderator_user_with_rate_limit
232       changeset = create(:changeset, :closed)
233       user = create(:moderator_user)
234
235       auth_header = bearer_authorization_header user
236
237       assert_difference "ChangesetComment.count", Settings.moderator_changeset_comments_per_hour do
238         1.upto(Settings.moderator_changeset_comments_per_hour) do |count|
239           post changeset_comment_path(changeset, :text => "Comment #{count}"), :headers => auth_header
240           assert_response :success
241         end
242       end
243
244       assert_no_difference "ChangesetComment.count" do
245         post changeset_comment_path(changeset, :text => "One comment too many"), :headers => auth_header
246         assert_response :too_many_requests
247       end
248     end
249
250     ##
251     # test hide comment fail
252     def test_hide_fail
253       # unauthorized
254       comment = create(:changeset_comment)
255       assert comment.visible
256
257       post changeset_comment_hide_path(comment)
258       assert_response :unauthorized
259       assert comment.reload.visible
260
261       auth_header = bearer_authorization_header
262
263       # not a moderator
264       post changeset_comment_hide_path(comment), :headers => auth_header
265       assert_response :forbidden
266       assert comment.reload.visible
267
268       auth_header = bearer_authorization_header create(:moderator_user)
269
270       # bad comment id
271       post changeset_comment_hide_path(999111), :headers => auth_header
272       assert_response :not_found
273       assert comment.reload.visible
274     end
275
276     ##
277     # test hide comment succes
278     def test_hide
279       comment = create(:changeset_comment)
280       assert comment.visible
281
282       auth_header = bearer_authorization_header create(:moderator_user)
283
284       post changeset_comment_hide_path(comment), :headers => auth_header
285       assert_response :success
286       assert_not comment.reload.visible
287     end
288
289     ##
290     # test unhide comment fail
291     def test_unhide_fail
292       # unauthorized
293       comment = create(:changeset_comment, :visible => false)
294       assert_not comment.visible
295
296       post changeset_comment_unhide_path(comment)
297       assert_response :unauthorized
298       assert_not comment.reload.visible
299
300       auth_header = bearer_authorization_header
301
302       # not a moderator
303       post changeset_comment_unhide_path(comment), :headers => auth_header
304       assert_response :forbidden
305       assert_not comment.reload.visible
306
307       auth_header = bearer_authorization_header create(:moderator_user)
308
309       # bad comment id
310       post changeset_comment_unhide_path(999111), :headers => auth_header
311       assert_response :not_found
312       assert_not comment.reload.visible
313     end
314
315     ##
316     # test unhide comment succes
317     def test_unhide
318       comment = create(:changeset_comment, :visible => false)
319       assert_not comment.visible
320
321       auth_header = bearer_authorization_header create(:moderator_user)
322
323       post changeset_comment_unhide_path(comment), :headers => auth_header
324       assert_response :success
325       assert comment.reload.visible
326     end
327   end
328 end