From e1a66697d4a3955cf88bdafa5f429b02c3371448 Mon Sep 17 00:00:00 2001 From: Moncef Belyamani Date: Thu, 14 May 2015 00:24:46 -0400 Subject: [PATCH] Conditionally validate presence of state_province Not all countries have states or provinces, and not all countries that have them require them in postal addresses. For now, the app only requires them for the US and Canada. --- app/models/address.rb | 5 +---- app/models/mail_address.rb | 5 +---- app/validators/state_province_validator.rb | 3 +-- spec/features/admin/locations/update_address_spec.rb | 2 +- .../admin/locations/update_mail_address_spec.rb | 2 +- spec/models/address_spec.rb | 12 +++++++----- spec/models/mail_address_spec.rb | 10 ++++++---- 7 files changed, 18 insertions(+), 21 deletions(-) diff --git a/app/models/address.rb b/app/models/address.rb index 0b867ddf1..116ebad99 100644 --- a/app/models/address.rb +++ b/app/models/address.rb @@ -6,14 +6,11 @@ class Address < ActiveRecord::Base validates :address_1, :city, - :state_province, :postal_code, :country, presence: { message: I18n.t('errors.messages.blank_for_address') } - validates :state_province, - presence: { message: I18n.t('errors.messages.blank_for_address') }, - state_province: true + validates :state_province, state_province: true validates :country, length: { maximum: 2, minimum: 2 } diff --git a/app/models/mail_address.rb b/app/models/mail_address.rb index eb0ae639f..343d99344 100644 --- a/app/models/mail_address.rb +++ b/app/models/mail_address.rb @@ -6,15 +6,12 @@ class MailAddress < ActiveRecord::Base validates :address_1, :city, - :state_province, :postal_code, :country, :location, presence: { message: I18n.t('errors.messages.blank_for_mail_address') } - validates :state_province, - presence: { message: I18n.t('errors.messages.blank_for_address') }, - state_province: true + validates :state_province, state_province: true validates :country, length: { maximum: 2, minimum: 2 } diff --git a/app/validators/state_province_validator.rb b/app/validators/state_province_validator.rb index c29faedf4..91cfa22d9 100644 --- a/app/validators/state_province_validator.rb +++ b/app/validators/state_province_validator.rb @@ -2,11 +2,10 @@ class StateProvinceValidator < ActiveModel::EachValidator COUNTRIES_NEEDING_VALIDATION = %w(US CA).freeze def validate_each(record, attribute, value) - return if value.blank? return unless COUNTRIES_NEEDING_VALIDATION.include?(record.country) default_message = I18n.t('errors.messages.invalid_state_province') - unless value.size == 2 + unless value.present? && value.size == 2 record.errors[attribute] << (options[:message] || default_message) end end diff --git a/spec/features/admin/locations/update_address_spec.rb b/spec/features/admin/locations/update_address_spec.rb index 097c3bed7..fe7a4addf 100644 --- a/spec/features/admin/locations/update_address_spec.rb +++ b/spec/features/admin/locations/update_address_spec.rb @@ -55,7 +55,7 @@ update_street_address(address_1: '123', city: 'fair', state_province: '', postal_code: '12345', country: 'US') click_button 'Save changes' - expect(page).to have_content "State can't be blank for Address" + expect(page).to have_content t('errors.messages.invalid_state_province') end scenario 'with an empty zip' do diff --git a/spec/features/admin/locations/update_mail_address_spec.rb b/spec/features/admin/locations/update_mail_address_spec.rb index eea5efd06..d3c7e6bae 100644 --- a/spec/features/admin/locations/update_mail_address_spec.rb +++ b/spec/features/admin/locations/update_mail_address_spec.rb @@ -73,7 +73,7 @@ update_mailing_address(address_1: '123', city: 'fair', state_province: '', postal_code: '12345', country: 'US') click_button 'Save changes' - expect(page).to have_content "State can't be blank for Mail Address" + expect(page).to have_content t('errors.messages.invalid_state_province') end scenario 'with an empty zip' do diff --git a/spec/models/address_spec.rb b/spec/models/address_spec.rb index b559e0b57..d46f2a562 100644 --- a/spec/models/address_spec.rb +++ b/spec/models/address_spec.rb @@ -16,7 +16,10 @@ it { is_expected.to validate_presence_of(:address_1).with_message("can't be blank for Address") } it { is_expected.to validate_presence_of(:city).with_message("can't be blank for Address") } - it { is_expected.to validate_presence_of(:state_province).with_message("can't be blank for Address") } + it do + is_expected.to validate_presence_of(:state_province). + with_message(t('errors.messages.invalid_state_province')) + end it { is_expected.to validate_presence_of(:postal_code).with_message("can't be blank for Address") } it { is_expected.to validate_presence_of(:country).with_message("can't be blank for Address") } @@ -93,12 +96,11 @@ end context 'when country is not CA or US' do - it 'validates presence' do - address = build(:address, country: 'UK', state_province: '') + it 'does not validate presence' do + address = build(:address, country: 'ES', state_province: '') address.save - expect(address.errors[:state_province].first). - to eq t('errors.messages.blank_for_address') + expect(address.errors[:state_province]).to be_empty end end end diff --git a/spec/models/mail_address_spec.rb b/spec/models/mail_address_spec.rb index 4025a55a1..2c1a5c600 100644 --- a/spec/models/mail_address_spec.rb +++ b/spec/models/mail_address_spec.rb @@ -17,7 +17,10 @@ it { is_expected.to validate_presence_of(:address_1).with_message("can't be blank for Mail Address") } it { is_expected.to validate_presence_of(:city).with_message("can't be blank for Mail Address") } - it { is_expected.to validate_presence_of(:state_province).with_message("can't be blank for Mail Address") } + it do + is_expected.to validate_presence_of(:state_province). + with_message(t('errors.messages.invalid_state_province')) + end it { is_expected.to validate_presence_of(:postal_code).with_message("can't be blank for Mail Address") } it { is_expected.to validate_presence_of(:country).with_message("can't be blank for Mail Address") } @@ -87,12 +90,11 @@ end context 'when country is not CA or US' do - it 'validates presence' do + it 'does not validate presence' do mail_address = build(:mail_address, country: 'UK', state_province: '') mail_address.save - expect(mail_address.errors[:state_province].first). - to eq t('errors.messages.blank_for_mail_address') + expect(mail_address.errors[:state_province]).to be_empty end end end