allow regex options on username site settings

This commit is contained in:
Neil Lalonde 2017-10-04 15:08:51 -04:00
parent c29334cf23
commit ddbd1d5ab8
4 changed files with 53 additions and 10 deletions

View File

@ -0,0 +1,17 @@
module RegexSettingValidation
def initialize_regex_opts(opts = {})
@regex = Regexp.new(opts[:regex]) if opts[:regex]
@regex_error = opts[:regex_error] || 'site_settings.errors.regex_mismatch'
end
def regex_match?(val)
if @regex && !(val =~ @regex)
@regex_fail = true
return false
end
true
end
end

View File

@ -1,8 +1,10 @@
class StringSettingValidator
include RegexSettingValidation
def initialize(opts = {})
@opts = opts
@regex = Regexp.new(opts[:regex]) if opts[:regex]
@regex_error = opts[:regex_error] || 'site_settings.errors.regex_mismatch'
initialize_regex_opts(opts)
end
def valid_value?(val)
@ -13,12 +15,7 @@ class StringSettingValidator
return false
end
if @regex && !(val =~ @regex)
@regex_fail = true
return false
end
true
regex_match?(val)
end
def error_message

View File

@ -1,13 +1,21 @@
class UsernameSettingValidator
include RegexSettingValidation
def initialize(opts = {})
@opts = opts
initialize_regex_opts(opts)
end
def valid_value?(val)
!val.present? || User.where(username: val).exists?
!val.present? || (User.where(username: val).exists? && regex_match?(val))
end
def error_message
I18n.t('site_settings.errors.invalid_username')
if @regex_fail
I18n.t(@regex_error)
else
I18n.t('site_settings.errors.invalid_username')
end
end
end

View File

@ -17,5 +17,26 @@ describe UsernameSettingValidator do
it "returns false if value does not match a user's username" do
expect(validator.valid_value?('no way')).to eq(false)
end
context "regex support" do
let!(:darthvader) { Fabricate(:user, username: 'darthvader') }
let!(:luke) { Fabricate(:user, username: 'luke') }
it "returns false if regex doesn't match" do
v = described_class.new(regex: 'darth')
expect(v.valid_value?('luke')).to eq(false)
expect(v.valid_value?('vader')).to eq(false)
end
it "returns true if regex matches" do
v = described_class.new(regex: 'darth')
expect(v.valid_value?('darthvader')).to eq(true)
end
it "returns false if regex matches but username doesn't match a user" do
v = described_class.new(regex: 'darth')
expect(v.valid_value?('darthmaul')).to eq(false)
end
end
end
end