Fix db:seed - only run some validations when the field was changed (#3592)
* Fix db:seed - only run some validations when the field was changed * Add tests
This commit is contained in:
		
				
					committed by
					
						
						Matt Jankowski
					
				
			
			
				
	
			
			
			
						parent
						
							b87eb8ea14
						
					
				
				
					commit
					c207b4bb33
				
			@@ -52,13 +52,17 @@ class Account < ApplicationRecord
 | 
				
			|||||||
  has_one :user, inverse_of: :account
 | 
					  has_one :user, inverse_of: :account
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  validates :username, presence: true
 | 
					  validates :username, presence: true
 | 
				
			||||||
  validates :username, uniqueness: { scope: :domain, case_sensitive: true }, unless: :local?
 | 
					
 | 
				
			||||||
 | 
					  # Remote user validations
 | 
				
			||||||
 | 
					  with_options unless: :local? do
 | 
				
			||||||
 | 
					    validates :username, uniqueness: { scope: :domain, case_sensitive: true }, if: :username_changed?
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Local user validations
 | 
					  # Local user validations
 | 
				
			||||||
  with_options if: :local? do
 | 
					  with_options if: :local? do
 | 
				
			||||||
    validates :username, format: { with: /\A[a-z0-9_]+\z/i }, uniqueness: { scope: :domain, case_sensitive: false }, length: { maximum: 30 }, unreserved: true
 | 
					    validates :username, format: { with: /\A[a-z0-9_]+\z/i }, uniqueness: { scope: :domain, case_sensitive: false }, length: { maximum: 30 }, unreserved: true, if: :username_changed?
 | 
				
			||||||
    validates :display_name, length: { maximum: 30 }
 | 
					    validates :display_name, length: { maximum: 30 }, if: :display_name_changed?
 | 
				
			||||||
    validates :note, length: { maximum: 160 }
 | 
					    validates :note, length: { maximum: 160 }, if: :note_changed?
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Timelines
 | 
					  # Timelines
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,7 +47,7 @@ class User < ApplicationRecord
 | 
				
			|||||||
  accepts_nested_attributes_for :account
 | 
					  accepts_nested_attributes_for :account
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  validates :locale, inclusion: I18n.available_locales.map(&:to_s), if: :locale?
 | 
					  validates :locale, inclusion: I18n.available_locales.map(&:to_s), if: :locale?
 | 
				
			||||||
  validates :email, email: true
 | 
					  validates :email, email: true, if: :email_changed?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  scope :recent,    -> { order(id: :desc) }
 | 
					  scope :recent,    -> { order(id: :desc) }
 | 
				
			||||||
  scope :admins,    -> { where(admin: true) }
 | 
					  scope :admins,    -> { where(admin: true) }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,7 @@ Doorkeeper::Application.create!(name: 'Web', superapp: true, redirect_uri: Doork
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
if Rails.env.development?
 | 
					if Rails.env.development?
 | 
				
			||||||
  domain = ENV['LOCAL_DOMAIN'] || Rails.configuration.x.local_domain
 | 
					  domain = ENV['LOCAL_DOMAIN'] || Rails.configuration.x.local_domain
 | 
				
			||||||
  admin  = Account.where(username: 'admin').first_or_create!(username: 'admin')
 | 
					  admin  = Account.where(username: 'admin').first_or_initialize(username: 'admin')
 | 
				
			||||||
 | 
					  admin.save(validate: false)
 | 
				
			||||||
  User.where(email: "admin@#{domain}").first_or_initialize(email: "admin@#{domain}", password: 'mastodonadmin', password_confirmation: 'mastodonadmin', confirmed_at: Time.now.utc, admin: true, account: admin).save!
 | 
					  User.where(email: "admin@#{domain}").first_or_initialize(email: "admin@#{domain}", password: 'mastodonadmin', password_confirmation: 'mastodonadmin', confirmed_at: Time.now.utc, admin: true, account: admin).save!
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -387,6 +387,12 @@ RSpec.describe Account, type: :model do
 | 
				
			|||||||
      expect(account).to model_have_error_on_field(:username)
 | 
					      expect(account).to model_have_error_on_field(:username)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'is valid when username is reserved but record has already been created' do
 | 
				
			||||||
 | 
					      account = Fabricate.build(:account, username: 'support')
 | 
				
			||||||
 | 
					      account.save(validate: false)
 | 
				
			||||||
 | 
					      expect(account.valid?).to be true
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    context 'when is local' do
 | 
					    context 'when is local' do
 | 
				
			||||||
      it 'is invalid if the username doesn\'t only contains letters, numbers and underscores' do
 | 
					      it 'is invalid if the username doesn\'t only contains letters, numbers and underscores' do
 | 
				
			||||||
        account = Fabricate.build(:account, username: 'the-doctor')
 | 
					        account = Fabricate.build(:account, username: 'the-doctor')
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,12 @@ RSpec.describe User, type: :model do
 | 
				
			|||||||
      expect(user).to model_have_error_on_field(:email)
 | 
					      expect(user).to model_have_error_on_field(:email)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'is valid with an invalid e-mail that has already been saved' do
 | 
				
			||||||
 | 
					      user = Fabricate.build(:user, email: 'invalid-email')
 | 
				
			||||||
 | 
					      user.save(validate: false)
 | 
				
			||||||
 | 
					      expect(user.valid?).to be true
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'cleans out empty string from languages' do
 | 
					    it 'cleans out empty string from languages' do
 | 
				
			||||||
      user = Fabricate.build(:user, filtered_languages: [''])
 | 
					      user = Fabricate.build(:user, filtered_languages: [''])
 | 
				
			||||||
      user.valid?
 | 
					      user.valid?
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user