Skip to content

Commit

Permalink
Use normalizes to prepare Webhook#events value (mastodon#27605)
Browse files Browse the repository at this point in the history
  • Loading branch information
mjankowski authored and vmstan committed Jan 5, 2024
1 parent aaa138c commit b8ca9fd
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 8 deletions.
16 changes: 8 additions & 8 deletions app/models/webhook.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,11 @@ class Webhook < ApplicationRecord
validates :secret, presence: true, length: { minimum: 12 }
validates :events, presence: true

validate :validate_events
validate :events_validation_error, if: :invalid_events?
validate :validate_permissions
validate :validate_template

before_validation :strip_events
normalizes :events, with: ->(events) { events.filter_map { |event| event.strip.presence } }
before_validation :generate_secret

def rotate_secret!
Expand Down Expand Up @@ -69,8 +69,12 @@ def self.permission_for_event(event)

private

def validate_events
errors.add(:events, :invalid) if events.any? { |e| EVENTS.exclude?(e) }
def events_validation_error
errors.add(:events, :invalid)
end

def invalid_events?
events.blank? || events.difference(EVENTS).any?
end

def validate_permissions
Expand All @@ -88,10 +92,6 @@ def validate_template
end
end

def strip_events
self.events = events.filter_map { |str| str.strip.presence } if events.present?
end

def generate_secret
self.secret = SecureRandom.hex(20) if secret.blank?
end
Expand Down
31 changes: 31 additions & 0 deletions spec/models/webhook_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,37 @@
RSpec.describe Webhook do
let(:webhook) { Fabricate(:webhook) }

describe 'Validations' do
it 'requires presence of events' do
record = described_class.new(events: nil)
record.valid?

expect(record).to model_have_error_on_field(:events)
end

it 'requires non-empty events value' do
record = described_class.new(events: [])
record.valid?

expect(record).to model_have_error_on_field(:events)
end

it 'requires valid events value from EVENTS' do
record = described_class.new(events: ['account.invalid'])
record.valid?

expect(record).to model_have_error_on_field(:events)
end
end

describe 'Normalizations' do
it 'cleans up events values' do
record = described_class.new(events: ['account.approved', 'account.created ', ''])

expect(record.events).to eq(%w(account.approved account.created))
end
end

describe '#rotate_secret!' do
it 'changes the secret' do
previous_value = webhook.secret
Expand Down

0 comments on commit b8ca9fd

Please sign in to comment.