Squish username before validation (#10239)

* Squish username before validation (#10101)

Fix #10101

* Move before_validation hook to a private method

Also add Unicode wite-spaces to the spec to support the use of squish
over strip.
This commit is contained in:
Aurélien Reeves 2019-03-11 20:48:24 +01:00 committed by Eugen Rochko
parent f5eeac0104
commit 85537b0069
2 changed files with 10 additions and 0 deletions

View File

@ -472,6 +472,7 @@ class Account < ApplicationRecord
before_create :generate_keys before_create :generate_keys
before_validation :prepare_contents, if: :local? before_validation :prepare_contents, if: :local?
before_validation :prepare_username, on: :create
before_destroy :clean_feed_manager before_destroy :clean_feed_manager
private private
@ -481,6 +482,10 @@ class Account < ApplicationRecord
note&.strip! note&.strip!
end end
def prepare_username
username&.squish!
end
def generate_keys def generate_keys
return unless local? && !Rails.env.test? return unless local? && !Rails.env.test?

View File

@ -558,6 +558,11 @@ 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 'squishes the username before validation' do
account = Fabricate(:account, domain: nil, username: " \u3000bob \t \u00a0 \n ")
expect(account.username).to eq 'bob'
end
context 'when is local' do context 'when is local' do
it 'is invalid if the username is not unique in case-insensitive comparison among local accounts' do it 'is invalid if the username is not unique in case-insensitive comparison among local accounts' do
account_1 = Fabricate(:account, username: 'the_doctor') account_1 = Fabricate(:account, username: 'the_doctor')