forked from mastodon/mastodon
-
Notifications
You must be signed in to change notification settings - Fork 185
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add common stub setup for resolv dns in email mx validator spec (mast…
- Loading branch information
1 parent
67ec192
commit a9e91eb
Showing
1 changed file
with
46 additions
and
50 deletions.
There are no files selected for viewing
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
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,6 +5,7 @@ | |
describe EmailMxValidator do | ||
describe '#validate' do | ||
let(:user) { instance_double(User, email: '[email protected]', sign_up_ip: '1.2.3.4', errors: instance_double(ActiveModel::Errors, add: nil)) } | ||
let(:resolv_dns_double) { instance_double(Resolv::DNS) } | ||
|
||
context 'with an e-mail domain that is explicitly allowed' do | ||
around do |block| | ||
|
@@ -15,27 +16,15 @@ | |
end | ||
|
||
it 'does not add errors if there are no DNS records' do | ||
resolver = instance_double(Resolv::DNS) | ||
|
||
allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([]) | ||
allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) | ||
allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) | ||
allow(resolver).to receive(:timeouts=).and_return(nil) | ||
allow(Resolv::DNS).to receive(:open).and_yield(resolver) | ||
configure_resolver('example.com') | ||
|
||
subject.validate(user) | ||
expect(user.errors).to_not have_received(:add) | ||
end | ||
end | ||
|
||
it 'adds no error if there are DNS records for the e-mail domain' do | ||
resolver = instance_double(Resolv::DNS) | ||
|
||
allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([]) | ||
allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([Resolv::DNS::Resource::IN::A.new('192.0.2.42')]) | ||
allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) | ||
allow(resolver).to receive(:timeouts=).and_return(nil) | ||
allow(Resolv::DNS).to receive(:open).and_yield(resolver) | ||
configure_resolver('example.com', a: resolv_double_a('192.0.2.42')) | ||
|
||
subject.validate(user) | ||
expect(user.errors).to_not have_received(:add) | ||
|
@@ -58,65 +47,72 @@ | |
end | ||
|
||
it 'adds an error if the email domain name contains empty labels' do | ||
resolver = instance_double(Resolv::DNS) | ||
|
||
allow(resolver).to receive(:getresources).with('example..com', Resolv::DNS::Resource::IN::MX).and_return([]) | ||
allow(resolver).to receive(:getresources).with('example..com', Resolv::DNS::Resource::IN::A).and_return([Resolv::DNS::Resource::IN::A.new('192.0.2.42')]) | ||
allow(resolver).to receive(:getresources).with('example..com', Resolv::DNS::Resource::IN::AAAA).and_return([]) | ||
allow(resolver).to receive(:timeouts=).and_return(nil) | ||
allow(Resolv::DNS).to receive(:open).and_yield(resolver) | ||
configure_resolver('example..com', a: resolv_double_a('192.0.2.42')) | ||
|
||
user = instance_double(User, email: '[email protected]', sign_up_ip: '1.2.3.4', errors: instance_double(ActiveModel::Errors, add: nil)) | ||
subject.validate(user) | ||
expect(user.errors).to have_received(:add) | ||
end | ||
|
||
it 'adds an error if there are no DNS records for the e-mail domain' do | ||
resolver = instance_double(Resolv::DNS) | ||
|
||
allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([]) | ||
allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) | ||
allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) | ||
allow(resolver).to receive(:timeouts=).and_return(nil) | ||
allow(Resolv::DNS).to receive(:open).and_yield(resolver) | ||
configure_resolver('example.com') | ||
|
||
subject.validate(user) | ||
expect(user.errors).to have_received(:add) | ||
end | ||
|
||
it 'adds an error if a MX record does not lead to an IP' do | ||
resolver = instance_double(Resolv::DNS) | ||
|
||
allow(resolver).to receive(:getresources) | ||
.with('example.com', Resolv::DNS::Resource::IN::MX) | ||
.and_return([instance_double(Resolv::DNS::Resource::MX, exchange: 'mail.example.com')]) | ||
allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) | ||
allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) | ||
allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([]) | ||
allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) | ||
allow(resolver).to receive(:timeouts=).and_return(nil) | ||
allow(Resolv::DNS).to receive(:open).and_yield(resolver) | ||
configure_resolver('example.com', mx: resolv_double_mx('mail.example.com')) | ||
configure_resolver('mail.example.com') | ||
|
||
subject.validate(user) | ||
expect(user.errors).to have_received(:add) | ||
end | ||
|
||
it 'adds an error if the MX record is blacklisted' do | ||
EmailDomainBlock.create!(domain: 'mail.example.com') | ||
resolver = instance_double(Resolv::DNS) | ||
|
||
allow(resolver).to receive(:getresources) | ||
.with('example.com', Resolv::DNS::Resource::IN::MX) | ||
.and_return([instance_double(Resolv::DNS::Resource::MX, exchange: 'mail.example.com')]) | ||
allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) | ||
allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) | ||
allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([instance_double(Resolv::DNS::Resource::IN::A, address: '2.3.4.5')]) | ||
allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([instance_double(Resolv::DNS::Resource::IN::AAAA, address: 'fd00::2')]) | ||
allow(resolver).to receive(:timeouts=).and_return(nil) | ||
allow(Resolv::DNS).to receive(:open).and_yield(resolver) | ||
|
||
configure_resolver( | ||
'example.com', | ||
mx: resolv_double_mx('mail.example.com') | ||
) | ||
configure_resolver( | ||
'mail.example.com', | ||
a: instance_double(Resolv::DNS::Resource::IN::A, address: '2.3.4.5'), | ||
aaaa: instance_double(Resolv::DNS::Resource::IN::AAAA, address: 'fd00::2') | ||
) | ||
|
||
subject.validate(user) | ||
expect(user.errors).to have_received(:add) | ||
end | ||
end | ||
|
||
def configure_resolver(domain, options = {}) | ||
allow(resolv_dns_double) | ||
.to receive(:getresources) | ||
.with(domain, Resolv::DNS::Resource::IN::MX) | ||
.and_return(Array(options[:mx])) | ||
allow(resolv_dns_double) | ||
.to receive(:getresources) | ||
.with(domain, Resolv::DNS::Resource::IN::A) | ||
.and_return(Array(options[:a])) | ||
allow(resolv_dns_double) | ||
.to receive(:getresources) | ||
.with(domain, Resolv::DNS::Resource::IN::AAAA) | ||
.and_return(Array(options[:aaaa])) | ||
allow(resolv_dns_double) | ||
.to receive(:timeouts=) | ||
.and_return(nil) | ||
allow(Resolv::DNS) | ||
.to receive(:open) | ||
.and_yield(resolv_dns_double) | ||
end | ||
|
||
def resolv_double_mx(domain) | ||
instance_double(Resolv::DNS::Resource::MX, exchange: domain) | ||
end | ||
|
||
def resolv_double_a(domain) | ||
Resolv::DNS::Resource::IN::A.new(domain) | ||
end | ||
end |