]> git.openstreetmap.org Git - rails.git/commitdiff
Add revoke all blocks action
authorAnton Khorev <tony29@yandex.ru>
Thu, 28 Dec 2023 02:57:58 +0000 (05:57 +0300)
committerAnton Khorev <tony29@yandex.ru>
Sun, 7 Jan 2024 12:15:28 +0000 (15:15 +0300)
app/controllers/user_blocks_controller.rb
config/locales/en.yml
test/controllers/user_blocks_controller_test.rb

index a671f0d16f67112eb3dcf508a3fc585f16b2493e..07d0bc43c0bf2e64138a24ad2b0af41cbcf9bb2b 100644 (file)
@@ -12,7 +12,7 @@ class UserBlocksController < ApplicationController
   before_action :lookup_user_block, :only => [:show, :edit, :update, :revoke]
   before_action :require_valid_params, :only => [:create, :update]
   before_action :check_database_readable
-  before_action :check_database_writable, :only => [:create, :update, :revoke]
+  before_action :check_database_writable, :only => [:create, :update, :revoke, :revoke_all]
 
   def index
     @params = params.permit
@@ -92,7 +92,11 @@ class UserBlocksController < ApplicationController
   ##
   # revokes all active blocks
   def revoke_all
-    # TODO revoke
+    if request.post? && params[:confirm]
+      @user.blocks.active.each { |block| block.revoke!(current_user) }
+      flash[:notice] = t ".flash"
+      redirect_to user_blocks_on_path(@user)
+    end
   end
 
   ##
index ff1ee898498cdb863645ec75ad467e027a171899..6218bfea24fcb38c9b4fdca6a0e770377611a0b8 100644 (file)
@@ -2902,6 +2902,7 @@ en:
         one: "%{count} active block"
         other: "%{count} active blocks"
       revoke: "Revoke!"
+      flash: "All active blocks have been revoked."
     helper:
       time_future_html: "Ends in %{time}."
       until_login: "Active until the user logs in."
index ea0e7d48833f3a096f1113a4fbc41912c5b4097c..0877fa39e400f0b809178e96fe7cdfd832986465 100644 (file)
@@ -395,8 +395,8 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
   end
 
   ##
-  # test the revoke all action
-  def test_revoke_all
+  # test the revoke all page
+  def test_revoke_all_page
     blocked_user = create(:user)
     create(:user_block, :user => blocked_user)
 
@@ -424,6 +424,54 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     assert_response :success
   end
 
+  ##
+  # test the revoke all action
+  def test_revoke_all_action
+    blocked_user = create(:user)
+    active_block1 = create(:user_block, :user => blocked_user)
+    active_block2 = create(:user_block, :user => blocked_user)
+    expired_block1 = create(:user_block, :expired, :user => blocked_user)
+    blocks = [active_block1, active_block2, expired_block1]
+    moderator_user = create(:moderator_user)
+
+    assert_predicate active_block1, :active?
+    assert_predicate active_block2, :active?
+    assert_not_predicate expired_block1, :active?
+
+    # Login as a normal user
+    session_for(create(:user))
+
+    # Check that normal users can't load the block revoke page
+    get revoke_all_user_blocks_path(:blocked_user)
+    assert_response :redirect
+    assert_redirected_to :controller => "errors", :action => "forbidden"
+
+    # Login as a moderator
+    session_for(moderator_user)
+
+    # Check that revoking blocks using GET should fail
+    get revoke_all_user_blocks_path(blocked_user, :confirm => true)
+    assert_response :success
+    assert_template "revoke_all"
+
+    blocks.each(&:reload)
+    assert_predicate active_block1, :active?
+    assert_predicate active_block2, :active?
+    assert_not_predicate expired_block1, :active?
+
+    # Check that revoking blocks works using POST
+    post revoke_all_user_blocks_path(blocked_user, :confirm => true)
+    assert_redirected_to user_blocks_on_path(blocked_user)
+
+    blocks.each(&:reload)
+    assert_not_predicate active_block1, :active?
+    assert_not_predicate active_block2, :active?
+    assert_not_predicate expired_block1, :active?
+    assert_equal moderator_user, active_block1.revoker
+    assert_equal moderator_user, active_block2.revoker
+    assert_not_equal moderator_user, expired_block1.revoker
+  end
+
   ##
   # test the blocks_on action
   def test_blocks_on