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
master
Eugen Rochko 8 years ago committed by Matt Jankowski
parent b87eb8ea14
commit c207b4bb33
  1. 12
      app/models/account.rb
  2. 2
      app/models/user.rb
  3. 3
      db/seeds.rb
  4. 6
      spec/models/account_spec.rb
  5. 6
      spec/models/user_spec.rb

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

Loading…
Cancel
Save