From 479a09f77b8fb79a87bd2dc12326f608f75de70c Mon Sep 17 00:00:00 2001 From: Daniel M Brasil Date: Thu, 26 Oct 2023 14:08:11 -0300 Subject: [PATCH] Improve organizations's slug validator (#20265) --- app/validators/cross_model_slug_validator.rb | 4 +++- spec/models/organization_spec.rb | 5 +++++ .../cross_model_slug_validator_spec.rb | 16 ++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/app/validators/cross_model_slug_validator.rb b/app/validators/cross_model_slug_validator.rb index 6eac98515..c8c5aaa66 100644 --- a/app/validators/cross_model_slug_validator.rb +++ b/app/validators/cross_model_slug_validator.rb @@ -2,6 +2,7 @@ # Validates if the give attribute is used across the reserved spaces. class CrossModelSlugValidator < ActiveModel::EachValidator FORMAT_REGEX = /\A[0-9a-z\-_]+\z/ + ORGANIZATION_FORMAT_REGEX = /\A(?![0-9]+\z)[0-9a-z\-_]+\z/ def validate_each(record, attribute, value) return if value.blank? @@ -20,7 +21,8 @@ class CrossModelSlugValidator < ActiveModel::EachValidator end def correct_format?(record, attribute, value) - return false if value.match?(FORMAT_REGEX) + format_regex = record.is_a?(Organization) ? ORGANIZATION_FORMAT_REGEX : FORMAT_REGEX + return false if value.match?(format_regex) record.errors.add(attribute, I18n.t("validators.cross_model_slug_validator.is_invalid")) end diff --git a/spec/models/organization_spec.rb b/spec/models/organization_spec.rb index cdce56922..0c0e30cff 100644 --- a/spec/models/organization_spec.rb +++ b/spec/models/organization_spec.rb @@ -52,6 +52,11 @@ RSpec.describe Organization do it { is_expected.to allow_value("#abc").for(:text_color_hex) } it { is_expected.not_to allow_value("3.0").for(:company_size) } it { is_expected.to allow_value("3").for(:company_size) } + + it { is_expected.to allow_value("1345abc").for(:slug) } + it { is_expected.to allow_value("just_non_digit_characters").for(:slug) } + it { is_expected.to allow_value("123_4").for(:slug) } + it { is_expected.not_to allow_value("1234").for(:slug) } end end diff --git a/spec/validators/cross_model_slug_validator_spec.rb b/spec/validators/cross_model_slug_validator_spec.rb index 1a75c8c4b..1469fb5ff 100644 --- a/spec/validators/cross_model_slug_validator_spec.rb +++ b/spec/validators/cross_model_slug_validator_spec.rb @@ -80,4 +80,20 @@ RSpec.describe CrossModelSlugValidator do it { is_expected.to be_valid } end + + context "when organization's slug consists of only digits" do + let(:organization) { build(:organization, slug: "1337") } + + it "is invalid" do + expect(organization).not_to be_valid + end + end + + context "when organization's slug contains at least one non-digit character" do + let(:organization) { build(:organization, slug: "1234a") } + + it "is valid" do + expect(organization).to be_valid + end + end end