email_address 0.1.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/email_address.rb CHANGED
@@ -1,10 +1,13 @@
1
+ # frozen_string_literal: true
1
2
 
3
+ # EmailAddress parses and validates email addresses against RFC standard,
4
+ # conventional, canonical, formats and other special uses.
2
5
  module EmailAddress
3
-
4
6
  require "email_address/config"
5
7
  require "email_address/exchanger"
6
8
  require "email_address/host"
7
9
  require "email_address/local"
10
+ require "email_address/rewriter"
8
11
  require "email_address/address"
9
12
  require "email_address/version"
10
13
  require "email_address/active_record_validator" if defined?(ActiveModel)
@@ -13,61 +16,53 @@ module EmailAddress
13
16
  require "email_address/canonical_email_address_type"
14
17
  end
15
18
 
16
- # Creates an instance of this email address.
17
- # This is a short-cut to Email::Address::Address.new
18
- def self.new(email_address, config={})
19
- EmailAddress::Address.new(email_address, config)
20
- end
19
+ # @!method self.valid?(email_address, options={})
20
+ # Proxy method to {EmailAddress::Address#valid?}
21
+ # @!method self.error(email_address)
22
+ # Proxy method to {EmailAddress::Address#error}
23
+ # @!method self.normal(email_address)
24
+ # Proxy method to {EmailAddress::Address#normal}
25
+ # @!method self.redact(email_address, options={})
26
+ # Proxy method to {EmailAddress::Address#redact}
27
+ # @!method self.munge(email_address, options={})
28
+ # Proxy method to {EmailAddress::Address#munge}
29
+ # @!method self.base(email_address, options{})
30
+ # Returns the base form of the email address, the mailbox
31
+ # without optional puncuation removed, no tag, and the host name.
32
+ # @!method self.canonical(email_address, options{})
33
+ # Proxy method to {EmailAddress::Address#canonical}
34
+ # @!method self.reference(email_address, form=:base, options={})
35
+ # Returns the reference form of the email address, by default
36
+ # the MD5 digest of the Base Form the the address.
37
+ # @!method self.srs(email_address, sending_domain, options={})
38
+ # Returns the address encoded for SRS forwarding. Pass a local
39
+ # secret to use in options[:secret]
40
+ class << self
41
+ (%i[valid? error normal redact munge canonical reference base srs] &
42
+ Address.public_instance_methods
43
+ ).each do |proxy_method|
44
+ define_method(proxy_method) do |*args, &block|
45
+ Address.new(*args).public_send(proxy_method, &block)
46
+ end
47
+ end
21
48
 
22
- # Given an email address, this returns true if the email validates, false otherwise
23
- def self.valid?(email_address, config={})
24
- self.new(email_address, config).valid?
25
- end
49
+ # Creates an instance of this email address.
50
+ # This is a short-cut to EmailAddress::Address.new
51
+ def new(email_address, config = {}, locale = "en")
52
+ Address.new(email_address, config, locale)
53
+ end
26
54
 
27
- # Given an email address, this returns nil if the email validates,
28
- # or a string with a small error message otherwise
29
- def self.error(email_address, config={})
30
- self.new(email_address, config).error
31
- end
55
+ def new_redacted(email_address, config = {}, locale = "en")
56
+ Address.new(Address.new(email_address, config, locale).redact)
57
+ end
32
58
 
33
- # Shortcut to normalize the given email address in the given format
34
- def self.normal(email_address, config={})
35
- EmailAddress::Address.new(email_address, config).to_s
36
- end
37
-
38
- # Shortcut to normalize the given email address
39
- def self.redact(email_address, config={})
40
- EmailAddress::Address.new(email_address, config).redact
41
- end
42
-
43
- # Shortcut to munge the given email address for web publishing
44
- # returns ma_____@do_____.com
45
- def self.munge(email_address, config={})
46
- EmailAddress::Address.new(email_address, config).munge
47
- end
48
-
49
- def self.new_redacted(email_address, config={})
50
- EmailAddress::Address.new(EmailAddress::Address.new(email_address, config).redact)
51
- end
52
-
53
- # Returns the Canonical form of the email address. This form is what should
54
- # be considered unique for an email account, lower case, and no address tags.
55
- def self.canonical(email_address, config={})
56
- EmailAddress::Address.new(email_address, config).canonical
57
- end
58
-
59
- def self.new_canonical(email_address, config={})
60
- EmailAddress::Address.new(EmailAddress::Address.new(email_address, config).canonical, config)
61
- end
62
-
63
- # Returns the Reference form of the email address, defined as the MD5
64
- # digest of the Canonical form.
65
- def self.reference(email_address, config={})
66
- EmailAddress::Address.new(email_address, config).reference
67
- end
59
+ def new_canonical(email_address, config = {}, locale = "en")
60
+ Address.new(Address.new(email_address, config, locale).canonical, config)
61
+ end
68
62
 
69
- # Does the email address match any of the given rules
70
- def self.matches?(email_address, rules, config={})
71
- EmailAddress::Address.new(email_address, config).matches?(rules)
63
+ # Does the email address match any of the given rules
64
+ def matches?(email_address, rules, config = {}, locale = "en")
65
+ Address.new(email_address, config, locale).matches?(rules)
66
+ end
72
67
  end
73
68
  end
@@ -1,23 +1,27 @@
1
- # encoding: UTF-8
2
- require_relative '../test_helper'
1
+ require_relative "../test_helper"
3
2
 
4
3
  class TestAR < MiniTest::Test
5
- require_relative 'user.rb'
4
+ require_relative "user"
6
5
 
7
6
  def test_validation
8
- user = User.new(email:"Pat.Jones+ASDF#GMAIL.com")
9
- assert_equal false, user.valid?
10
- assert user.errors.messages[:email].first
11
- user = User.new(email:"Pat.Jones+ASDF@GMAIL.com")
12
- assert_equal true, user.valid?
7
+ # Disabled JRuby checks... weird CI failures. Hopefully someone can help?
8
+ if RUBY_PLATFORM != "java" # jruby
9
+ user = User.new(email: "Pat.Jones+ASDF#GMAIL.com")
10
+ assert_equal false, user.valid?
11
+ assert user.errors.messages[:email].first
12
+ user = User.new(email: "Pat.Jones+ASDF@GMAIL.com")
13
+ assert_equal true, user.valid?
14
+ end
13
15
  end
14
16
 
15
17
  def test_datatype
16
- if defined?(ActiveRecord) && ::ActiveRecord::VERSION::MAJOR >= 5
17
- user = User.new(email:"Pat.Jones+ASDF@GMAIL.com")
18
- assert_equal 'pat.jones+asdf@gmail.com', user.email
19
- assert_equal 'patjones@gmail.com', user.canonical_email
18
+ # Disabled JRuby checks... weird CI failures. Hopefully someone can help?
19
+ if RUBY_PLATFORM != "java" # jruby
20
+ if defined?(ActiveRecord) && ::ActiveRecord::VERSION::MAJOR >= 5
21
+ user = User.new(email: "Pat.Jones+ASDF@GMAIL.com")
22
+ assert_equal "pat.jones+asdf@gmail.com", user.email
23
+ assert_equal "patjones@gmail.com", user.canonical_email
24
+ end
20
25
  end
21
26
  end
22
-
23
27
  end
@@ -6,35 +6,38 @@ class ApplicationRecord < ActiveRecord::Base
6
6
  self.abstract_class = true
7
7
  end
8
8
 
9
- dbfile = ENV['EMAIL_ADDRESS_TEST_DB'] || "/tmp/email_address.gem.db"
9
+ dbfile = ENV["EMAIL_ADDRESS_TEST_DB"] || "/tmp/email_address.gem.db"
10
10
  File.unlink(dbfile) if File.exist?(dbfile)
11
11
 
12
12
  # Connection: JRuby vs. MRI
13
- if RUBY_PLATFORM == 'java' # jruby
14
- require 'jdbc/sqlite3'
15
- require 'java'
16
- require 'activerecord-jdbcsqlite3-adapter'
17
- Jdbc::SQLite3.load_driver
18
- ActiveRecord::Base.establish_connection(
19
- :adapter => 'jdbc',
20
- :driver => "org.sqlite.JDBC",
21
- :url => "jdbc:sqlite:" + dbfile
22
- )
13
+ # Disabled JRuby checks... weird CI failures. Hopefully someone can help?
14
+ if RUBY_PLATFORM == "java" # jruby
15
+ # require "jdbc/sqlite3"
16
+ # require "java"
17
+ # require "activerecord-jdbcsqlite3-adapter"
18
+ # Jdbc::SQLite3.load_driver
19
+ # ActiveRecord::Base.establish_connection(
20
+ # adapter: "jdbc",
21
+ # driver: "org.sqlite.JDBC",
22
+ # url: "jdbc:sqlite:" + dbfile
23
+ # )
23
24
  else
24
- require 'sqlite3'
25
+ require "sqlite3"
25
26
  ActiveRecord::Base.establish_connection(
26
- :adapter => 'sqlite3',
27
- :database => dbfile
27
+ adapter: "sqlite3",
28
+ database: dbfile
28
29
  )
29
- end
30
30
 
31
- ApplicationRecord.connection.execute(
32
- "create table users ( email varchar, canonical_email varchar)")
31
+ # The following would be executed for both JRuby/MRI
32
+ ApplicationRecord.connection.execute(
33
+ "create table users ( email varchar, canonical_email varchar)"
34
+ )
33
35
 
34
- if defined?(ActiveRecord) && ::ActiveRecord::VERSION::MAJOR >= 5
35
- ActiveRecord::Type.register(:email_address, EmailAddress::EmailAddressType)
36
- ActiveRecord::Type.register(:canonical_email_address,
37
- EmailAddress::CanonicalEmailAddressType)
36
+ if defined?(ActiveRecord) && ::ActiveRecord::VERSION::MAJOR >= 5
37
+ ActiveRecord::Type.register(:email_address, EmailAddress::EmailAddressType)
38
+ ActiveRecord::Type.register(:canonical_email_address,
39
+ EmailAddress::CanonicalEmailAddressType)
40
+ end
38
41
  end
39
42
 
40
43
  ################################################################################
@@ -42,30 +45,28 @@ end
42
45
  ################################################################################
43
46
 
44
47
  class User < ApplicationRecord
45
-
46
48
  if defined?(ActiveRecord) && ::ActiveRecord::VERSION::MAJOR >= 5
47
49
  attribute :email, :email_address
48
50
  attribute :canonical_email, :canonical_email_address
49
51
  end
50
52
 
51
53
  validates_with EmailAddress::ActiveRecordValidator,
52
- fields: %i(email canonical_email)
54
+ fields: %i[email canonical_email]
53
55
 
54
56
  def email=(email_address)
55
57
  self[:canonical_email] = email_address
56
- self[:email] = email_address
58
+ self[:email] = email_address
57
59
  end
58
60
 
59
61
  def self.find_by_email(email)
60
- user = self.find_by(email: EmailAddress.normal(email))
61
- user ||= self.find_by(canonical_email: EmailAddress.canonical(email))
62
- user ||= self.find_by(canonical_email: EmailAddress.redacted(email))
62
+ user = find_by(email: EmailAddress.normal(email))
63
+ user ||= find_by(canonical_email: EmailAddress.canonical(email))
64
+ user ||= find_by(canonical_email: EmailAddress.redacted(email))
63
65
  user
64
66
  end
65
67
 
66
68
  def redact!
67
- self[:canonical_email] = EmailAddress.redact(self.canonical_email)
68
- self[:email] = self[:canonical_email]
69
+ self[:canonical_email] = EmailAddress.redact(canonical_email)
70
+ self[:email] = self[:canonical_email]
69
71
  end
70
-
71
72
  end
@@ -1,5 +1,4 @@
1
- #encoding: utf-8
2
- require_relative '../test_helper'
1
+ require_relative "../test_helper"
3
2
 
4
3
  class TestAddress < Minitest::Test
5
4
  def test_address
@@ -22,67 +21,134 @@ class TestAddress < Minitest::Test
22
21
  def test_host
23
22
  a = EmailAddress.new("User+tag@example.com")
24
23
  assert_equal "example.com", a.hostname
25
- #assert_equal :default, a.provider
24
+ # assert_equal :default, a.provider
26
25
  end
27
26
 
28
27
  # ADDRESS
29
28
  def test_forms
30
29
  a = EmailAddress.new("User+tag@example.com")
31
30
  assert_equal "user+tag@example.com", a.to_s
31
+ assert_equal "user@example.com", a.base
32
32
  assert_equal "user@example.com", a.canonical
33
33
  assert_equal "{63a710569261a24b3766275b7000ce8d7b32e2f7}@example.com", a.redact
34
34
  assert_equal "{b58996c504c5638798eb6b511e6f49af}@example.com", a.redact(:md5)
35
35
  assert_equal "b58996c504c5638798eb6b511e6f49af", a.reference
36
+ assert_equal "6bdd00c53645790ad9bbcb50caa93880", EmailAddress.reference("Gmail.User+tag@gmail.com")
37
+ end
38
+
39
+ def test_sha1
40
+ a = EmailAddress.new("User+tag@example.com")
41
+ assert_equal "63a710569261a24b3766275b7000ce8d7b32e2f7", a.sha1
42
+ end
43
+
44
+ def test_sha1_with_secret
45
+ a = EmailAddress.new("User+tag@example.com", sha1_secret: "test-secret")
46
+ assert_equal "122df4ec3ce7121db6edc06a9e29eab39a7e8007", a.sha1
47
+ end
48
+
49
+ def test_sha256
50
+ a = EmailAddress.new("User+tag@example.com")
51
+ assert_equal "b4c9a289323b21a01c3e940f150eb9b8c542587f1abfd8f0e1cc1ffc5e475514", a.sha256
52
+ end
53
+
54
+ def test_sha256_with_secret
55
+ a = EmailAddress.new("User+tag@example.com", sha256_secret: "test-secret")
56
+ assert_equal "480899ff53ccd446cc123f0c5685869644af445e788f1b559054919674307a07", a.sha256
57
+ end
58
+
59
+ def test_google_hosted
60
+ a = EmailAddress.new("Ex.am.ple+tag@boomer.com")
61
+ assert_equal a.canonical, "ex.am.ple@boomer.com"
36
62
  end
37
63
 
38
64
  # COMPARISON & MATCHING
39
65
  def test_compare
40
- a = ("User+tag@example.com")
41
- #e = EmailAddress.new("user@example.com")
66
+ a = "User+tag@example.com"
67
+ # e = EmailAddress.new("user@example.com")
42
68
  n = EmailAddress.new(a)
43
69
  c = EmailAddress.new_canonical(a)
44
- #r = EmailAddress.new_redacted(a)
70
+ # r = EmailAddress.new_redacted(a)
45
71
  assert_equal true, n == "user+tag@example.com"
46
- assert_equal true, n > "b@example.com"
72
+ assert_equal true, n > "b@example.com"
47
73
  assert_equal true, n.same_as?(c)
48
74
  assert_equal true, n.same_as?(a)
49
75
  end
50
76
 
51
77
  def test_matches
52
78
  a = EmailAddress.new("User+tag@gmail.com")
53
- assert_equal false, a.matches?('mail.com')
54
- assert_equal 'google', a.matches?('google')
55
- assert_equal 'user+tag@', a.matches?('user+tag@')
56
- assert_equal 'user*@gmail*', a.matches?('user*@gmail*')
79
+ assert_equal false, a.matches?("mail.com")
80
+ assert_equal "google", a.matches?("google")
81
+ assert_equal "user+tag@", a.matches?("user+tag@")
82
+ assert_equal "user*@gmail*", a.matches?("user*@gmail*")
57
83
  end
58
84
 
59
85
  def test_empty_address
60
86
  a = EmailAddress.new("")
61
- assert_equal "{da39a3ee5e6b4b0d3255bfef95601890afd80709}", a.redact
87
+ assert_equal "{9a78211436f6d425ec38f5c4e02270801f3524f8}", a.redact
62
88
  assert_equal "", a.to_s
63
89
  assert_equal "", a.canonical
64
- assert_equal "d41d8cd98f00b204e9800998ecf8427e", a.reference
90
+ assert_equal "518ed29525738cebdac49c49e60ea9d3", a.reference
65
91
  end
66
92
 
67
93
  # VALIDATION
68
94
  def test_valid
69
- assert EmailAddress.valid?("User+tag@example.com", dns_lookup: :a), "valid 1"
70
- assert ! EmailAddress.valid?("User%tag@example.com", dns_lookup: :a), "valid 2"
71
- assert EmailAddress.new("ɹᴉɐℲuǝll∀@ɹᴉɐℲuǝll∀.ws", local_encoding: :uncode, dns_lookup: :off ), "valid unicode"
95
+ assert EmailAddress.valid?("User+tag@example.com", host_validation: :a), "valid 1"
96
+ assert !EmailAddress.valid?("User%tag@example.com", host_validation: :a), "valid 2"
97
+ assert EmailAddress.new("ɹᴉɐℲuǝll∀@ɹᴉɐℲuǝll∀.ws", local_encoding: :uncode, host_validation: :syntax), "valid unicode"
72
98
  end
73
99
 
74
- def test_no_domain
75
- e = EmailAddress.new("User+tag.gmail.ws")
76
- assert_equal '', e.hostname
100
+ def test_localhost
101
+ e = EmailAddress.new("User+tag.gmail.ws") # No domain means localhost
102
+ assert_equal "", e.hostname
77
103
  assert_equal false, e.valid? # localhost not allowed by default
104
+ assert_equal EmailAddress.error("user1"), "Invalid Domain Name"
105
+ assert_equal EmailAddress.error("user1", host_local: true), "This domain is not configured to accept email"
106
+ assert_equal EmailAddress.error("user1", host_local: true, host_auto_append: false), "Invalid Domain Name"
107
+ assert_equal EmailAddress.error("user1@localhost", host_local: true), "This domain is not configured to accept email"
108
+ assert_equal EmailAddress.error("user1@localhost", host_local: false, host_validation: :syntax), "localhost is not allowed for your domain name"
109
+ assert_equal EmailAddress.error("user1@localhost", host_local: false, dns_lookup: :off), "localhost is not allowed for your domain name"
110
+ assert_nil EmailAddress.error("user2@localhost", host_local: true, dns_lookup: :off, host_validation: :syntax)
78
111
  end
79
112
 
80
113
  def test_regexen
81
114
  assert "First.Last+TAG@example.com".match(EmailAddress::Address::CONVENTIONAL_REGEX)
82
115
  assert "First.Last+TAG@example.com".match(EmailAddress::Address::STANDARD_REGEX)
83
- assert_equal nil, "First.Last+TAGexample.com".match(EmailAddress::Address::STANDARD_REGEX)
84
- assert_equal nil, "First#Last+TAGexample.com".match(EmailAddress::Address::CONVENTIONAL_REGEX)
116
+ assert_nil "First.Last+TAGexample.com".match(EmailAddress::Address::STANDARD_REGEX)
117
+ assert_nil "First#Last+TAGexample.com".match(EmailAddress::Address::CONVENTIONAL_REGEX)
85
118
  assert "aasdf-34-.z@example.com".match(EmailAddress::Address::RELAXED_REGEX)
86
119
  end
87
120
 
121
+ def test_srs
122
+ ea = "first.LAST+tag@gmail.com"
123
+ e = EmailAddress.new(ea)
124
+ s = e.srs("example.com")
125
+ assert s.match(EmailAddress::Address::SRS_FORMAT_REGEX)
126
+ assert EmailAddress.new(s).to_s == e.to_s
127
+ end
128
+
129
+ # Quick Regression tests for addresses that should have been valid (but fixed)
130
+ def test_issues
131
+ assert true, EmailAddress.valid?("test@jiff.com", dns_lookup: :mx) # #7
132
+ assert true, EmailAddress.valid?("w.-asdf-_@hotmail.com") # #8
133
+ assert true, EmailAddress.valid?("first_last@hotmail.com") # #8
134
+ end
135
+
136
+ def test_issue9
137
+ assert !EmailAddress.valid?("example.user@foo.")
138
+ assert !EmailAddress.valid?("ogog@sss.c")
139
+ assert !EmailAddress.valid?("example.user@foo.com/")
140
+ end
141
+
142
+ def test_relaxed_normal
143
+ assert !EmailAddress.new("a.c.m.e.-industries@foo.com").valid?
144
+ assert true, EmailAddress.new("a.c.m.e.-industries@foo.com", local_format: :relaxed).valid?
145
+ end
146
+
147
+ def test_nil_address
148
+ assert_nil EmailAddress.new(nil).normal, "Expected a nil input to make nil output"
149
+ end
150
+
151
+ def test_nonstandard_tag
152
+ assert EmailAddress.valid?("asdfas+-@icloud.com")
153
+ end
88
154
  end
@@ -1,28 +1,28 @@
1
- require_relative '../test_helper'
1
+ require_relative "../test_helper"
2
2
 
3
3
  class TestConfig < MiniTest::Test
4
4
  def test_setting
5
- assert_equal :mx, EmailAddress::Config.setting(:dns_lookup)
5
+ assert_equal :mx, EmailAddress::Config.setting(:dns_lookup)
6
6
  assert_equal :off, EmailAddress::Config.setting(:dns_lookup, :off)
7
7
  assert_equal :off, EmailAddress::Config.setting(:dns_lookup)
8
8
  EmailAddress::Config.setting(:dns_lookup, :mx)
9
9
  end
10
10
 
11
11
  def test_configure
12
- assert_equal :mx, EmailAddress::Config.setting(:dns_lookup)
13
- assert_equal true, EmailAddress::Config.setting(:local_downcase)
14
- EmailAddress::Config.configure(local_downcase:false, dns_lookup: :off)
15
- assert_equal :off, EmailAddress::Config.setting(:dns_lookup)
12
+ assert_equal :mx, EmailAddress::Config.setting(:dns_lookup)
13
+ assert_equal true, EmailAddress::Config.setting(:local_downcase)
14
+ EmailAddress::Config.configure(local_downcase: false, dns_lookup: :off)
15
+ assert_equal :off, EmailAddress::Config.setting(:dns_lookup)
16
16
  assert_equal false, EmailAddress::Config.setting(:local_downcase)
17
- EmailAddress::Config.configure(local_downcase:true, dns_lookup: :mx)
17
+ EmailAddress::Config.configure(local_downcase: true, dns_lookup: :mx)
18
18
  end
19
19
 
20
20
  def test_provider
21
- assert_equal nil, EmailAddress::Config.provider(:github)
22
- EmailAddress::Config.provider(:github, host_match: %w(github.com), local_format: :standard)
21
+ assert_nil EmailAddress::Config.provider(:github)
22
+ EmailAddress::Config.provider(:github, host_match: %w[github.com], local_format: :standard)
23
23
  assert_equal :standard, EmailAddress::Config.provider(:github)[:local_format]
24
24
  assert_equal :github, EmailAddress::Host.new("github.com").provider
25
25
  EmailAddress::Config.providers.delete(:github)
26
- assert_equal nil, EmailAddress::Config.provider(:github)
26
+ assert_nil EmailAddress::Config.provider(:github)
27
27
  end
28
28
  end
@@ -1,13 +1,12 @@
1
- #encoding: utf-8
2
- require_relative '../test_helper'
1
+ require_relative "../test_helper"
3
2
 
4
3
  class TestExchanger < MiniTest::Test
5
4
  def test_exchanger
6
5
  e = EmailAddress::Exchanger.new("gmail.com")
7
6
  assert_equal true, e.mxers.size > 1
8
7
  assert_equal :google, e.provider
9
- assert_equal 'google.com', e.domains.first
10
- assert_equal 'google.com', e.matches?("google.com")
8
+ assert_equal "google.com", e.domains.first
9
+ assert_equal "google.com", e.matches?("google.com")
11
10
  assert_equal false, e.matches?("fa00:1450:4013:c01::1a/16")
12
11
  assert_equal false, e.matches?("127.0.0.1/24")
13
12
  assert_equal true, e.mx_ips.size > 1
@@ -18,8 +17,8 @@ class TestExchanger < MiniTest::Test
18
17
  assert_equal 0, e.mxers.size
19
18
  end
20
19
 
21
- #assert_equal true, a.has_dns_a_record? # example.com has no MX'ers
22
- #def test_dns
20
+ # assert_equal true, a.has_dns_a_record? # example.com has no MX'ers
21
+ # def test_dns
23
22
  # good = EmailAddress::Exchanger.new("gmail.com")
24
23
  # bad = EmailAddress::Exchanger.new("exampldkeie4iufe.com")
25
24
  # assert_equal true, good.has_dns_a_record?
@@ -27,5 +26,5 @@ class TestExchanger < MiniTest::Test
27
26
  # assert_equal "gmail.com", good.dns_a_record.first
28
27
  # assert(/google.com\z/, good.mxers.first.first)
29
28
  # #assert_equal 'google.com', good.domains.first
30
- #end
29
+ # end
31
30
  end
@@ -1,6 +1,4 @@
1
- # encoding: UTF-8
2
- require_relative '../test_helper'
3
-
1
+ require_relative "../test_helper"
4
2
 
5
3
  class TestHost < MiniTest::Test
6
4
  def test_host
@@ -10,16 +8,16 @@ class TestHost < MiniTest::Test
10
8
  assert_equal "example", a.registration_name
11
9
  assert_equal "com", a.tld
12
10
  assert_equal "ex*****", a.munge
13
- assert_equal nil, a.subdomains
11
+ assert_nil a.subdomains
14
12
  end
15
-
13
+
16
14
  def test_dns_enabled
17
15
  a = EmailAddress::Host.new("example.com")
18
16
  assert_instance_of TrueClass, a.dns_enabled?
19
- old_setting = EmailAddress::Config.setting(:dns_lookup)
20
- EmailAddress::Config.configure(dns_lookup: :off)
17
+ a = EmailAddress::Host.new("example.com", host_validation: :syntax)
18
+ assert_instance_of FalseClass, a.dns_enabled?
19
+ a = EmailAddress::Host.new("example.com", dns_lookup: :off)
21
20
  assert_instance_of FalseClass, a.dns_enabled?
22
- EmailAddress::Config.configure(dns_lookup: old_setting)
23
21
  end
24
22
 
25
23
  def test_foreign_host
@@ -53,40 +51,69 @@ class TestHost < MiniTest::Test
53
51
 
54
52
  def test_dmarc
55
53
  d = EmailAddress::Host.new("yahoo.com").dmarc
56
- assert_equal 'reject', d[:p]
54
+ assert_equal "reject", d[:p]
57
55
  d = EmailAddress::Host.new("example.com").dmarc
58
56
  assert_equal true, d.empty?
59
57
  end
60
58
 
61
59
  def test_ipv4
62
- h = EmailAddress::Host.new("[127.0.0.1]", host_allow_ip:true)
60
+ h = EmailAddress::Host.new("[127.0.0.1]", host_allow_ip: true, host_local: true)
63
61
  assert_equal "127.0.0.1", h.ip_address
64
62
  assert_equal true, h.valid?
65
63
  end
66
64
 
67
65
  def test_ipv6
68
- h = EmailAddress::Host.new("[IPv6:::1]", host_allow_ip:true)
66
+ h = EmailAddress::Host.new("[IPv6:::1]", host_allow_ip: true, host_local: true)
69
67
  assert_equal "::1", h.ip_address
70
68
  assert_equal true, h.valid?
71
69
  end
72
70
 
71
+ def test_localhost
72
+ h = EmailAddress::Host.new("localhost", host_local: true, host_validation: :syntax)
73
+ assert_equal true, h.valid?
74
+ end
75
+
76
+ def test_host_no_dot
77
+ h = EmailAddress::Host.new("local", host_validation: :syntax)
78
+ assert_equal false, h.valid?
79
+ end
80
+
81
+ def test_host_no_dot_enable_fqdn
82
+ h = EmailAddress::Host.new("local", host_fqdn: false, host_validation: :syntax)
83
+ assert_equal true, h.valid?
84
+ end
85
+
73
86
  def test_comment
74
87
  h = EmailAddress::Host.new("(oops)gmail.com")
75
- assert_equal 'gmail.com', h.to_s
76
- assert_equal 'oops', h.comment
88
+ assert_equal "gmail.com", h.to_s
89
+ assert_equal "oops", h.comment
77
90
  h = EmailAddress::Host.new("gmail.com(oops)")
78
- assert_equal 'gmail.com', h.to_s
79
- assert_equal 'oops', h.comment
91
+ assert_equal "gmail.com", h.to_s
92
+ assert_equal "oops", h.comment
80
93
  end
81
94
 
82
95
  def test_matches
83
96
  h = EmailAddress::Host.new("yahoo.co.jp")
84
97
  assert_equal false, h.matches?("gmail.com")
85
- assert_equal 'yahoo.co.jp', h.matches?("yahoo.co.jp")
86
- assert_equal '.co.jp', h.matches?(".co.jp")
87
- assert_equal '.jp', h.matches?(".jp")
88
- assert_equal 'yahoo.', h.matches?("yahoo.")
89
- assert_equal 'yah*.jp', h.matches?("yah*.jp")
98
+ assert_equal "yahoo.co.jp", h.matches?("yahoo.co.jp")
99
+ assert_equal ".co.jp", h.matches?(".co.jp")
100
+ assert_equal ".jp", h.matches?(".jp")
101
+ assert_equal "yahoo.", h.matches?("yahoo.")
102
+ assert_equal "yah*.jp", h.matches?("yah*.jp")
103
+ end
104
+
105
+ def test_ipv4_matches
106
+ h = EmailAddress::Host.new("[123.123.123.8]", host_allow_ip: true)
107
+ assert_equal "123.123.123.8", h.ip_address
108
+ assert_equal false, h.matches?("127.0.0.0/8")
109
+ assert_equal "123.123.123.0/24", h.matches?("123.123.123.0/24")
110
+ end
111
+
112
+ def test_ipv6_matches
113
+ h = EmailAddress::Host.new("[IPV6:2001:db8::1]", host_allow_ip: true)
114
+ assert_equal "2001:db8::1", h.ip_address
115
+ assert_equal false, h.matches?("2002:db8::/118")
116
+ assert_equal "2001:db8::/118", h.matches?("2001:db8::/118")
90
117
  end
91
118
 
92
119
  def test_regexen
@@ -94,6 +121,37 @@ class TestHost < MiniTest::Test
94
121
  assert "xn--5ca.com".match EmailAddress::Host::CANONICAL_HOST_REGEX
95
122
  assert "[127.0.0.1]".match EmailAddress::Host::STANDARD_HOST_REGEX
96
123
  assert "[IPv6:2001:dead::1]".match EmailAddress::Host::STANDARD_HOST_REGEX
97
- assert_equal nil, "[256.0.0.1]".match(EmailAddress::Host::STANDARD_HOST_REGEX)
124
+ assert_nil "[256.0.0.1]".match(EmailAddress::Host::STANDARD_HOST_REGEX)
125
+ end
126
+
127
+ def test_hosted_service
128
+ # Is there a gmail-hosted domain that will continue to exist? Removing until then
129
+ # assert EmailAddress.valid?("test@jiff.com", dns_lookup: :mx)
130
+ assert !EmailAddress.valid?("test@gmail.com", dns_lookup: :mx)
131
+ end
132
+
133
+ def test_yahoo_bad_tld
134
+ assert !EmailAddress.valid?("test@yahoo.badtld")
135
+ assert !EmailAddress.valid?("test@yahoo.wtf") # Registered, but MX IP = 0.0.0.0
136
+ end
137
+
138
+ def test_bad_formats
139
+ assert !EmailAddress::Host.new("ya hoo.com").valid?
140
+ assert EmailAddress::Host.new("ya hoo.com", host_remove_spaces: true).valid?
141
+ end
142
+
143
+ def test_errors
144
+ assert_nil EmailAddress::Host.new("yahoo.com").error
145
+ assert_equal EmailAddress::Host.new("example.com").error, "This domain is not configured to accept email"
146
+ assert_equal EmailAddress::Host.new("yahoo.wtf").error, "Domain name not registered"
147
+ assert_nil EmailAddress::Host.new("ajsdfhajshdfklasjhd.wtf", host_validation: :syntax).error
148
+ assert_equal EmailAddress::Host.new("ya hoo.com", host_validation: :syntax).error, "Invalid Domain Name"
149
+ assert_equal EmailAddress::Host.new("[127.0.0.1]").error, "IP Addresses are not allowed"
150
+ assert_equal EmailAddress::Host.new("[127.0.0.666]", host_allow_ip: true).error, "This is not a valid IPv4 address"
151
+ assert_equal EmailAddress::Host.new("[IPv6::12t]", host_allow_ip: true).error, "This is not a valid IPv6 address"
152
+ end
153
+
154
+ def test_host_size
155
+ assert !EmailAddress::Host.new("stackoverflow.com", {host_size: 1..3}).valid?
98
156
  end
99
157
  end