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:
Eugen Rochko 2017-06-08 15:22:01 +02:00 committed by Matt Jankowski
parent b87eb8ea14
commit c207b4bb33
5 changed files with 23 additions and 6 deletions

View file

@ -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

View file

@ -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) }

View file

@ -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

View file

@ -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')

View file

@ -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?