Skip to content

Instantly share code, notes, and snippets.

@abitdodgy
Created January 29, 2015 18:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save abitdodgy/047f02f09e92438dbe23 to your computer and use it in GitHub Desktop.
Save abitdodgy/047f02f09e92438dbe23 to your computer and use it in GitHub Desktop.
EmailAddress class with unit tests.
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
require 'test_helper'
class EmailAddressTest < ActiveSupport::TestCase
valid_emails = ['homer@simp.sp', '_BART_@simp.com', 'lisa.simp@spring.field.com', 'marg+simp@spring.field']
invalid_emails = ['homer@simp', '_BART_@ simp.com', 'lisa.simp.field.com', '@spring.com', 'lisa@', 'ba rt@simp.com']
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?("milhouse@springville.com")
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@address.com", 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@address.com")
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@address.com")
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