class BlacklistedEmailValidator < ActiveModel::Validator
def validate(user)
- user.errors.add(:email, I18n.t('users.invalid_email')) if blocked_email?(user.email)
+ @email = user.email
+ user.errors.add(:email, I18n.t('users.invalid_email')) if blocked_email?
end
private
- def blocked_email?(value)
- on_blacklist?(value) || not_on_whitelist?(value)
+ def blocked_email?
+ on_blacklist? || not_on_whitelist?
end
- def on_blacklist?(value)
- return true if EmailDomainBlock.block?(value)
+ def on_blacklist?
+ return true if EmailDomainBlock.block?(@email)
return false if Rails.configuration.x.email_domains_blacklist.blank?
domains = Rails.configuration.x.email_domains_blacklist.gsub('.', '\.')
regexp = Regexp.new("@(.+\\.)?(#{domains})", true)
- value =~ regexp
+ @email =~ regexp
end
- def not_on_whitelist?(value)
+ def not_on_whitelist?
return false if Rails.configuration.x.email_domains_whitelist.blank?
domains = Rails.configuration.x.email_domains_whitelist.gsub('.', '\.')
regexp = Regexp.new("@(.+\\.)?(#{domains})$", true)
- value !~ regexp
+ @email !~ regexp
end
end
--- /dev/null
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe BlacklistedEmailValidator, type: :validator do
+ describe '#validate' do
+ let(:user) { double(email: 'info@mail.com', errors: errors) }
+ let(:errors) { double(add: nil) }
+
+ before do
+ allow_any_instance_of(described_class).to receive(:blocked_email?) { blocked_email }
+ described_class.new.validate(user)
+ end
+
+ context 'blocked_email?' do
+ let(:blocked_email) { true }
+
+ it 'calls errors.add' do
+ expect(errors).to have_received(:add).with(:email, I18n.t('users.invalid_email'))
+ end
+ end
+
+ context '!blocked_email?' do
+ let(:blocked_email) { false }
+
+ it 'not calls errors.add' do
+ expect(errors).not_to have_received(:add).with(:email, I18n.t('users.invalid_email'))
+ end
+ end
+ end
+end