Created
January 29, 2015 18:15
-
-
Save abitdodgy/047f02f09e92438dbe23 to your computer and use it in GitHub Desktop.
EmailAddress class with unit tests.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require "i18n" | |
class EmailAddress | |
VALID_EMAIL_ADDRESS_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i | |
def self.malformed?(email) | |
email !~ VALID_EMAIL_ADDRESS_REGEX | |
end | |
def self.valid?(email) | |
!malformed?(email) | |
end | |
attr_reader :email, :i18n_scope, :errors | |
def initialize(email, i18n_scope: [:models, :email_address]) | |
@email = email | |
@i18n_scope = i18n_scope | |
@errors = [] | |
end | |
def valid? | |
validate | |
errors.empty? | |
end | |
def validate | |
message = I18n.t(:invalid, scope: i18n_scope) | |
errors.push(message) if EmailAddress.malformed?(email) | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'test_helper' | |
class EmailAddressTest < ActiveSupport::TestCase | |
valid_emails = ['[email protected]', '[email protected]', '[email protected]', '[email protected]'] | |
invalid_emails = ['homer@simp', '_BART_@ simp.com', 'lisa.simp.field.com', '@spring.com', 'lisa@', 'ba [email protected]'] | |
valid_emails.each do |email| | |
test "email #{email} should be valid" do | |
assert_match EmailAddress::VALID_EMAIL_ADDRESS_REGEX, email | |
end | |
end | |
invalid_emails.each do |email| | |
test "email #{email} should not be valid" do | |
assert_no_match EmailAddress::VALID_EMAIL_ADDRESS_REGEX, email | |
end | |
end | |
test "valid? returns true for valid email" do | |
assert EmailAddress.valid?("[email protected]") | |
end | |
test "valid? returns false for invalid email" do | |
refute EmailAddress.valid?("milhouse@springville") | |
end | |
test "#initialize sets email, i18n_scope, and errors instance variables" do | |
email_address = EmailAddress.new("[email protected]", i18n_scope: [:models, :model]) | |
assert_includes email_address.instance_variables, :@email | |
assert_includes email_address.instance_variables, :@i18n_scope | |
assert_includes email_address.instance_variables, :@errors | |
end | |
test "#initialize can be called without i18n_scope" do | |
assert_nothing_raised do | |
EmailAddress.new("[email protected]") | |
end | |
end | |
test "validate adds error for invalid email" do | |
email_address = EmailAddress.new("email@address") | |
email_address.validate | |
assert_equal 1, email_address.errors.size | |
end | |
test "validate does not add error for valid emial" do | |
email_address = EmailAddress.new("[email protected]") | |
email_address.validate | |
assert_equal 0, email_address.errors.size | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment