From 69183a9cab0b44cf76012f76238df529e52fd916 Mon Sep 17 00:00:00 2001 From: Jeremiah Hemphill Date: Wed, 28 Mar 2012 10:01:20 -0400 Subject: [PATCH] Added zip code and phone format validators. --- CHANGELOG | 3 ++ app/validators/phone_format_validator.rb | 11 ++++ app/validators/zipcode_format_validator.rb | 11 ++++ .../validators/phone_format_validator_spec.rb | 52 +++++++++++++++++++ .../zipcode_format_validator_spec.rb | 41 +++++++++++++++ 5 files changed, 118 insertions(+) create mode 100644 app/validators/phone_format_validator.rb create mode 100644 app/validators/zipcode_format_validator.rb create mode 100644 spec/validators/phone_format_validator_spec.rb create mode 100644 spec/validators/zipcode_format_validator_spec.rb diff --git a/CHANGELOG b/CHANGELOG index 60a5835..471d2aa 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,8 @@ == unreleased changes +* Added a zip code format validator and tests +* Added a phone format validator and tests + == 0.0.4 * Added a currency validator diff --git a/app/validators/phone_format_validator.rb b/app/validators/phone_format_validator.rb new file mode 100644 index 0000000..815430a --- /dev/null +++ b/app/validators/phone_format_validator.rb @@ -0,0 +1,11 @@ +# Custom Validations for Phone Number format + +# e.g. validates :home_phone, :phone_format => true +# e.g. validates :cell_phone, :phone_format => { :allow_blank => true, :if => :method_returns_true } +class PhoneFormatValidator < ActiveModel::EachValidator + def validate_each record, attribute, value + format = /^1?[-\. ]?(\(\d{3}\)?[-\. ]?|\d{3}?[-\. ]?)?\d{3}?[-\. ]?\d{4}$/ + message = attribute.to_s.humanize + ' doesn\'t match an acceptable format.' + record.errors[attribute] << (options[:message] || message ) unless value =~ format + end +end diff --git a/app/validators/zipcode_format_validator.rb b/app/validators/zipcode_format_validator.rb new file mode 100644 index 0000000..f60ff15 --- /dev/null +++ b/app/validators/zipcode_format_validator.rb @@ -0,0 +1,11 @@ +# Custom Validations for Zip Code format + +# e.g. validates :zip, :zipcode_format => true +# e.g. validates :zip, :zipcode_format => { :allow_blank => true, :if => :method_returns_true } +class ZipcodeFormatValidator < ActiveModel::EachValidator + def validate_each record, attribute, value + format = /^\A[\d]{5}(?:[-|\s][\d]{4})?\Z$/ + message = attribute.to_s.humanize + ' doesn\'t match an acceptable format.' + record.errors[attribute] << (options[:message] || message ) unless value =~ format + end +end diff --git a/spec/validators/phone_format_validator_spec.rb b/spec/validators/phone_format_validator_spec.rb new file mode 100644 index 0000000..3cee3bf --- /dev/null +++ b/spec/validators/phone_format_validator_spec.rb @@ -0,0 +1,52 @@ +require 'spec_helper' + +describe PhoneFormatValidator do + describe ".validate_each" do + before(:each) do + @options = {:attributes => {}} + @validator = PhoneFormatValidator.new(@options) + @record = BasicRecord.new(:phone) + end + + it "should validate 7 digit phone number" do + @record.errors[:phone].should_not_receive("<<") + @validator.validate_each(@record, :phone, "123-4567") + end + + it "should validate 10 digit phone number without area code parentheses" do + @record.errors[:phone].should_not_receive("<<") + @validator.validate_each(@record, :phone, "321-123-4567") + end + + it "should validate 10 digit phone number with area code parentheses" do + @record.errors[:phone].should_not_receive("<<") + @validator.validate_each(@record, :phone, "(321) 123-4567") + end + + it "should validate 10 digit phone number with a 1 first" do + @record.errors[:phone].should_not_receive("<<") + @validator.validate_each(@record, :phone, "1-321-123-4567") + end + + it "should allow dashes between numbers" do + @record.errors[:phone].should_not_receive("<<") + @validator.validate_each(@record, :phone, "1-321-123-4567") + end + + it "should allow a single space between numbers" do + @record.errors[:phone].should_not_receive("<<") + @validator.validate_each(@record, :phone, "1 321 123 4567") + end + + it "should allow multiple whitespace characters between numbers" do + @record.errors[:phone].should_not_receive("<<") + @validator.validate_each(@record, :phone, "123 4567") + end + + it "should not validate 5 digit phone number" do + @record.errors[:phone].should_receive("<<") + @validator.validate_each(@record, :phone, "3-4567") + end + + end +end diff --git a/spec/validators/zipcode_format_validator_spec.rb b/spec/validators/zipcode_format_validator_spec.rb new file mode 100644 index 0000000..166e308 --- /dev/null +++ b/spec/validators/zipcode_format_validator_spec.rb @@ -0,0 +1,41 @@ +require 'spec_helper' + +describe ZipcodeFormatValidator do + describe ".validate_each" do + before(:each) do + @options = {:attributes => {}} + @validator = ZipcodeFormatValidator.new(@options) + @record = BasicRecord.new(:zip_code) + end + + it "should validate 5 digit zip codes" do + @record.errors[:zip_code].should_not_receive("<<") + @validator.validate_each(@record, :zip_code, "12345") + end + + it "should validate 9 digit zip codes with a space"do + @record.errors[:zip_code].should_not_receive("<<") + @validator.validate_each(@record, :zip_code, "12345 6789") + end + + it "should validate 9 digit zip codes with a dash"do + @record.errors[:zip_code].should_not_receive("<<") + @validator.validate_each(@record, :zip_code, "12345-6789") + end + + it "should not validate 9 digit zip codes with nothing between the first 5 and last 4"do + @record.errors[:zip_code].should_receive("<<") + @validator.validate_each(@record, :zip_code, "123456789") + end + + it "should not validate zip codes of other lengths"do + @record.errors[:zip_code].should_receive("<<") + @validator.validate_each(@record, :zip_code, "123456") + end + + it "does not have support for canadian zip codes"do + @record.errors[:zip_code].should_receive("<<") + @validator.validate_each(@record, :zip_code, "K1A OB1") + end + end +end