Browse Source

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
closed-social-glitch-2
Eugen Rochko 6 years ago
committed by Matt Jankowski
parent
commit
c207b4bb33
5 changed files with 23 additions and 6 deletions
  1. +8
    -4
      app/models/account.rb
  2. +1
    -1
      app/models/user.rb
  3. +2
    -1
      db/seeds.rb
  4. +6
    -0
      spec/models/account_spec.rb
  5. +6
    -0
      spec/models/user_spec.rb

+ 8
- 4
app/models/account.rb 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 :display_name, length: { maximum: 30 }
validates :note, length: { maximum: 160 }
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 }, if: :display_name_changed?
validates :note, length: { maximum: 160 }, if: :note_changed?
end end
# Timelines # Timelines

+ 1
- 1
app/models/user.rb 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) }

+ 2
- 1
db/seeds.rb 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

+ 6
- 0
spec/models/account_spec.rb 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')

+ 6
- 0
spec/models/user_spec.rb 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?

Loading…
Cancel
Save