From b7de632d6cfedf6202a289b95b864461e0f11fdb Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Wed, 28 Feb 2018 16:23:50 +0100 Subject: [PATCH] [Fix #1479] Create a sanitize email concern --- .../concerns/email_sanitizable_concern.rb | 10 ++++ .../concern/email_sanitizable_concern_spec.rb | 51 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 app/models/concerns/email_sanitizable_concern.rb create mode 100644 spec/models/concern/email_sanitizable_concern_spec.rb diff --git a/app/models/concerns/email_sanitizable_concern.rb b/app/models/concerns/email_sanitizable_concern.rb new file mode 100644 index 000000000..d6c715815 --- /dev/null +++ b/app/models/concerns/email_sanitizable_concern.rb @@ -0,0 +1,10 @@ +module EmailSanitizableConcern + extend ActiveSupport::Concern + + def sanitize_email(attribute) + value_to_sanitize = self.send(attribute) + if value_to_sanitize.present? + self[attribute] = value_to_sanitize.gsub(/[[:space:]]/, ' ').strip.downcase + end + end +end diff --git a/spec/models/concern/email_sanitizable_concern_spec.rb b/spec/models/concern/email_sanitizable_concern_spec.rb new file mode 100644 index 000000000..7b98b7d82 --- /dev/null +++ b/spec/models/concern/email_sanitizable_concern_spec.rb @@ -0,0 +1,51 @@ +describe EmailSanitizableConcern, type: :model do + describe 'sanitize_email' do + let(:email_concern) do + (Class.new do + include EmailSanitizableConcern + attr_accessor :email + + def initialize(email) + self.email = email + end + + def [](key) + self.send(key) + end + + def []=(key, value) + self.send("#{key}=", value) + end + end).new(email) + end + + before do + email_concern.sanitize_email(:email) + end + + context 'on an empty email' do + let(:email) { '' } + it { expect(email_concern.email).to eq('') } + end + + context 'on a valid email' do + let(:email) { 'michel@toto.fr' } + it { expect(email_concern.email).to eq('michel@toto.fr') } + end + + context 'on an email with trailing spaces' do + let(:email) { ' michel@toto.fr ' } + it { expect(email_concern.email).to eq('michel@toto.fr') } + end + + context 'on an email with trailing nbsp' do + let(:email) { ' michel@toto.fr  ' } + it { expect(email_concern.email).to eq('michel@toto.fr') } + end + + context 'on an invalid email' do + let(:email) { 'mich el@toto.fr' } + it { expect(email_concern.email).to eq('mich el@toto.fr') } + end + end +end