diff --git a/config/site_settings.yml b/config/site_settings.yml index b23589aa427..62c47d2cd25 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -117,6 +117,7 @@ basic: default: "latest|new|unread|top|categories" regex: "latest" regex_error: "site_settings.errors.must_include_latest" + validator: RegexPresenceValidator choices: - latest - new diff --git a/lib/validators/regex_presence_validator.rb b/lib/validators/regex_presence_validator.rb new file mode 100644 index 00000000000..fcdeb4ddadc --- /dev/null +++ b/lib/validators/regex_presence_validator.rb @@ -0,0 +1,16 @@ +class RegexPresenceValidator + include RegexSettingValidation + + def initialize(opts = {}) + @opts = opts + initialize_regex_opts(opts) + end + + def valid_value?(val) + val.present? && regex_match?(val) + end + + def error_message + I18n.t(@regex_error) + end +end diff --git a/spec/components/validators/regex_presence_validator_spec.rb b/spec/components/validators/regex_presence_validator_spec.rb new file mode 100644 index 00000000000..819269e155f --- /dev/null +++ b/spec/components/validators/regex_presence_validator_spec.rb @@ -0,0 +1,31 @@ +require "rails_helper" + +RSpec.describe RegexPresenceValidator do + subject { described_class.new(regex: 'latest', regex_error: 'site_settings.errors.must_include_latest') } + + describe "#valid_value?" do + describe "when value is present" do + it "without regex match" do + expect(subject.valid_value?("categories|new")).to eq(false) + + expect(subject.error_message).to eq(I18n.t( + "site_settings.errors.must_include_latest" + )) + end + + it "with regex match" do + expect(subject.valid_value?("latest|categories")).to eq(true) + end + end + + describe "when value is empty" do + it "should not be valid" do + expect(subject.valid_value?("")).to eq(false) + + expect(subject.error_message).to eq(I18n.t( + "site_settings.errors.must_include_latest" + )) + end + end + end +end