1 # frozen_string_literal: true
5 describe EmailMxValidator
do
6 describe
'#validate' do
7 let(:user) { double(email
: 'foo@example.com', errors
: double(add
: nil)) }
9 it
'adds an error if there are no DNS records for the e-mail domain' do
12 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::MX).and_return([])
13 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::A).and_return([])
14 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::AAAA).and_return([])
15 allow(resolver
).to
receive(:timeouts=).and_return(nil)
16 allow(Resolv
::DNS).to
receive(:open).and_yield(resolver
)
18 subject
.validate(user
)
19 expect(user
.errors
).to
have_received(:add)
22 it
'adds an error if a MX record exists but does not lead to an IP' do
25 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::MX).and_return([double(exchange
: 'mail.example.com')])
26 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::A).and_return([])
27 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::AAAA).and_return([])
28 allow(resolver
).to
receive(:getresources).with('mail.example.com', Resolv
::DNS::Resource::IN::A).and_return([])
29 allow(resolver
).to
receive(:getresources).with('mail.example.com', Resolv
::DNS::Resource::IN::AAAA).and_return([])
30 allow(resolver
).to
receive(:timeouts=).and_return(nil)
31 allow(Resolv
::DNS).to
receive(:open).and_yield(resolver
)
33 subject
.validate(user
)
34 expect(user
.errors
).to
have_received(:add)
37 it
'adds an error if the A record is blacklisted' do
38 EmailDomainBlock
.create!
(domain
: '1.2.3.4')
41 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::MX).and_return([])
42 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::A).and_return([double(address
: '1.2.3.4')])
43 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::AAAA).and_return([])
44 allow(resolver
).to
receive(:timeouts=).and_return(nil)
45 allow(Resolv
::DNS).to
receive(:open).and_yield(resolver
)
47 subject
.validate(user
)
48 expect(user
.errors
).to
have_received(:add)
51 it
'adds an error if the AAAA record is blacklisted' do
52 EmailDomainBlock
.create!
(domain
: 'fd00::1')
55 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::MX).and_return([])
56 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::A).and_return([])
57 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::AAAA).and_return([double(address
: 'fd00::1')])
58 allow(resolver
).to
receive(:timeouts=).and_return(nil)
59 allow(Resolv
::DNS).to
receive(:open).and_yield(resolver
)
61 subject
.validate(user
)
62 expect(user
.errors
).to
have_received(:add)
65 it
'adds an error if the MX record is blacklisted' do
66 EmailDomainBlock
.create!
(domain
: '2.3.4.5')
69 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::MX).and_return([double(exchange
: 'mail.example.com')])
70 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::A).and_return([])
71 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::AAAA).and_return([])
72 allow(resolver
).to
receive(:getresources).with('mail.example.com', Resolv
::DNS::Resource::IN::A).and_return([double(address
: '2.3.4.5')])
73 allow(resolver
).to
receive(:getresources).with('mail.example.com', Resolv
::DNS::Resource::IN::AAAA).and_return([])
74 allow(resolver
).to
receive(:timeouts=).and_return(nil)
75 allow(Resolv
::DNS).to
receive(:open).and_yield(resolver
)
77 subject
.validate(user
)
78 expect(user
.errors
).to
have_received(:add)
81 it
'adds an error if the MX IPv6 record is blacklisted' do
82 EmailDomainBlock
.create!
(domain
: 'fd00::2')
85 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::MX).and_return([double(exchange
: 'mail.example.com')])
86 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::A).and_return([])
87 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::AAAA).and_return([])
88 allow(resolver
).to
receive(:getresources).with('mail.example.com', Resolv
::DNS::Resource::IN::A).and_return([])
89 allow(resolver
).to
receive(:getresources).with('mail.example.com', Resolv
::DNS::Resource::IN::AAAA).and_return([double(address
: 'fd00::2')])
90 allow(resolver
).to
receive(:timeouts=).and_return(nil)
91 allow(Resolv
::DNS).to
receive(:open).and_yield(resolver
)
93 subject
.validate(user
)
94 expect(user
.errors
).to
have_received(:add)
97 it
'adds an error if the MX hostname is blacklisted' do
98 EmailDomainBlock
.create!
(domain
: 'mail.example.com')
101 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::MX).and_return([double(exchange
: 'mail.example.com')])
102 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::A).and_return([])
103 allow(resolver
).to
receive(:getresources).with('example.com', Resolv
::DNS::Resource::IN::AAAA).and_return([])
104 allow(resolver
).to
receive(:getresources).with('mail.example.com', Resolv
::DNS::Resource::IN::A).and_return([double(address
: '2.3.4.5')])
105 allow(resolver
).to
receive(:getresources).with('mail.example.com', Resolv
::DNS::Resource::IN::AAAA).and_return([double(address
: 'fd00::2')])
106 allow(resolver
).to
receive(:timeouts=).and_return(nil)
107 allow(Resolv
::DNS).to
receive(:open).and_yield(resolver
)
109 subject
.validate(user
)
110 expect(user
.errors
).to
have_received(:add)