Add AccountWarning#appeal_eligible? method (#33526)

This commit is contained in:
Matt Jankowski 2025-01-09 10:08:39 -05:00 committed by GitHub
parent 3a4aed9890
commit 54e2030146
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 24 additions and 7 deletions

View file

@ -27,6 +27,7 @@ class AccountWarning < ApplicationRecord
suspend: 4_000, suspend: 4_000,
}, suffix: :action }, suffix: :action
APPEAL_WINDOW = 20.days
RECENT_PERIOD = 3.months.freeze RECENT_PERIOD = 3.months.freeze
normalizes :text, with: ->(text) { text.to_s }, apply_to_nil: true normalizes :text, with: ->(text) { text.to_s }, apply_to_nil: true
@ -49,6 +50,10 @@ class AccountWarning < ApplicationRecord
overruled_at.present? overruled_at.present?
end end
def appeal_eligible?
created_at >= APPEAL_WINDOW.ago
end
def to_log_human_identifier def to_log_human_identifier
target_account.acct target_account.acct
end end

View file

@ -16,8 +16,6 @@
# updated_at :datetime not null # updated_at :datetime not null
# #
class Appeal < ApplicationRecord class Appeal < ApplicationRecord
MAX_STRIKE_AGE = 20.days
TEXT_LENGTH_LIMIT = 2_000 TEXT_LENGTH_LIMIT = 2_000
belongs_to :account belongs_to :account
@ -68,6 +66,6 @@ class Appeal < ApplicationRecord
private private
def validate_time_frame def validate_time_frame
errors.add(:base, I18n.t('strikes.errors.too_late')) if strike.created_at < MAX_STRIKE_AGE.ago errors.add(:base, I18n.t('strikes.errors.too_late')) unless strike.appeal_eligible?
end end
end end

View file

@ -6,7 +6,7 @@ class AccountWarningPolicy < ApplicationPolicy
end end
def appeal? def appeal?
target? && record.created_at >= Appeal::MAX_STRIKE_AGE.ago target? && record.appeal_eligible?
end end
private private

View file

@ -8,4 +8,18 @@ RSpec.describe AccountWarning do
it { is_expected.to normalize(:text).from(nil).to('') } it { is_expected.to normalize(:text).from(nil).to('') }
end end
end end
describe '#appeal_eligible?' do
context 'when created too long ago' do
subject { Fabricate.build :account_warning, created_at: (described_class::APPEAL_WINDOW * 2).ago }
it { is_expected.to_not be_appeal_eligible }
end
context 'when created recently' do
subject { Fabricate.build :account_warning, created_at: (described_class::APPEAL_WINDOW - 2.days).ago }
it { is_expected.to be_appeal_eligible }
end
end
end end

View file

@ -9,7 +9,7 @@ RSpec.describe Appeal do
it { is_expected.to validate_length_of(:text).is_at_most(described_class::TEXT_LENGTH_LIMIT) } it { is_expected.to validate_length_of(:text).is_at_most(described_class::TEXT_LENGTH_LIMIT) }
context 'with a strike created too long ago' do context 'with a strike created too long ago' do
let(:strike) { Fabricate.build :account_warning, created_at: (described_class::MAX_STRIKE_AGE * 2).ago } let(:strike) { Fabricate.build :account_warning, created_at: (AccountWarning::APPEAL_WINDOW * 2).ago }
it { is_expected.to_not allow_values(strike).for(:strike).against(:base).on(:create) } it { is_expected.to_not allow_values(strike).for(:strike).against(:base).on(:create) }
end end

View file

@ -31,11 +31,11 @@ RSpec.describe AccountWarningPolicy do
context 'when account is target' do context 'when account is target' do
context 'when record is appealable' do context 'when record is appealable' do
it { is_expected.to permit(account, AccountWarning.new(target_account_id: account.id, created_at: Appeal::MAX_STRIKE_AGE.ago + 1.hour)) } it { is_expected.to permit(account, AccountWarning.new(target_account_id: account.id, created_at: AccountWarning::APPEAL_WINDOW.ago + 1.hour)) }
end end
context 'when record is not appealable' do context 'when record is not appealable' do
it { is_expected.to_not permit(account, AccountWarning.new(target_account_id: account.id, created_at: Appeal::MAX_STRIKE_AGE.ago - 1.hour)) } it { is_expected.to_not permit(account, AccountWarning.new(target_account_id: account.id, created_at: AccountWarning::APPEAL_WINDOW.ago - 1.hour)) }
end end
end end
end end