1 # frozen_string_literal: true
5 class ModerationZonesControllerTest < ActionDispatch::IntegrationTest
8 { :path => "/moderation_zones", :method => :get },
9 { :controller => "moderation_zones", :action => "index" }
12 { :path => "/moderation_zones/new", :method => :get },
13 { :controller => "moderation_zones", :action => "new" }
16 { :path => "/moderation_zones/123/edit", :method => :get },
17 { :controller => "moderation_zones", :action => "edit", :id => "123" }
20 { :path => "/moderation_zones", :method => :post },
21 { :controller => "moderation_zones", :action => "create" }
24 { :path => "/moderation_zones/123", :method => :put },
25 { :controller => "moderation_zones", :action => "update", :id => "123" }
29 test "index, unauthenticated" do
30 get moderation_zones_url
31 assert_redirected_to login_url(:referer => moderation_zones_path)
34 test "index, as normal user" do
35 session_for(create(:user))
36 get moderation_zones_url
37 assert_redirected_to "/403"
40 test "index, as moderator" do
41 create(:moderation_zone, :ends_at => 1.week.ago)
42 create(:moderation_zone, :ends_at => 1.week.from_now)
43 revoker = create(:moderator_user, :display_name => "Revokator")
44 create(:moderation_zone, :ends_at => 1.week.ago, :revoker => revoker)
46 session_for(create(:moderator_user))
47 get moderation_zones_url
48 assert_response :success
49 assert_dom "td", :text => "active"
50 assert_dom "td", :text => "ended"
51 assert_dom "td", :text => "revoked by Revokator"
54 test "new, unauthenticated" do
55 get new_moderation_zone_url
56 assert_redirected_to login_url(:referer => new_moderation_zone_path)
59 test "new, as normal user" do
60 session_for(create(:user))
61 get new_moderation_zone_url
62 assert_redirected_to "/403"
65 test "new, as moderator" do
66 session_for(create(:moderator_user))
67 get new_moderation_zone_url
68 assert_response :success
71 test "create, unauthenticated" do
74 :params => { :moderation_zone => {} }
76 assert_response :forbidden
79 test "create, as normal user" do
80 session_for(create(:user))
85 **attributes_for(:moderation_zone)
86 .slice(:name, :reason, :zone),
87 :period => 2.days.in_hours
91 assert_redirected_to "/403"
94 test "create, as moderator" do
95 moderator = create(:moderator_user)
96 session_for(moderator)
98 assert_difference("ModerationZone.count") do
100 moderation_zones_url,
102 :moderation_zone => {
103 **attributes_for(:moderation_zone)
104 .slice(:name, :reason, :zone),
105 :period => 2.days.in_hours
111 moderation_zone = ModerationZone.last
112 assert_redirected_to moderation_zones_url
114 assert_in_delta moderation_zone.ends_at, 2.days.from_now, 10.seconds
117 test "create, with errors" do
118 moderator = create(:moderator_user)
119 session_for(moderator)
121 assert_no_difference("ModerationZone.count") do
123 moderation_zones_url,
125 :moderation_zone => {
126 **attributes_for(:moderation_zone)
127 .slice(:name, :zone),
128 :period => 6.months.in_hours
134 assert_response :unprocessable_content
135 assert_dom "option[selected]", :text => "6 months"
138 test "edit, unauthenticated" do
139 get edit_moderation_zone_url(123)
140 assert_redirected_to login_path(:referer => edit_moderation_zone_path(123))
143 test "edit, as normal user" do
144 session_for(create(:user))
145 moderation_zone = create(:moderation_zone, :ends_at => 1.year.from_now)
146 get edit_moderation_zone_url(moderation_zone)
147 assert_redirected_to "/403"
150 test "edit, as moderator" do
151 session_for(create(:moderator_user))
152 moderation_zone = create(:moderation_zone, :ends_at => 1.year.from_now)
153 get edit_moderation_zone_url(moderation_zone)
154 assert_response :success
155 assert_dom "option[selected]", :text => "1 year"
158 test "update, unauthenticated" do
160 moderation_zone_url(123),
161 :params => { :moderation_zone => {} }
163 assert_response :forbidden
166 test "update, as normal user" do
167 # This is an edge case: a normal user has a moderation zone to their name.
168 # Perhaps they used to be a moderator, but no longer. The important
169 # bit is that they shouldn't be able to update it any more.
171 # Instead of this we could just have a test for "normal user can't update"
172 # with a simpler request (eg: with empty params) but, for the sake of
173 # doing it properly, let's have everyting in place except for the only detail
174 # that the user is not a moderator.
175 creator = create(:user)
176 moderation_zone = create(:moderation_zone, :ends_at => 1.week.from_now, :creator => creator)
180 moderation_zone_url(moderation_zone),
182 :moderation_zone => {
183 :name => moderation_zone.name,
184 :reason => moderation_zone.reason,
185 :zone => moderation_zone.zone,
186 :period => 2.weeks.in_hours
190 assert_redirected_to "/403"
193 test "update, as moderator" do
194 creator = create(:moderator_user)
195 moderation_zone = create(:moderation_zone, :ends_at => 1.week.from_now, :creator => creator)
199 moderation_zone_url(moderation_zone),
201 :moderation_zone => {
202 :name => moderation_zone.name,
203 :reason => moderation_zone.reason,
204 :zone => moderation_zone.zone,
205 :period => 2.weeks.in_hours
209 assert_redirected_to moderation_zones_url
211 moderation_zone.reload
212 assert_in_delta moderation_zone.ends_at, 2.weeks.from_now, 10.seconds
213 assert_nil moderation_zone.revoker
216 test "update, with errors" do
217 creator = create(:moderator_user)
218 moderation_zone = create(:moderation_zone, :ends_at => 1.week.from_now, :creator => creator)
222 moderation_zone_url(moderation_zone),
224 :moderation_zone => {
225 :name => moderation_zone.name,
227 :zone => moderation_zone.zone,
228 :period => 4.days.in_hours
233 assert_response :unprocessable_content
234 assert_dom "option[selected]", :text => "4 days"
237 test "update to revoke" do
238 revoker = create(:moderator_user)
239 moderation_zone = create(:moderation_zone, :ends_at => 1.week.from_now)
243 moderation_zone_url(moderation_zone),
245 :moderation_zone => {
246 :name => moderation_zone.name,
247 :reason => moderation_zone.reason,
248 :zone => moderation_zone.zone,
253 assert_redirected_to moderation_zones_url
255 moderation_zone.reload
256 assert_equal revoker, moderation_zone.revoker
259 test "update, by non-creator, of inactive+unrevoked record" do
260 updater = create(:moderator_user)
261 moderation_zone = create(:moderation_zone, :reason => "Initial reason", :ends_at => 1.week.ago)
265 moderation_zone_url(moderation_zone),
267 :moderation_zone => {
268 :reason => "Updated reason"
272 assert_redirected_to moderation_zones_url
273 assert_equal "Only the moderator who created this moderation zone can edit it.", flash[:error]
275 moderation_zone.reload
276 assert_equal "Initial reason", moderation_zone.reason
279 test "update, by creator, of inactive+revoked record" do
280 creator = create(:moderator_user)
281 moderation_zone = create(:moderation_zone, :reason => "Initial reason", :creator => creator, :ends_at => 1.week.ago)
285 moderation_zone_url(moderation_zone),
287 :moderation_zone => {
288 :reason => "Updated reason"
293 assert_redirected_to moderation_zones_url
294 assert_nil flash[:error]
296 moderation_zone.reload
297 assert_equal "Updated reason", moderation_zone.reason
300 test "update, by non-creator, of revoked record" do
301 updater = create(:moderator_user)
302 revoker = create(:moderator_user)
303 moderation_zone = create(:moderation_zone, :reason => "Initial reason", :ends_at => 1.week.ago, :revoker => revoker)
307 moderation_zone_url(moderation_zone),
309 :moderation_zone => {
310 :reason => "Updated reason"
314 assert_redirected_to moderation_zones_url
315 assert_equal "Only the moderators who created or revoked this moderation zone can edit it.", flash[:error]
317 moderation_zone.reload
318 assert_equal "Initial reason", moderation_zone.reason
321 test "update, by non-creator, of active record" do
322 updater = create(:moderator_user)
323 moderation_zone = create(:moderation_zone, :reason => "Initial reason", :ends_at => 1.week.from_now)
327 moderation_zone_url(moderation_zone),
329 :moderation_zone => {
330 :reason => "Updated reason",
331 :period => 1.week.from_now
335 assert_redirected_to moderation_zones_url
336 assert_equal "Only the moderator who created this moderation zone can edit it without revoking.", flash[:error]
338 moderation_zone.reload
339 assert_equal "Initial reason", moderation_zone.reason
342 test "update to reactivate" do
343 creator = create(:moderator_user)
344 moderation_zone = create(:moderation_zone, :creator => creator, :ends_at => 1.week.ago)
348 moderation_zone_url(moderation_zone),
350 :moderation_zone => {
351 :period => 1.week.from_now
355 assert_redirected_to moderation_zones_url
356 assert_equal "This moderation zone is inactive and cannot be reactivated.", flash[:error]
358 moderation_zone.reload
359 assert_not_predicate moderation_zone, :active?