]> git.openstreetmap.org Git - rails.git/commitdiff
Merge remote-tracking branch 'upstream/pull/5069'
authorTom Hughes <tom@compton.nu>
Wed, 21 Aug 2024 18:04:06 +0000 (19:04 +0100)
committerTom Hughes <tom@compton.nu>
Wed, 21 Aug 2024 18:04:06 +0000 (19:04 +0100)
1  2 
app/controllers/user_blocks_controller.rb
test/controllers/user_blocks_controller_test.rb

index ae6e3c1cd5f4f3b7fc26646cd8ae346ebdb75cb1,73c6ccd69e1b73da6003217449d4dd0f71c7528d..71a0b4c31582a09a5d4687ba5e9a74207b59b216
@@@ -26,6 -26,7 +26,7 @@@ class UserBlocksController < Applicatio
    def show
      if current_user && current_user == @user_block.user
        @user_block.needs_view = false
+       @user_block.deactivates_at = [@user_block.ends_at, Time.now.utc].max
        @user_block.save!
      end
    end
@@@ -49,6 -50,7 +50,7 @@@
          :ends_at => now + @block_period.hours,
          :needs_view => params[:user_block][:needs_view]
        )
+       @user_block.deactivates_at = @user_block.ends_at unless @user_block.needs_view
  
        if @user_block.save
          flash[:notice] = t(".flash", :name => @user.display_name)
          @user_block.reason = params[:user_block][:reason]
          @user_block.needs_view = params[:user_block][:needs_view]
          @user_block.ends_at = Time.now.utc + @block_period.hours
+         @user_block.deactivates_at = (@user_block.ends_at unless @user_block.needs_view)
 +        @user_block.revoker = current_user if user_block_was_active && !@user_block.active?
          if !user_block_was_active && @user_block.active?
            flash.now[:error] = t(".inactive_block_cannot_be_reactivated")
            render :action => "edit"
          else
-           @user_block.ends_at = @user_block.ends_at_was unless user_block_was_active
+           unless user_block_was_active
+             @user_block.ends_at = @user_block.ends_at_was
+             @user_block.deactivates_at = @user_block.deactivates_at_was
+             @user_block.deactivates_at = [@user_block.ends_at, @user_block.updated_at].max unless @user_block.deactivates_at # take updated_at into account before deactivates_at is backfilled
+           end
            if @user_block.save
              flash[:notice] = t(".success")
              redirect_to @user_block
index 696d3c8d04fb3400fcda186289a4dce30c6d4a95,3d96199f397f56e705eb6ca058ae6f3d4fad5c20..a3926cff0785fe32b0254212f675f971be340c35
@@@ -493,28 -493,6 +493,28 @@@ class UserBlocksControllerTest < Action
      check_inactive_block_updates(block)
    end
  
 +  ##
 +  # test the update action revoking the block
 +  def test_revoke_using_update
 +    moderator_user = create(:moderator_user)
 +    block = create(:user_block, :creator => moderator_user)
 +
 +    session_for(moderator_user)
 +    put user_block_path(block,
 +                        :user_block_period => "24",
 +                        :user_block => { :needs_view => false, :reason => "Updated Reason" })
 +    block.reload
 +    assert_predicate block, :active?
 +    assert_nil block.revoker
 +
 +    put user_block_path(block,
 +                        :user_block_period => "0",
 +                        :user_block => { :needs_view => false, :reason => "Updated Reason" })
 +    block.reload
 +    assert_not_predicate block, :active?
 +    assert_equal moderator_user, block.revoker
 +  end
 +
    ##
    # test the revoke action
    def test_revoke
      assert_not_equal moderator_user, expired_block1.revoker
    end
  
+   ##
+   # test changes to end/deactivation dates
+   def test_dates_when_viewed_before_end
+     blocked_user = create(:user)
+     moderator_user = create(:moderator_user)
+     freeze_time do
+       session_for(moderator_user)
+       assert_difference "UserBlock.count", 1 do
+         post user_blocks_path(:display_name => blocked_user.display_name,
+                               :user_block_period => "48",
+                               :user_block => { :needs_view => true, :reason => "Testing deactivates_at" })
+       end
+       block = UserBlock.last
+       assert_equal Time.now.utc + 2.days, block.ends_at
+       assert_nil block.deactivates_at
+       travel 1.day
+       session_for(blocked_user)
+       get user_block_path(block)
+       block.reload
+       assert_equal Time.now.utc + 1.day, block.ends_at
+       assert_equal Time.now.utc + 1.day, block.deactivates_at
+     end
+   end
+   def test_dates_when_viewed_after_end
+     blocked_user = create(:user)
+     moderator_user = create(:moderator_user)
+     freeze_time do
+       session_for(moderator_user)
+       assert_difference "UserBlock.count", 1 do
+         post user_blocks_path(:display_name => blocked_user.display_name,
+                               :user_block_period => "24",
+                               :user_block => { :needs_view => true, :reason => "Testing deactivates_at" })
+       end
+       block = UserBlock.last
+       assert_equal Time.now.utc + 1.day, block.ends_at
+       assert_nil block.deactivates_at
+       travel 2.days
+       session_for(blocked_user)
+       get user_block_path(block)
+       block.reload
+       assert_equal Time.now.utc - 1.day, block.ends_at
+       assert_equal Time.now.utc, block.deactivates_at
+     end
+   end
+   def test_dates_when_edited_before_end
+     blocked_user = create(:user)
+     moderator_user = create(:moderator_user)
+     freeze_time do
+       session_for(moderator_user)
+       assert_difference "UserBlock.count", 1 do
+         post user_blocks_path(:display_name => blocked_user.display_name,
+                               :user_block_period => "48",
+                               :user_block => { :needs_view => false, :reason => "Testing deactivates_at" })
+       end
+       block = UserBlock.last
+       assert_equal Time.now.utc + 2.days, block.ends_at
+       assert_equal Time.now.utc + 2.days, block.deactivates_at
+       travel 1.day
+       put user_block_path(block,
+                           :user_block_period => "48",
+                           :user_block => { :needs_view => false, :reason => "Testing deactivates_at updated" })
+       block.reload
+       assert_equal Time.now.utc + 2.days, block.ends_at
+       assert_equal Time.now.utc + 2.days, block.deactivates_at
+     end
+   end
+   def test_dates_when_edited_after_end
+     blocked_user = create(:user)
+     moderator_user = create(:moderator_user)
+     freeze_time do
+       session_for(moderator_user)
+       assert_difference "UserBlock.count", 1 do
+         post user_blocks_path(:display_name => blocked_user.display_name,
+                               :user_block_period => "24",
+                               :user_block => { :needs_view => false, :reason => "Testing deactivates_at" })
+       end
+       block = UserBlock.last
+       assert_equal Time.now.utc + 1.day, block.ends_at
+       assert_equal Time.now.utc + 1.day, block.deactivates_at
+       travel 2.days
+       put user_block_path(block,
+                           :user_block_period => "0",
+                           :user_block => { :needs_view => false, :reason => "Testing deactivates_at updated" })
+       block.reload
+       assert_equal Time.now.utc - 1.day, block.ends_at
+       assert_equal Time.now.utc - 1.day, block.deactivates_at
+     end
+   end
+   ##
+   # test updates on legacy records without correctly initialized deactivates_at
+   def test_update_legacy_deactivates_at
+     blocked_user = create(:user)
+     moderator_user = create(:moderator_user)
+     freeze_time do
+       block = UserBlock.new :user => blocked_user,
+                             :creator => moderator_user,
+                             :reason => "because",
+                             :ends_at => Time.now.utc + 1.day,
+                             :needs_view => false
+       assert_difference "UserBlock.count", 1 do
+         block.save :validate => false
+       end
+       travel 2.days
+       session_for(moderator_user)
+       put user_block_path(block,
+                           :user_block_period => "0",
+                           :user_block => { :needs_view => false, :reason => "Testing legacy block update" })
+       block.reload
+       assert_equal Time.now.utc - 1.day, block.ends_at
+       assert_equal Time.now.utc - 1.day, block.deactivates_at
+     end
+   end
    ##
    # test the blocks_on action
    def test_blocks_on