1 # frozen_string_literal: true
4 require_relative "user_blocks/table_test_helper"
6 class UserBlocksControllerTest < ActionDispatch::IntegrationTest
7 include UserBlocks::TableTestHelper
10 # test all routes which lead to this controller
13 { :path => "/user_blocks/new/username", :method => :get },
14 { :controller => "user_blocks", :action => "new", :display_name => "username" }
18 { :path => "/user_blocks", :method => :get },
19 { :controller => "user_blocks", :action => "index" }
22 { :path => "/user_blocks", :method => :post },
23 { :controller => "user_blocks", :action => "create" }
26 { :path => "/user_blocks/1", :method => :get },
27 { :controller => "user_blocks", :action => "show", :id => "1" }
30 { :path => "/user_blocks/1/edit", :method => :get },
31 { :controller => "user_blocks", :action => "edit", :id => "1" }
34 { :path => "/user_blocks/1", :method => :put },
35 { :controller => "user_blocks", :action => "update", :id => "1" }
38 { :path => "/user_blocks/1", :method => :delete },
39 { :controller => "user_blocks", :action => "destroy", :id => "1" }
44 # test the index action
46 revoked_block = create(:user_block, :revoked)
49 assert_response :success
50 assert_select "table#block_list tbody tr", :count => 1 do
51 assert_select "a[href='#{user_path revoked_block.user}']", :text => revoked_block.user.display_name
52 assert_select "a[href='#{user_path revoked_block.creator}']", :text => revoked_block.creator.display_name
53 assert_select "a[href='#{user_path revoked_block.revoker}']", :text => revoked_block.revoker.display_name
56 active_block = create(:user_block)
57 expired_block = create(:user_block, :expired)
60 assert_response :success
61 assert_select "table#block_list tbody", :count => 1 do
63 assert_select "a[href='#{user_block_path(active_block)}']", 1
64 assert_select "a[href='#{user_block_path(expired_block)}']", 1
65 assert_select "a[href='#{user_block_path(revoked_block)}']", 1
70 # test the index action with multiple pages
72 user_blocks = create_list(:user_block, 50).reverse
73 next_path = user_blocks_path
76 assert_response :success
77 check_user_blocks_table user_blocks[0...20]
78 check_no_page_link "Newer Blocks"
79 next_path = check_page_link "Older Blocks"
82 assert_response :success
83 check_user_blocks_table user_blocks[20...40]
84 check_page_link "Newer Blocks"
85 next_path = check_page_link "Older Blocks"
88 assert_response :success
89 check_user_blocks_table user_blocks[40...50]
90 check_page_link "Newer Blocks"
91 check_no_page_link "Older Blocks"
95 # test the index action with invalid pages
96 def test_index_invalid_paged
97 %w[-1 fred].each do |id|
98 get user_blocks_path(:before => id)
99 assert_redirected_to :controller => :errors, :action => :bad_request
101 get user_blocks_path(:after => id)
102 assert_redirected_to :controller => :errors, :action => :bad_request
107 # test the show action
109 active_block = create(:user_block, :needs_view)
110 expired_block = create(:user_block, :expired)
111 revoked_block = create(:user_block, :revoked)
113 # Viewing a block should fail when a bogus ID is given
114 get user_block_path(99999)
115 assert_response :not_found
116 assert_template "not_found"
117 assert_select "p", "Sorry, the user block with ID 99999 could not be found."
119 # Viewing an expired block should work
120 get user_block_path(expired_block)
121 assert_response :success
122 assert_select "h1 a[href='#{user_path expired_block.user}']", :text => expired_block.user.display_name
123 assert_select "h1 a[href='#{user_path expired_block.creator}']", :text => expired_block.creator.display_name
125 # Viewing a revoked block should work
126 get user_block_path(revoked_block)
127 assert_response :success
128 assert_select "h1 a[href='#{user_path revoked_block.user}']", :text => revoked_block.user.display_name
129 assert_select "h1 a[href='#{user_path revoked_block.creator}']", :text => revoked_block.creator.display_name
130 assert_select "a[href='#{user_path revoked_block.revoker}']", :text => revoked_block.revoker.display_name
132 # Viewing an active block should work, but shouldn't mark it as seen
133 get user_block_path(active_block)
134 assert_response :success
135 assert_select "h1 a[href='#{user_path active_block.user}']", :text => active_block.user.display_name
136 assert_select "h1 a[href='#{user_path active_block.creator}']", :text => active_block.creator.display_name
137 assert UserBlock.find(active_block.id).needs_view
141 # test clearing needs_view by showing a zero-hour block to the blocked user
142 def test_show_sets_deactivates_at_for_zero_hour_block
147 block = create(:user_block, :needs_view, :zero_hour, :user => user)
148 assert block.needs_view
149 assert_nil block.deactivates_at
153 get user_block_path(block)
154 assert_response :success
156 assert_not block.needs_view
157 assert_equal Time.now.utc, block.deactivates_at
161 get user_block_path(block)
162 assert_response :success
164 assert_not block.needs_view
165 assert_equal Time.now.utc - 1.hour, block.deactivates_at
170 # test clearing needs_view by showing a timed block to the blocked user
171 def test_show_sets_deactivates_at_for_timed_block
176 block = create(:user_block, :needs_view, :created_at => Time.now.utc, :ends_at => Time.now.utc + 24.hours, :user => user)
177 assert block.needs_view
178 assert_nil block.deactivates_at
182 get user_block_path(block)
183 assert_response :success
185 assert_not block.needs_view
186 assert_equal Time.now.utc + 23.hours, block.deactivates_at
190 get user_block_path(block)
191 assert_response :success
193 assert_not block.needs_view
194 assert_equal Time.now.utc + 22.hours, block.deactivates_at
198 get user_block_path(block)
199 assert_response :success
201 assert_not block.needs_view
202 assert_equal Time.now.utc - 2.hours, block.deactivates_at
207 # test edit/revoke link for active blocks
208 def test_active_block_buttons
209 creator_user = create(:moderator_user)
210 other_moderator_user = create(:moderator_user)
211 block = create(:user_block, :creator => creator_user)
213 session_for(other_moderator_user)
214 check_block_buttons block, :edit => 1
216 session_for(creator_user)
217 check_block_buttons block, :edit => 1
221 # test the edit link for expired blocks
222 def test_expired_block_buttons
223 creator_user = create(:moderator_user)
224 other_moderator_user = create(:moderator_user)
225 block = create(:user_block, :expired, :creator => creator_user)
227 session_for(other_moderator_user)
228 check_block_buttons block
230 session_for(creator_user)
231 check_block_buttons block, :edit => 1
235 # test the edit link for revoked blocks
236 def test_revoked_block_buttons
237 creator_user = create(:moderator_user)
238 revoker_user = create(:moderator_user)
239 other_moderator_user = create(:moderator_user)
240 block = create(:user_block, :revoked, :creator => creator_user, :revoker => revoker_user)
242 session_for(other_moderator_user)
243 check_block_buttons block
245 session_for(creator_user)
246 check_block_buttons block, :edit => 1
248 session_for(revoker_user)
249 check_block_buttons block, :edit => 1
253 # test the new action
255 target_user = create(:user)
257 # Check that the block creation page requires us to login
258 get new_user_block_path(target_user)
259 assert_redirected_to login_path(:referer => new_user_block_path(target_user))
261 # Login as a normal user
262 session_for(create(:user))
264 # Check that normal users can't load the block creation page
265 get new_user_block_path(target_user)
266 assert_redirected_to :controller => "errors", :action => "forbidden"
268 # Login as a moderator
269 session_for(create(:moderator_user))
271 # Check that the block creation page loads for moderators
272 get new_user_block_path(target_user)
273 assert_response :success
274 assert_select "h1 a[href='#{user_path target_user}']", :text => target_user.display_name
275 assert_select "form#new_user_block", :count => 1 do
276 assert_select "textarea#user_block_reason", :count => 1
277 assert_select "select#user_block_period", :count => 1
278 assert_select "input#user_block_needs_view[type='checkbox']", :count => 1
279 assert_select "input#display_name[type='hidden']", :count => 1
280 assert_select "input[type='submit'][value='Create block']", :count => 1
283 # We should get an error if the user doesn't exist
284 get new_user_block_path("non_existent_user")
285 assert_response :not_found
286 assert_template "users/no_such_user"
287 assert_select "h1", "The user non_existent_user does not exist"
291 # test the edit action
293 creator_user = create(:moderator_user)
294 other_moderator_user = create(:moderator_user)
295 active_block = create(:user_block, :creator => creator_user)
297 # Check that the block edit page requires us to login
298 get edit_user_block_path(active_block)
299 assert_redirected_to login_path(:referer => edit_user_block_path(active_block))
301 # Login as a normal user
302 session_for(create(:user))
304 # Check that normal users can't load the block edit page
305 get edit_user_block_path(active_block)
306 assert_redirected_to :controller => "errors", :action => "forbidden"
308 # Login as a moderator
309 session_for(other_moderator_user)
311 # Check that the block edit page loads for moderators
312 get edit_user_block_path(active_block)
313 assert_response :success
314 assert_select "h1 a[href='#{user_path active_block.user}']", :text => active_block.user.display_name
315 assert_select "form#edit_user_block_#{active_block.id}", :count => 1 do
316 assert_select "textarea#user_block_reason", :count => 1
317 assert_select "select#user_block_period", :count => 0
318 assert_select "input#user_block_needs_view[type='checkbox']", :count => 0
319 assert_select "input[type='submit'][value='Update block']", :count => 0
320 assert_select "input#user_block_period[type='hidden']", :count => 1
321 assert_select "input#user_block_needs_view[type='hidden']", :count => 1
322 assert_select "input[type='submit'][value='Revoke block']", :count => 1
325 # Login as the block creator
326 session_for(creator_user)
328 # Check that the block edit page loads for the creator
329 get edit_user_block_path(active_block)
330 assert_response :success
331 assert_select "h1 a[href='#{user_path active_block.user}']", :text => active_block.user.display_name
332 assert_select "form#edit_user_block_#{active_block.id}", :count => 1 do
333 assert_select "textarea#user_block_reason", :count => 1
334 assert_select "select#user_block_period", :count => 1
335 assert_select "input#user_block_needs_view[type='checkbox']", :count => 1
336 assert_select "input[type='submit'][value='Update block']", :count => 1
337 assert_select "input#user_block_period[type='hidden']", :count => 0
338 assert_select "input#user_block_needs_view[type='hidden']", :count => 0
339 assert_select "input[type='submit'][value='Revoke block']", :count => 0
342 # We should get an error if the user doesn't exist
343 get edit_user_block_path(99999)
344 assert_response :not_found
345 assert_template "not_found"
346 assert_select "p", "Sorry, the user block with ID 99999 could not be found."
350 # test the edit action when the remaining block duration doesn't match the available select options
351 def test_edit_duration
352 moderator_user = create(:moderator_user)
355 active_block = create(:user_block, :creator => moderator_user, :ends_at => Time.now.utc + 96.hours)
357 session_for(moderator_user)
358 get edit_user_block_path(active_block)
360 assert_select "form#edit_user_block_#{active_block.id}", :count => 1 do
361 assert_select "select#user_block_period", :count => 1 do
362 assert_select "option[value='96'][selected]", :count => 1
367 get edit_user_block_path(active_block)
369 assert_select "form#edit_user_block_#{active_block.id}", :count => 1 do
370 assert_select "select#user_block_period", :count => 1 do
371 assert_select "option[value='96'][selected]", :count => 1
378 # test the create action
380 target_user = create(:user)
381 moderator_user = create(:moderator_user)
383 # Not logged in yet, so creating a block should fail
384 post user_blocks_path
385 assert_response :forbidden
387 # Login as a normal user
388 session_for(create(:user))
390 # Check that normal users can't create blocks
391 post user_blocks_path
392 assert_redirected_to :controller => "errors", :action => "forbidden"
394 # Login as a moderator
395 session_for(moderator_user)
397 # A bogus block period should result in an error
398 assert_no_difference "UserBlock.count" do
399 post user_blocks_path(:display_name => target_user.display_name,
400 :user_block_period => "99")
402 assert_redirected_to new_user_block_path(target_user)
403 assert_equal "The blocking period must be one of the values selectable in the drop-down list.", flash[:error]
405 # Check that creating a block works
406 assert_difference "UserBlock.count", 1 do
407 post user_blocks_path(:display_name => target_user.display_name,
408 :user_block_period => "12",
409 :user_block => { :needs_view => false, :reason => "Vandalism" })
412 assert_redirected_to user_block_path(b)
413 assert_equal "Created a block on user #{target_user.display_name}.", flash[:notice]
414 assert_in_delta Time.now.utc, b.created_at, 1
415 assert_in_delta Time.now.utc, b.updated_at, 1
416 assert_in_delta Time.now.utc + 12.hours, b.ends_at, 1
417 assert_not b.needs_view
418 assert_equal "Vandalism", b.reason
419 assert_equal "markdown", b.reason_format
420 assert_equal moderator_user.id, b.creator_id
422 # We should get an error if no user is specified
423 post user_blocks_path
424 assert_response :not_found
425 assert_template "users/no_such_user"
426 assert_select "h1", :html => "The user does not exist"
428 # We should get an error if the user doesn't exist
429 post user_blocks_path(:display_name => "non_existent_user")
430 assert_response :not_found
431 assert_template "users/no_such_user"
432 assert_select "h1", "The user non_existent_user does not exist"
436 # test the duration of a created block
437 def test_create_duration
438 target_user = create(:user)
439 moderator_user = create(:moderator_user)
441 session_for(moderator_user)
442 post user_blocks_path(:display_name => target_user.display_name,
443 :user_block_period => "336",
444 :user_block => { :needs_view => false, :reason => "Vandalism" })
446 block = UserBlock.last
447 assert_equal 1209600, block.ends_at - block.created_at
451 # test the update action
453 moderator_user = create(:moderator_user)
454 active_block = create(:user_block, :creator => moderator_user)
456 # Not logged in yet, so updating a block should fail
457 put user_block_path(active_block)
458 assert_response :forbidden
460 # Login as a normal user
461 session_for(create(:user))
463 # Check that normal users can't update blocks
464 put user_block_path(active_block)
465 assert_redirected_to :controller => "errors", :action => "forbidden"
467 # Login as the moderator
468 session_for(moderator_user)
470 # A bogus block period should result in an error
471 assert_no_difference "UserBlock.count" do
472 put user_block_path(active_block, :user_block_period => "99")
474 assert_redirected_to edit_user_block_path(active_block)
475 assert_equal "The blocking period must be one of the values selectable in the drop-down list.", flash[:error]
477 # Check that updating a block works
478 assert_no_difference "UserBlock.count" do
479 put user_block_path(active_block,
480 :user_block_period => "12",
481 :user_block => { :needs_view => true, :reason => "Vandalism" })
483 assert_redirected_to user_block_path(active_block)
484 assert_equal "Block updated.", flash[:notice]
485 b = UserBlock.find(active_block.id)
486 assert_in_delta Time.now.utc, b.updated_at, 1
488 assert_equal "Vandalism", b.reason
490 # We should get an error if the block doesn't exist
491 put user_block_path(99999)
492 assert_response :not_found
493 assert_template "not_found"
494 assert_select "p", "Sorry, the user block with ID 99999 could not be found."
498 # test the update action on expired blocks
499 def test_update_expired
500 creator_user = create(:moderator_user)
501 other_moderator_user = create(:moderator_user)
502 block = create(:user_block, :expired, :creator => creator_user, :reason => "Original Reason")
504 session_for(other_moderator_user)
505 put user_block_path(block,
506 :user_block_period => "0",
507 :user_block => { :needs_view => false, :reason => "Updated Reason" })
508 assert_redirected_to edit_user_block_path(block)
509 assert_equal "Only the moderator who created this block can edit it.", flash[:error]
511 assert_not block.active?
512 assert_equal "Original Reason", block.reason
514 session_for(creator_user)
515 check_inactive_block_updates(block)
519 # test the update action on revoked blocks
520 def test_update_revoked
521 creator_user = create(:moderator_user)
522 revoker_user = create(:moderator_user)
523 other_moderator_user = create(:moderator_user)
524 block = create(:user_block, :revoked, :creator => creator_user, :revoker => revoker_user, :reason => "Original Reason")
526 session_for(other_moderator_user)
527 put user_block_path(block,
528 :user_block_period => "0",
529 :user_block => { :needs_view => false, :reason => "Updated Reason" })
530 assert_redirected_to edit_user_block_path(block)
531 assert_equal "Only the moderators who created or revoked this block can edit it.", flash[:error]
533 assert_not_predicate block, :active?
534 assert_equal "Original Reason", block.reason
536 session_for(creator_user)
537 check_inactive_block_updates(block)
539 session_for(revoker_user)
540 check_inactive_block_updates(block)
544 # test the update action revoking the block
545 def test_revoke_using_update_by_creator
546 moderator_user = create(:moderator_user)
547 block = create(:user_block, :creator => moderator_user)
549 session_for(moderator_user)
550 put user_block_path(block,
551 :user_block_period => "24",
552 :user_block => { :needs_view => false, :reason => "Updated Reason" })
553 assert_redirected_to user_block_path(block)
554 assert_equal "Block updated.", flash[:notice]
556 assert_predicate block, :active?
557 assert_nil block.revoker
559 put user_block_path(block,
560 :user_block_period => "0",
561 :user_block => { :needs_view => false, :reason => "Updated Reason" })
562 assert_redirected_to user_block_path(block)
563 assert_equal "Block updated.", flash[:notice]
565 assert_not_predicate block, :active?
566 assert_equal moderator_user, block.revoker
569 def test_revoke_using_update_by_other_moderator
570 creator_user = create(:moderator_user)
571 other_moderator_user = create(:moderator_user)
572 block = create(:user_block, :creator => creator_user)
574 session_for(other_moderator_user)
575 put user_block_path(block,
576 :user_block_period => "24",
577 :user_block => { :needs_view => false, :reason => "Updated Reason" })
578 assert_response :success
579 assert_equal "Only the moderator who created this block can edit it without revoking.", flash[:error]
581 assert_predicate block, :active?
582 assert_nil block.revoker
584 put user_block_path(block,
585 :user_block_period => "0",
586 :user_block => { :needs_view => false, :reason => "Updated Reason" })
587 assert_redirected_to user_block_path(block)
588 assert_equal "Block updated.", flash[:notice]
590 assert_not_predicate block, :active?
591 assert_equal other_moderator_user, block.revoker
595 # test changes to end/deactivation dates
596 def test_dates_when_viewed_before_end
597 blocked_user = create(:user)
598 moderator_user = create(:moderator_user)
601 session_for(moderator_user)
602 assert_difference "UserBlock.count", 1 do
603 post user_blocks_path(:display_name => blocked_user.display_name,
604 :user_block_period => "48",
605 :user_block => { :needs_view => true, :reason => "Testing deactivates_at" })
607 block = UserBlock.last
608 assert_equal Time.now.utc + 48.hours, block.ends_at
609 assert_nil block.deactivates_at
612 session_for(blocked_user)
613 get user_block_path(block)
615 assert_equal Time.now.utc + 24.hours, block.ends_at
616 assert_equal Time.now.utc + 24.hours, block.deactivates_at
620 def test_dates_when_viewed_after_end
621 blocked_user = create(:user)
622 moderator_user = create(:moderator_user)
625 session_for(moderator_user)
626 assert_difference "UserBlock.count", 1 do
627 post user_blocks_path(:display_name => blocked_user.display_name,
628 :user_block_period => "24",
629 :user_block => { :needs_view => true, :reason => "Testing deactivates_at" })
631 block = UserBlock.last
632 assert_equal Time.now.utc + 24.hours, block.ends_at
633 assert_nil block.deactivates_at
636 session_for(blocked_user)
637 get user_block_path(block)
639 assert_equal Time.now.utc - 24.hours, block.ends_at
640 assert_equal Time.now.utc, block.deactivates_at
644 def test_dates_when_edited_before_end
645 blocked_user = create(:user)
646 moderator_user = create(:moderator_user)
649 session_for(moderator_user)
650 assert_difference "UserBlock.count", 1 do
651 post user_blocks_path(:display_name => blocked_user.display_name,
652 :user_block_period => "48",
653 :user_block => { :needs_view => false, :reason => "Testing deactivates_at" })
655 block = UserBlock.last
656 assert_equal Time.now.utc + 48.hours, block.ends_at
657 assert_equal Time.now.utc + 48.hours, block.deactivates_at
660 put user_block_path(block,
661 :user_block_period => "48",
662 :user_block => { :needs_view => false, :reason => "Testing deactivates_at updated" })
664 assert_equal Time.now.utc + 48.hours, block.ends_at
665 assert_equal Time.now.utc + 48.hours, block.deactivates_at
669 def test_dates_when_edited_after_end
670 blocked_user = create(:user)
671 moderator_user = create(:moderator_user)
674 session_for(moderator_user)
675 assert_difference "UserBlock.count", 1 do
676 post user_blocks_path(:display_name => blocked_user.display_name,
677 :user_block_period => "24",
678 :user_block => { :needs_view => false, :reason => "Testing deactivates_at" })
680 block = UserBlock.last
681 assert_equal Time.now.utc + 24.hours, block.ends_at
682 assert_equal Time.now.utc + 24.hours, block.deactivates_at
685 put user_block_path(block,
686 :user_block_period => "0",
687 :user_block => { :needs_view => false, :reason => "Testing deactivates_at updated" })
689 assert_equal Time.now.utc - 24.hours, block.ends_at
690 assert_equal Time.now.utc - 24.hours, block.deactivates_at
695 # test updates on legacy records without correctly initialized deactivates_at
696 def test_update_legacy_deactivates_at
697 blocked_user = create(:user)
698 moderator_user = create(:moderator_user)
701 block = UserBlock.new :user => blocked_user,
702 :creator => moderator_user,
703 :reason => "because",
704 :ends_at => Time.now.utc + 24.hours,
707 assert_difference "UserBlock.count", 1 do
708 block.save :validate => false
712 session_for(moderator_user)
713 put user_block_path(block,
714 :user_block_period => "0",
715 :user_block => { :needs_view => false, :reason => "Testing legacy block update" })
717 assert_equal Time.now.utc - 24.hours, block.ends_at
718 assert_equal Time.now.utc - 24.hours, block.deactivates_at
724 def check_block_buttons(block, edit: 0)
725 [user_blocks_path, user_block_path(block)].each do |path|
727 assert_response :success
728 assert_select "a[href='#{edit_user_block_path block}']", :count => edit
732 def check_inactive_block_updates(block)
733 original_ends_at = block.ends_at
735 put user_block_path(block,
736 :user_block_period => "0",
737 :user_block => { :needs_view => false, :reason => "Updated Reason" })
738 assert_redirected_to user_block_path(block)
739 assert_equal "Block updated.", flash[:notice]
741 assert_not_predicate block, :active?
742 assert_equal "Updated Reason", block.reason
743 assert_equal original_ends_at, block.ends_at
745 put user_block_path(block,
746 :user_block_period => "0",
747 :user_block => { :needs_view => true, :reason => "Updated Reason Needs View" })
748 assert_response :success
749 assert_equal "This block is inactive and cannot be reactivated.", flash[:error]
751 assert_not_predicate block, :active?
752 assert_equal "Updated Reason", block.reason
753 assert_equal original_ends_at, block.ends_at
755 put user_block_path(block,
756 :user_block_period => "1",
757 :user_block => { :needs_view => false, :reason => "Updated Reason Duration Extended" })
758 assert_response :success
759 assert_equal "This block is inactive and cannot be reactivated.", flash[:error]
761 assert_not_predicate block, :active?
762 assert_equal "Updated Reason", block.reason
763 assert_equal original_ends_at, block.ends_at
765 put user_block_path(block,
766 :user_block_period => "0",
767 :user_block => { :needs_view => false, :reason => "Updated Reason Again" })
768 assert_redirected_to user_block_path(block)
769 assert_equal "Block updated.", flash[:notice]
771 assert_not_predicate block, :active?
772 assert_equal "Updated Reason Again", block.reason
773 assert_equal original_ends_at, block.ends_at