brite_verify 0.0.1
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/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +57 -0
- data/Rakefile +8 -0
- data/brite_verify.gemspec +21 -0
- data/lib/brite_verify/email.rb +60 -0
- data/lib/brite_verify/email_fetcher.rb +35 -0
- data/lib/brite_verify/email_response.rb +21 -0
- data/lib/brite_verify/version.rb +3 -0
- data/lib/brite_verify.rb +8 -0
- data/test/email_fetcher_test.rb +50 -0
- data/test/email_response_test.rb +57 -0
- data/test/email_test.rb +374 -0
- data/test/fixtures/accept_all_email.json +8 -0
- data/test/fixtures/connected_email.json +8 -0
- data/test/fixtures/disposable_email.json +9 -0
- data/test/fixtures/invalid_email.json +10 -0
- data/test/fixtures/role_address_email.json +9 -0
- data/test/fixtures/unknown_email.json +9 -0
- data/test/fixtures/valid_email.json +7 -0
- data/test/test_helper.rb +60 -0
- metadata +96 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Simon Schoeters
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# BriteVerify
|
2
|
+
|
3
|
+
[BriteVerify](http://www.briteverify.com/) is a paying e-mail verification service. You pass it an e-mail address and it tells you if the e-mail address is real or not. They offer a typical REST like API. This gem wraps the API in a more Ruby friendly syntax.
|
4
|
+
|
5
|
+
This gem is no way endorsed or certified by BriteVerify. I extracted the code from a project where we are using the BriteVerify e-mail verification service.
|
6
|
+
|
7
|
+
## Shortcomings
|
8
|
+
|
9
|
+
This gem does not cover all of BriteVerify's services. It only does e-mail verification and does not help you with any of BriteVerify's other services as I did not have a need for any of those so far. Feel free to contribute if you can help, it can only help the Ruby community.
|
10
|
+
|
11
|
+
## Installation
|
12
|
+
|
13
|
+
Add this line to your application's Gemfile:
|
14
|
+
|
15
|
+
gem 'brite_verify'
|
16
|
+
|
17
|
+
And then execute:
|
18
|
+
|
19
|
+
$ bundle
|
20
|
+
|
21
|
+
Or install it yourself as:
|
22
|
+
|
23
|
+
$ gem install brite_verify
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
Minimum viable example:
|
28
|
+
|
29
|
+
email = BriteVerify::Email.new("john@example.com", "1298c367-ca34-6e11-3ab5-56027f1d1ec7")
|
30
|
+
email.verified?
|
31
|
+
=> true
|
32
|
+
email.status
|
33
|
+
=> :invalid
|
34
|
+
email.account
|
35
|
+
=> "john"
|
36
|
+
email.domain
|
37
|
+
=> "example.com"
|
38
|
+
email.connected
|
39
|
+
=> nil
|
40
|
+
email.disposable
|
41
|
+
=> false
|
42
|
+
email.role_address
|
43
|
+
=> false
|
44
|
+
email.duration
|
45
|
+
=> 0.039381279
|
46
|
+
email.error_code
|
47
|
+
=> "email_domain_invalid"
|
48
|
+
email.error
|
49
|
+
=> "Email domain invalid"
|
50
|
+
|
51
|
+
You can skip the API key parameter and specify the `ENV['BRITEVERIFY_API_KEY']` environment variable for convenience.
|
52
|
+
|
53
|
+
A more detailed description of the API can be found in the [BriteVerify e-mail documentation](https://github.com/BriteVerify/BriteCode/blob/master/email.md).
|
54
|
+
|
55
|
+
## Contributing
|
56
|
+
|
57
|
+
Something missing? Found a bug? Horrified by the code? Open a [github issue](https://github.com/cimm/brite_verify/issues), write a failing test or add some code using pull requests. Your help is greatly appreciated!
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'brite_verify/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "brite_verify"
|
8
|
+
gem.version = BriteVerify::VERSION
|
9
|
+
gem.authors = ["Simon Schoeters"]
|
10
|
+
gem.email = ["hamfilter@gmail.com"]
|
11
|
+
gem.description = %q{Ruby interface for BriteVerify's paying e-mail verification service.}
|
12
|
+
gem.summary = %q{BriteVerify is a paying e-mail verification service. You pass it an e-mail address and it tells you if the e-mail address is real or not. They offer a typical REST like API. This gem wraps the API in a more Ruby friendly syntax.}
|
13
|
+
gem.homepage = "https://github.com/cimm/brite_verify"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_development_dependency 'webmock', '~> 1.9.0'
|
21
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module BriteVerify
|
2
|
+
class Email
|
3
|
+
def initialize(address, key = ENV['BRITEVERIFY_API_KEY'])
|
4
|
+
raise ArgumentError, "Missing BriteVerify API key" if key.nil? || key.strip.empty?
|
5
|
+
@address = address
|
6
|
+
@key = key
|
7
|
+
end
|
8
|
+
|
9
|
+
def verified?
|
10
|
+
raw_email.keys.any?
|
11
|
+
end
|
12
|
+
|
13
|
+
def address
|
14
|
+
raw_email["address"]
|
15
|
+
end
|
16
|
+
|
17
|
+
def account
|
18
|
+
raw_email["account"]
|
19
|
+
end
|
20
|
+
|
21
|
+
def domain
|
22
|
+
raw_email["domain"]
|
23
|
+
end
|
24
|
+
|
25
|
+
def status
|
26
|
+
raw_email["status"].to_sym if raw_email["status"]
|
27
|
+
end
|
28
|
+
|
29
|
+
def connected
|
30
|
+
raw_email["connected"].downcase == "true" if raw_email["connected"]
|
31
|
+
end
|
32
|
+
|
33
|
+
def duration
|
34
|
+
raw_email["duration"]
|
35
|
+
end
|
36
|
+
|
37
|
+
def disposable
|
38
|
+
raw_email["disposable"]
|
39
|
+
end
|
40
|
+
|
41
|
+
def role_address
|
42
|
+
raw_email["role_address"]
|
43
|
+
end
|
44
|
+
|
45
|
+
def error_code
|
46
|
+
raw_email["error_code"]
|
47
|
+
end
|
48
|
+
|
49
|
+
def error
|
50
|
+
raw_email["error"]
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def raw_email
|
56
|
+
email_fetcher = EmailFetcher.new(@key)
|
57
|
+
@raw_email ||= email_fetcher.fetch_raw_email(@address)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'net/https'
|
2
|
+
require 'openssl'
|
3
|
+
require 'uri'
|
4
|
+
|
5
|
+
module BriteVerify
|
6
|
+
class EmailFetcher
|
7
|
+
EMAIL_PATH = "/emails.json"
|
8
|
+
|
9
|
+
def initialize(key)
|
10
|
+
@key = key
|
11
|
+
end
|
12
|
+
|
13
|
+
def fetch_raw_email(address)
|
14
|
+
email_response = fetch_email(address)
|
15
|
+
email_response.raw_email
|
16
|
+
rescue Timeout::Error => e
|
17
|
+
{}
|
18
|
+
end
|
19
|
+
|
20
|
+
def fetch_email(address)
|
21
|
+
uri = verification_uri(address)
|
22
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
23
|
+
http.use_ssl = true
|
24
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
25
|
+
request = Net::HTTP::Get.new(uri.request_uri)
|
26
|
+
response = http.request(request)
|
27
|
+
EmailResponse.new(response)
|
28
|
+
end
|
29
|
+
|
30
|
+
def verification_uri(address)
|
31
|
+
query = URI.encode_www_form(address: address, apikey: @key)
|
32
|
+
URI::HTTPS.build({host: HOST, path: EMAIL_PATH, query: query})
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module BriteVerify
|
4
|
+
class EmailResponse
|
5
|
+
SUCCESS_STATUS_CODE = 200
|
6
|
+
EMPTY_JSON = "{}"
|
7
|
+
|
8
|
+
def initialize(response)
|
9
|
+
@response = response
|
10
|
+
end
|
11
|
+
|
12
|
+
def successful?
|
13
|
+
@response.code.to_i == SUCCESS_STATUS_CODE
|
14
|
+
end
|
15
|
+
|
16
|
+
def raw_email
|
17
|
+
body = successful? ? @response.body : EMPTY_JSON
|
18
|
+
JSON.parse(body)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/brite_verify.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/test_helper")
|
2
|
+
|
3
|
+
module BriteVerify
|
4
|
+
describe EmailFetcher do
|
5
|
+
ADDRESS = "john.doe@example.com"
|
6
|
+
KEY = "123-abc-123-abc"
|
7
|
+
|
8
|
+
before do
|
9
|
+
@email_verification_request = stub_email_verification_request(ADDRESS, KEY, valid_email_body)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "accepts a key" do
|
13
|
+
email_fetcher = EmailFetcher.new(KEY)
|
14
|
+
email_fetcher.wont_be_nil
|
15
|
+
end
|
16
|
+
|
17
|
+
it "requires a key" do
|
18
|
+
lambda { EmailFetcher.new }.must_raise(ArgumentError)
|
19
|
+
end
|
20
|
+
|
21
|
+
describe :fetch_raw_email do
|
22
|
+
it "returns the raw e-mail" do
|
23
|
+
email_fetcher = EmailFetcher.new(KEY)
|
24
|
+
parsed_valid_email_body = JSON.parse(valid_email_body)
|
25
|
+
email_fetcher.fetch_raw_email(ADDRESS).must_equal(parsed_valid_email_body)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe :fetch_email do
|
30
|
+
it "verifies the e-mail with BriteVerify" do
|
31
|
+
email_fetcher = EmailFetcher.new(KEY)
|
32
|
+
email_fetcher.fetch_email(ADDRESS)
|
33
|
+
assert_requested(@email_verification_request)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "returns an e-mail response" do
|
37
|
+
email_fetcher = EmailFetcher.new(KEY)
|
38
|
+
email_fetcher.fetch_email(ADDRESS).must_be_instance_of(EmailResponse)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe :verification_uri do
|
43
|
+
it "returns the verification URI" do
|
44
|
+
email_fetcher = EmailFetcher.new(KEY)
|
45
|
+
uri = email_fetcher.verification_uri(ADDRESS)
|
46
|
+
uri.to_s.must_equal("https://bpi.briteverify.com/emails.json?address=john.doe%40example.com&apikey=123-abc-123-abc")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/test_helper")
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module BriteVerify
|
5
|
+
describe EmailResponse do
|
6
|
+
before do
|
7
|
+
@response = Net::HTTPResponse.new(1.0, 200, "OK")
|
8
|
+
end
|
9
|
+
|
10
|
+
describe :successful? do
|
11
|
+
describe "when it succeeded" do
|
12
|
+
it "returns true" do
|
13
|
+
email_response = EmailResponse.new(@response)
|
14
|
+
email_response.successful?.must_equal(true)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "when something went wrong" do
|
19
|
+
before do
|
20
|
+
@response = Net::HTTPResponse.new(1.0, 500, "Internal Server Error")
|
21
|
+
end
|
22
|
+
|
23
|
+
it "returns false" do
|
24
|
+
email_response = EmailResponse.new(@response)
|
25
|
+
email_response.successful?.must_equal(false)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe :raw_email do
|
31
|
+
describe "when it succeeded" do
|
32
|
+
before do
|
33
|
+
@response = MiniTest::Mock.new # can't set response.body for some reason
|
34
|
+
@response.expect(:code, "200")
|
35
|
+
@response.expect(:body, valid_email_body)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "returns the raw email" do
|
39
|
+
email_response = EmailResponse.new(@response)
|
40
|
+
parsed_valid_email_body = JSON.parse(valid_email_body)
|
41
|
+
email_response.raw_email.must_equal(parsed_valid_email_body)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "when something went wrong" do
|
46
|
+
before do
|
47
|
+
@response = Net::HTTPResponse.new(1.0, 500, "Internal Server Error")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "returns an empty raw email" do
|
51
|
+
email_response = EmailResponse.new(@response)
|
52
|
+
email_response.raw_email.must_equal({})
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/test/email_test.rb
ADDED
@@ -0,0 +1,374 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/test_helper")
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module BriteVerify
|
5
|
+
describe Email do
|
6
|
+
ADDRESS = "john.doe@example.com"
|
7
|
+
KEY = "123-abc-123-abc"
|
8
|
+
|
9
|
+
before do
|
10
|
+
stub_email_verification_request(ADDRESS, KEY, valid_email_body)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "accepts a key" do
|
14
|
+
email = Email.new(ADDRESS, KEY)
|
15
|
+
email.wont_be_nil
|
16
|
+
end
|
17
|
+
|
18
|
+
it "requires a key" do
|
19
|
+
lambda { Email.new(ADDRESS) }.must_raise(ArgumentError)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "does not accept an empty key" do
|
23
|
+
lambda { Email.new(ADDRESS, "") }.must_raise(ArgumentError)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "uses the environment variable the key wasn't given" do
|
27
|
+
ENV['BRITEVERIFY_API_KEY'] = "456-def-456-def"
|
28
|
+
lambda { Email.new(ADDRESS) }.must_be_silent
|
29
|
+
ENV['BRITEVERIFY_API_KEY'] = nil
|
30
|
+
end
|
31
|
+
|
32
|
+
describe :verified? do
|
33
|
+
describe "when the response was successful" do
|
34
|
+
it "returns true" do
|
35
|
+
email = Email.new(ADDRESS, KEY)
|
36
|
+
email.verified?.must_equal(true)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "when the response was not successful" do
|
41
|
+
before do
|
42
|
+
stub_error_email_verification_request(ADDRESS, KEY, 500)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "returns false" do
|
46
|
+
email = Email.new(ADDRESS, KEY)
|
47
|
+
email.verified?.must_equal(false)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "when the response timed out" do
|
52
|
+
before do
|
53
|
+
stub_error_email_verification_request(ADDRESS, KEY, :timeout)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "returns false" do
|
57
|
+
email = Email.new(ADDRESS, KEY)
|
58
|
+
email.verified?.must_equal(false)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "when the response is unauthorized" do
|
63
|
+
before do
|
64
|
+
stub_error_email_verification_request(ADDRESS, KEY, 401)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "returns false" do
|
68
|
+
email = Email.new(ADDRESS, KEY)
|
69
|
+
email.verified?.must_equal(false)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe :address do
|
75
|
+
describe "when the response was successful" do
|
76
|
+
it "returns the verified address returned from BriteVerify" do
|
77
|
+
email = Email.new(ADDRESS, KEY)
|
78
|
+
email.address.must_equal("john.doe@example.com")
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "when the response was not successful" do
|
83
|
+
before do
|
84
|
+
stub_error_email_verification_request(ADDRESS, KEY, 500)
|
85
|
+
end
|
86
|
+
|
87
|
+
it "returns nil" do
|
88
|
+
email = Email.new(ADDRESS, KEY)
|
89
|
+
email.address.must_be_nil
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe :account do
|
95
|
+
describe "when the response was successful" do
|
96
|
+
it "returns the account returned from BriteVerify" do
|
97
|
+
email = Email.new(ADDRESS, KEY)
|
98
|
+
email.account.must_equal("john.doe")
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe "when the response was not successful" do
|
103
|
+
before do
|
104
|
+
stub_error_email_verification_request(ADDRESS, KEY, 500)
|
105
|
+
end
|
106
|
+
|
107
|
+
it "returns nil" do
|
108
|
+
email = Email.new(ADDRESS, KEY)
|
109
|
+
email.account.must_be_nil
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe :domain do
|
115
|
+
describe "when the response was successful" do
|
116
|
+
it "returns the domain returned from BriteVerify" do
|
117
|
+
email = Email.new(ADDRESS, KEY)
|
118
|
+
email.domain.must_equal("example.com")
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
describe "when the response was not successful" do
|
123
|
+
before do
|
124
|
+
stub_error_email_verification_request(ADDRESS, KEY, 500)
|
125
|
+
end
|
126
|
+
|
127
|
+
it "returns nil" do
|
128
|
+
email = Email.new(ADDRESS, KEY)
|
129
|
+
email.domain.must_be_nil
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe :status do
|
135
|
+
describe "when the response was successful" do
|
136
|
+
describe "when the address is valid" do
|
137
|
+
it "returns the valid status" do
|
138
|
+
email = Email.new(ADDRESS, KEY)
|
139
|
+
email.status.must_equal(:valid)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
describe "when the address is invalid" do
|
144
|
+
before do
|
145
|
+
stub_email_verification_request(ADDRESS, KEY, invalid_email_body)
|
146
|
+
end
|
147
|
+
|
148
|
+
it "returns the invalid status" do
|
149
|
+
email = Email.new(ADDRESS, KEY)
|
150
|
+
email.status.must_equal(:invalid)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
describe "when the address is unknown" do
|
155
|
+
before do
|
156
|
+
stub_email_verification_request(ADDRESS, KEY, unknown_email_body)
|
157
|
+
end
|
158
|
+
|
159
|
+
it "returns the unknown status" do
|
160
|
+
email = Email.new(ADDRESS, KEY)
|
161
|
+
email.status.must_equal(:unknown)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
describe "when the address is an accept all address" do
|
166
|
+
before do
|
167
|
+
stub_email_verification_request(ADDRESS, KEY, accept_all_email_body)
|
168
|
+
end
|
169
|
+
|
170
|
+
it "returns the unknown status" do
|
171
|
+
email = Email.new(ADDRESS, KEY)
|
172
|
+
email.status.must_equal(:accept_all)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
describe "when the response was not successful" do
|
178
|
+
before do
|
179
|
+
stub_error_email_verification_request(ADDRESS, KEY, 500)
|
180
|
+
end
|
181
|
+
|
182
|
+
it "returns nil" do
|
183
|
+
email = Email.new(ADDRESS, KEY)
|
184
|
+
email.status.must_be_nil
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
describe :connected do
|
190
|
+
describe "when the response was successful" do
|
191
|
+
describe "when the address is connected" do
|
192
|
+
before do
|
193
|
+
stub_email_verification_request(ADDRESS, KEY, connected_email_body)
|
194
|
+
end
|
195
|
+
|
196
|
+
it "returns true" do
|
197
|
+
email = Email.new(ADDRESS, KEY)
|
198
|
+
email.connected.must_equal(true)
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
describe "when it is not known if the address is connected" do
|
203
|
+
it "returns nil" do
|
204
|
+
email = Email.new(ADDRESS, KEY)
|
205
|
+
email.connected.must_be_nil
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
describe "when the response was not successful" do
|
211
|
+
before do
|
212
|
+
stub_error_email_verification_request(ADDRESS, KEY, 500)
|
213
|
+
end
|
214
|
+
|
215
|
+
it "returns nil" do
|
216
|
+
email = Email.new(ADDRESS, KEY)
|
217
|
+
email.connected.must_be_nil
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
describe :duration do
|
223
|
+
describe "when the response was successful" do
|
224
|
+
it "returns the time it took BriteVerify to verify the address" do
|
225
|
+
email = Email.new(ADDRESS, KEY)
|
226
|
+
email.duration.must_equal(0.104516605)
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
describe "when the response was not successful" do
|
231
|
+
before do
|
232
|
+
stub_error_email_verification_request(ADDRESS, KEY, 500)
|
233
|
+
end
|
234
|
+
|
235
|
+
it "returns nil" do
|
236
|
+
email = Email.new(ADDRESS, KEY)
|
237
|
+
email.duration.must_be_nil
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
describe :disposable do
|
243
|
+
describe "when the response was successful" do
|
244
|
+
describe "the address is disposable" do
|
245
|
+
before do
|
246
|
+
stub_email_verification_request(ADDRESS, KEY, disposable_email_body)
|
247
|
+
end
|
248
|
+
|
249
|
+
it "returns true" do
|
250
|
+
email = Email.new(ADDRESS, KEY)
|
251
|
+
email.disposable.must_equal(true)
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
describe "when it is not known if the address is disposable" do
|
256
|
+
it "returns nil" do
|
257
|
+
email = Email.new(ADDRESS, KEY)
|
258
|
+
email.disposable.must_be_nil
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
describe "when the response was not successful" do
|
264
|
+
before do
|
265
|
+
stub_error_email_verification_request(ADDRESS, KEY, 500)
|
266
|
+
end
|
267
|
+
|
268
|
+
it "returns nil" do
|
269
|
+
email = Email.new(ADDRESS, KEY)
|
270
|
+
email.disposable.must_be_nil
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
describe :role_address do
|
276
|
+
describe "when the response was successful" do
|
277
|
+
describe "when the address is a role address" do
|
278
|
+
before do
|
279
|
+
stub_email_verification_request(ADDRESS, KEY, role_address_email_body)
|
280
|
+
end
|
281
|
+
|
282
|
+
it "returns true" do
|
283
|
+
email = Email.new(ADDRESS, KEY)
|
284
|
+
email.role_address.must_equal(true)
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
describe "when it is not known if the address is a role address" do
|
289
|
+
it "returns nil" do
|
290
|
+
email = Email.new(ADDRESS, KEY)
|
291
|
+
email.role_address.must_be_nil
|
292
|
+
end
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
describe "when the response was not successful" do
|
297
|
+
before do
|
298
|
+
stub_error_email_verification_request(ADDRESS, KEY, 500)
|
299
|
+
end
|
300
|
+
|
301
|
+
it "returns nil" do
|
302
|
+
email = Email.new(ADDRESS, KEY)
|
303
|
+
email.role_address.must_be_nil
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
describe :error_code do
|
309
|
+
describe "when the response was successful" do
|
310
|
+
describe "when the address is valid" do
|
311
|
+
it "has no error code" do
|
312
|
+
email = Email.new(ADDRESS, KEY)
|
313
|
+
email.error_code.must_be_nil
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
describe "when the address is not valid" do
|
318
|
+
before do
|
319
|
+
stub_email_verification_request(ADDRESS, KEY, invalid_email_body)
|
320
|
+
end
|
321
|
+
|
322
|
+
it "has an error code" do
|
323
|
+
email = Email.new(ADDRESS, KEY)
|
324
|
+
email.error_code.must_equal("email_domain_invalid")
|
325
|
+
end
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
describe "when the response was not successful" do
|
330
|
+
before do
|
331
|
+
stub_error_email_verification_request(ADDRESS, KEY, 500)
|
332
|
+
end
|
333
|
+
|
334
|
+
it "returns nil" do
|
335
|
+
email = Email.new(ADDRESS, KEY)
|
336
|
+
email.error_code.must_be_nil
|
337
|
+
end
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
describe :error do
|
342
|
+
describe "when the response was successful" do
|
343
|
+
describe "when the address is valid" do
|
344
|
+
it "has no error" do
|
345
|
+
email = Email.new(ADDRESS, KEY)
|
346
|
+
email.error.must_be_nil
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
describe "when the address is not valid" do
|
351
|
+
before do
|
352
|
+
stub_email_verification_request(ADDRESS, KEY, invalid_email_body)
|
353
|
+
end
|
354
|
+
|
355
|
+
it "has a more detailed error" do
|
356
|
+
email = Email.new(ADDRESS, KEY)
|
357
|
+
email.error.must_equal("Email domain invalid")
|
358
|
+
end
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
describe "when the response was not successful" do
|
363
|
+
before do
|
364
|
+
stub_error_email_verification_request(ADDRESS, KEY, 500)
|
365
|
+
end
|
366
|
+
|
367
|
+
it "returns nil" do
|
368
|
+
email = Email.new(ADDRESS, KEY)
|
369
|
+
email.error.must_be_nil
|
370
|
+
end
|
371
|
+
end
|
372
|
+
end
|
373
|
+
end
|
374
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'minitest/spec'
|
2
|
+
require 'minitest/mock'
|
3
|
+
require 'minitest/autorun'
|
4
|
+
require 'webmock/minitest'
|
5
|
+
require 'brite_verify'
|
6
|
+
|
7
|
+
FIXTURES_PATH = File.expand_path("#{File.dirname(__FILE__)}/fixtures")
|
8
|
+
|
9
|
+
def valid_email_body
|
10
|
+
@valid_email_body ||= File.read(File.join(FIXTURES_PATH, 'valid_email.json'))
|
11
|
+
end
|
12
|
+
|
13
|
+
def invalid_email_body
|
14
|
+
@invalid_email_body ||= File.read(File.join(FIXTURES_PATH, 'invalid_email.json'))
|
15
|
+
end
|
16
|
+
|
17
|
+
def unknown_email_body
|
18
|
+
@unknown_email_body ||= File.read(File.join(FIXTURES_PATH, 'unknown_email.json'))
|
19
|
+
end
|
20
|
+
|
21
|
+
def accept_all_email_body
|
22
|
+
@accept_all_email_body ||= File.read(File.join(FIXTURES_PATH, 'accept_all_email.json'))
|
23
|
+
end
|
24
|
+
|
25
|
+
def connected_email_body
|
26
|
+
@connected_email_body ||= File.read(File.join(FIXTURES_PATH, 'connected_email.json'))
|
27
|
+
end
|
28
|
+
|
29
|
+
def disposable_email_body
|
30
|
+
@disposable_email_body ||= File.read(File.join(FIXTURES_PATH, 'disposable_email.json'))
|
31
|
+
end
|
32
|
+
|
33
|
+
def role_address_email_body
|
34
|
+
@role_address_email_body ||= File.read(File.join(FIXTURES_PATH, 'role_address_email.json'))
|
35
|
+
end
|
36
|
+
|
37
|
+
def stub_email_verification_request(address, key, body)
|
38
|
+
request = { :headers => {'Accept' => '*/*', 'User-Agent' => 'Ruby'} }
|
39
|
+
response = { :status => 200, :body => body, :headers => {} }
|
40
|
+
stub_request(:get, email_verification_url(address, key)).with(request).to_return(response)
|
41
|
+
end
|
42
|
+
|
43
|
+
def stub_error_email_verification_request(address, key, code)
|
44
|
+
status = []
|
45
|
+
verification_url = email_verification_url(address, key)
|
46
|
+
case code
|
47
|
+
when 401
|
48
|
+
stub_request(:get, verification_url).to_return(:status => [401, "Unauthorized"])
|
49
|
+
when 500
|
50
|
+
stub_request(:get, verification_url).to_return(:status => [500, "Internal Server Error"])
|
51
|
+
when :timeout
|
52
|
+
stub_request(:get, verification_url).to_timeout
|
53
|
+
else
|
54
|
+
raise "Unknown response code: #{code}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def email_verification_url(address, key)
|
59
|
+
"https://bpi.briteverify.com/emails.json?address=#{address}&apikey=#{key}"
|
60
|
+
end
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: brite_verify
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Simon Schoeters
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-12-31 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: webmock
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.9.0
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.9.0
|
30
|
+
description: Ruby interface for BriteVerify's paying e-mail verification service.
|
31
|
+
email:
|
32
|
+
- hamfilter@gmail.com
|
33
|
+
executables: []
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- .gitignore
|
38
|
+
- Gemfile
|
39
|
+
- LICENSE.txt
|
40
|
+
- README.md
|
41
|
+
- Rakefile
|
42
|
+
- brite_verify.gemspec
|
43
|
+
- lib/brite_verify.rb
|
44
|
+
- lib/brite_verify/email.rb
|
45
|
+
- lib/brite_verify/email_fetcher.rb
|
46
|
+
- lib/brite_verify/email_response.rb
|
47
|
+
- lib/brite_verify/version.rb
|
48
|
+
- test/email_fetcher_test.rb
|
49
|
+
- test/email_response_test.rb
|
50
|
+
- test/email_test.rb
|
51
|
+
- test/fixtures/accept_all_email.json
|
52
|
+
- test/fixtures/connected_email.json
|
53
|
+
- test/fixtures/disposable_email.json
|
54
|
+
- test/fixtures/invalid_email.json
|
55
|
+
- test/fixtures/role_address_email.json
|
56
|
+
- test/fixtures/unknown_email.json
|
57
|
+
- test/fixtures/valid_email.json
|
58
|
+
- test/test_helper.rb
|
59
|
+
homepage: https://github.com/cimm/brite_verify
|
60
|
+
licenses: []
|
61
|
+
post_install_message:
|
62
|
+
rdoc_options: []
|
63
|
+
require_paths:
|
64
|
+
- lib
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
requirements: []
|
78
|
+
rubyforge_project:
|
79
|
+
rubygems_version: 1.8.24
|
80
|
+
signing_key:
|
81
|
+
specification_version: 3
|
82
|
+
summary: BriteVerify is a paying e-mail verification service. You pass it an e-mail
|
83
|
+
address and it tells you if the e-mail address is real or not. They offer a typical
|
84
|
+
REST like API. This gem wraps the API in a more Ruby friendly syntax.
|
85
|
+
test_files:
|
86
|
+
- test/email_fetcher_test.rb
|
87
|
+
- test/email_response_test.rb
|
88
|
+
- test/email_test.rb
|
89
|
+
- test/fixtures/accept_all_email.json
|
90
|
+
- test/fixtures/connected_email.json
|
91
|
+
- test/fixtures/disposable_email.json
|
92
|
+
- test/fixtures/invalid_email.json
|
93
|
+
- test/fixtures/role_address_email.json
|
94
|
+
- test/fixtures/unknown_email.json
|
95
|
+
- test/fixtures/valid_email.json
|
96
|
+
- test/test_helper.rb
|