]> git.openstreetmap.org Git - rails.git/commitdiff
Move change detection to validation declaration
authorAndy Allan <git@gravitystorm.co.uk>
Thu, 18 Jan 2024 10:29:56 +0000 (10:29 +0000)
committerAndy Allan <git@gravitystorm.co.uk>
Thu, 18 Jan 2024 10:33:56 +0000 (10:33 +0000)
This aligns with other validations. Also add test to ensure unchanged
display_names are treated as valid.

app/models/user.rb
test/models/user_test.rb

index 8a471586af020cb3217386d8ebc4527eed655b2a..d0993f7ee2c2e287399a369d0230532de1a01f17 100644 (file)
@@ -99,7 +99,7 @@ class User < ApplicationRecord
   validates :display_name, :if => proc { |u| u.display_name_changed? },
                            :characters => { :url_safe => true },
                            :whitespace => { :leading => false, :trailing => false }
   validates :display_name, :if => proc { |u| u.display_name_changed? },
                            :characters => { :url_safe => true },
                            :whitespace => { :leading => false, :trailing => false }
-  validate :display_name_cannot_be_user_id_with_other_id
+  validate :display_name_cannot_be_user_id_with_other_id, :if => proc { |u| u.display_name_changed? }
   validates :email, :presence => true, :confirmation => true, :characters => true
   validates :email, :if => proc { |u| u.email_changed? },
                     :uniqueness => { :case_sensitive => false }
   validates :email, :presence => true, :confirmation => true, :characters => true
   validates :email, :if => proc { |u| u.email_changed? },
                     :uniqueness => { :case_sensitive => false }
@@ -126,7 +126,7 @@ class User < ApplicationRecord
   after_save :spam_check
 
   def display_name_cannot_be_user_id_with_other_id
   after_save :spam_check
 
   def display_name_cannot_be_user_id_with_other_id
-    display_name_changed? && display_name&.match(/^user_(\d+)$/i) do |m|
+    display_name&.match(/^user_(\d+)$/i) do |m|
       errors.add :display_name, I18n.t("activerecord.errors.messages.display_name_is_user_n") unless m[1].to_i == id
     end
   end
       errors.add :display_name, I18n.t("activerecord.errors.messages.display_name_is_user_n") unless m[1].to_i == id
     end
   end
index c2571d0c0aaf785e64a522e98571af267ecc27bd..37f66e178b0f53401da63d90022ee0679d86fb2d 100644 (file)
@@ -113,6 +113,14 @@ class UserTest < ActiveSupport::TestCase
     assert_predicate user, :valid?, "user_<id> name is invalid for own id, when it should be"
   end
 
     assert_predicate user, :valid?, "user_<id> name is invalid for own id, when it should be"
   end
 
+  def test_display_name_user_id_unchanged_is_valid
+    user = build(:user, :display_name => "user_0")
+    user.save(:validate => false)
+    user.reload
+
+    assert_predicate user, :valid?, "user_0 display_name is invalid but it hasn't been changed"
+  end
+
   def test_friends_with
     alice = create(:user, :active)
     bob = create(:user, :active)
   def test_friends_with
     alice = create(:user, :active)
     bob = create(:user, :active)