+ assert_select "h1 a[href='#{user_path blocked_user}']", :text => blocked_user.display_name
+ 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_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 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 + 48.hours, block.ends_at
+ assert_nil block.deactivates_at
+
+ travel 24.hours
+ session_for(blocked_user)
+ get user_block_path(block)
+ block.reload
+ assert_equal Time.now.utc + 24.hours, block.ends_at
+ assert_equal Time.now.utc + 24.hours, 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 + 24.hours, block.ends_at
+ assert_nil block.deactivates_at
+
+ travel 48.hours
+ session_for(blocked_user)
+ get user_block_path(block)
+ block.reload
+ assert_equal Time.now.utc - 24.hours, 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 + 48.hours, block.ends_at
+ assert_equal Time.now.utc + 48.hours, block.deactivates_at
+
+ travel 24.hours
+ 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 + 48.hours, block.ends_at
+ assert_equal Time.now.utc + 48.hours, 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 + 24.hours, block.ends_at
+ assert_equal Time.now.utc + 24.hours, block.deactivates_at
+
+ travel 48.hours
+ 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 - 24.hours, block.ends_at
+ assert_equal Time.now.utc - 24.hours, 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 + 24.hours,
+ :needs_view => false
+
+ assert_difference "UserBlock.count", 1 do
+ block.save :validate => false
+ end
+
+ travel 48.hours
+ 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 - 24.hours, block.ends_at
+ assert_equal Time.now.utc - 24.hours, block.deactivates_at
+ end