]> git.openstreetmap.org Git - rails.git/commitdiff
Merge remote-tracking branch 'upstream/pull/5014'
authorTom Hughes <tom@compton.nu>
Wed, 24 Jul 2024 17:24:50 +0000 (18:24 +0100)
committerTom Hughes <tom@compton.nu>
Wed, 24 Jul 2024 17:24:50 +0000 (18:24 +0100)
app/controllers/user_blocks_controller.rb
app/views/user_blocks/_block.html.erb
app/views/user_blocks/show.html.erb
config/locales/en.yml
test/controllers/user_blocks_controller_test.rb

index 9ee3712265701fc336f6d8ed86d94aa770ca6a8f..3ab217a601fc5bfe1319aefffb5bb2ce8510314b 100644 (file)
@@ -142,9 +142,6 @@ class UserBlocksController < ApplicationController
     if UserBlock::PERIODS.exclude?(@block_period)
       flash[:error] = t("user_blocks.filter.block_period")
 
-    elsif @user_block && !@user_block.active?
-      flash[:error] = t("user_blocks.filter.block_expired")
-
     else
       @valid_params = true
     end
index 50fe74e4cdf4616776bdea979c5008097cd15842..461dc7a8d9e8ef6c19b34a80ce1a05900c17455f 100644 (file)
@@ -15,7 +15,7 @@
     <% end %>
   </td>
   <td><%= link_to t(".show"), block %></td>
-  <td><% if current_user and current_user.id == block.creator_id and block.active? %><%= link_to t(".edit"), edit_user_block_path(block) %><% end %></td>
+  <td><% if current_user and current_user.id == block.creator_id %><%= link_to t(".edit"), edit_user_block_path(block) %><% end %></td>
   <% if show_revoke_link %>
   <td><% if block.active? %><%= link_to t(".revoke"), revoke_user_block_path(block) %><% end %></td>
   <% end %>
index 7b30d19202ee56c34b76868969af639de6045390..619cd6c3f0c58d3fdee045698ca72b59882fd0b2 100644 (file)
   <dd class="col-sm-9"><div class="richtext text-break"><%= @user_block.reason.to_html %></div></dd>
 </dl>
 
-<% if @user_block.ends_at > Time.now.getutc && (current_user&.id == @user_block.creator_id ||
-                                                can?(:revoke, UserBlock)) %>
+<% if current_user&.id == @user_block.creator_id || can?(:revoke, UserBlock) && @user_block.active? %>
   <div>
     <% if current_user&.id == @user_block.creator_id %>
       <%= link_to t(".edit"), edit_user_block_path(@user_block), :class => "btn btn-outline-primary" %>
     <% end %>
-    <% if can?(:revoke, UserBlock) %>
+    <% if can?(:revoke, UserBlock) && @user_block.active? %>
       <%= link_to t(".revoke"), revoke_user_block_path(@user_block), :class => "btn btn-outline-danger" %>
     <% end %>
   </div>
index 1def0f3eb9aaff088b76029fdfa1907bd22401f7..2b83fec1f9d4097cb4e8036f1e2cc8314fe3bd47 100644 (file)
@@ -2935,7 +2935,6 @@ en:
       show: "View this block"
       back: "View all blocks"
     filter:
-      block_expired: "The block has already expired and cannot be edited."
       block_period: "The blocking period must be one of the values selectable in the drop-down list."
     create:
       flash: "Created a block on user %{name}."
index b6aaf4ca8267256ece52d00f6eb70c4c29c27e94..dd0b1287b414c7805395a82bcccb62c0b5c773e6 100644 (file)
@@ -169,6 +169,65 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     assert_not UserBlock.find(active_block.id).needs_view
   end
 
+  ##
+  # test edit/revoke link for active blocks
+  def test_active_block_buttons
+    creator_user = create(:moderator_user)
+    other_moderator_user = create(:moderator_user)
+    block = create(:user_block, :creator => creator_user)
+
+    session_for(other_moderator_user)
+    check_block_buttons block, :revoke => 1
+
+    session_for(creator_user)
+    check_block_buttons block, :edit => 1, :revoke => 1
+  end
+
+  ##
+  # test the edit link for expired blocks
+  def test_expired_block_buttons
+    creator_user = create(:moderator_user)
+    other_moderator_user = create(:moderator_user)
+    block = create(:user_block, :expired, :creator => creator_user)
+
+    session_for(other_moderator_user)
+    check_block_buttons block
+
+    session_for(creator_user)
+    check_block_buttons block, :edit => 1
+  end
+
+  ##
+  # test the edit link for revoked blocks
+  def test_revoked_block_buttons
+    creator_user = create(:moderator_user)
+    revoker_user = create(:moderator_user)
+    other_moderator_user = create(:moderator_user)
+    block = create(:user_block, :revoked, :creator => creator_user, :revoker => revoker_user)
+
+    session_for(other_moderator_user)
+    check_block_buttons block
+
+    session_for(creator_user)
+    check_block_buttons block, :edit => 1
+
+    session_for(revoker_user)
+    check_block_buttons block
+  end
+
+  private
+
+  def check_block_buttons(block, edit: 0, revoke: 0)
+    [user_blocks_path, user_block_path(block)].each do |path|
+      get path
+      assert_response :success
+      assert_select "a[href='#{edit_user_block_path block}']", :count => edit
+      assert_select "a[href='#{revoke_user_block_path block}']", :count => revoke
+    end
+  end
+
+  public
+
   ##
   # test the new action
   def test_new
@@ -406,6 +465,43 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     assert_select "p", "Sorry, the user block with ID 99999 could not be found."
   end
 
+  ##
+  # test the update action on expired blocks
+  def test_update_expired
+    creator_user = create(:moderator_user)
+    other_moderator_user = create(:moderator_user)
+    block = create(:user_block, :expired, :creator => creator_user, :reason => "Original Reason")
+
+    session_for(other_moderator_user)
+    put user_block_path(block,
+                        :user_block_period => "0",
+                        :user_block => { :needs_view => false, :reason => "Updated Reason" })
+    assert_redirected_to edit_user_block_path(block)
+    assert_equal "Only the moderator who created this block can edit it.", flash[:error]
+    block.reload
+    assert_not block.active?
+    assert_equal "Original Reason", block.reason
+
+    session_for(creator_user)
+    put user_block_path(block,
+                        :user_block_period => "0",
+                        :user_block => { :needs_view => false, :reason => "Updated Reason" })
+    assert_redirected_to user_block_path(block)
+    assert_equal "Block updated.", flash[:notice]
+    block.reload
+    assert_not block.active?
+    assert_equal "Updated Reason", block.reason
+
+    put user_block_path(block,
+                        :user_block_period => "0",
+                        :user_block => { :needs_view => true, :reason => "Updated Reason 2" })
+    assert_redirected_to user_block_path(block)
+    assert_equal "Block updated.", flash[:notice]
+    block.reload
+    assert_predicate block, :active?
+    assert_equal "Updated Reason 2", block.reason
+  end
+
   ##
   # test the revoke action
   def test_revoke