|
111 | 111 | let(:email_instance) { described_class.new(email_address, dns_instance) } |
112 | 112 | let(:ttl) { 1_000 } |
113 | 113 | let(:mock_resolv_dns) { instance_double(Resolv::DNS) } |
114 | | - let(:mock_mx_records) { [double("MX", exchange: "mx.ymail.com", preference: 10, ttl: ttl)] } |
| 114 | + let(:mock_mx_records) { [double("MX", exchange: "mx.ymail.com", preference: 10, ttl:)] } |
115 | 115 |
|
116 | 116 | before do |
117 | 117 | allow(email_instance).to receive(:null_mx?).and_return(false) |
118 | 118 | allow(Resolv::DNS).to receive(:open).and_yield(mock_resolv_dns) |
119 | 119 | allow(mock_resolv_dns).to receive(:timeouts=) |
120 | 120 | end |
121 | 121 |
|
| 122 | + describe "#disposable_mx_server?" do |
| 123 | + let(:disposable_email_address) { "[email protected]" } |
| 124 | + let(:disposable_mx_server) { ValidEmail2.disposable_emails.select { |domain| domain.count(".") == 1 }.sample } |
| 125 | + let(:disposable_email_instance) { described_class.new(disposable_email_address, dns_instance) } |
| 126 | + let(:mock_disposable_mx_records) { [double("MX", exchange: "mx.#{disposable_mx_server}", preference: 10, ttl:)] } |
| 127 | + |
| 128 | + before do |
| 129 | + allow(mock_resolv_dns).to receive(:getresources) |
| 130 | + .with(disposable_email_instance.address.domain, Resolv::DNS::Resource::IN::MX) |
| 131 | + .and_return(mock_disposable_mx_records) |
| 132 | + |
| 133 | + allow(mock_resolv_dns).to receive(:getresources) |
| 134 | + .with(email_instance.address.domain, Resolv::DNS::Resource::IN::MX) |
| 135 | + .and_return(mock_mx_records) |
| 136 | + end |
| 137 | + |
| 138 | + it "is false if the MX server is not in the disposable_emails list" do |
| 139 | + expect(email_instance).not_to be_disposable_mx_server |
| 140 | + end |
| 141 | + |
| 142 | + it "is true if the MX server is in the disposable_emails list" do |
| 143 | + expect(disposable_email_instance).to be_disposable_mx_server |
| 144 | + end |
| 145 | + |
| 146 | + it "is false and then true when the MX record changes from non-disposable to disposable" do |
| 147 | + allow(mock_resolv_dns).to receive(:getresources) |
| 148 | + .with(disposable_email_instance.address.domain, Resolv::DNS::Resource::IN::MX) |
| 149 | + .and_return(mock_mx_records) # non-disposable MX records |
| 150 | + |
| 151 | + expect(disposable_email_instance).not_to be_disposable_mx_server |
| 152 | + |
| 153 | + ValidEmail2::Dns.clear_cache |
| 154 | + |
| 155 | + allow(mock_resolv_dns).to receive(:getresources) |
| 156 | + .with(disposable_email_instance.address.domain, Resolv::DNS::Resource::IN::MX) |
| 157 | + .and_return(mock_disposable_mx_records) # disposable MX records |
| 158 | + |
| 159 | + expect(disposable_email_instance).to be_disposable_mx_server |
| 160 | + end |
| 161 | + end |
| 162 | + |
122 | 163 | describe "#valid_strict_mx?" do |
123 | 164 | let(:cached_at) { Time.now } |
124 | 165 | let(:mock_cache_data) { { [email_instance.address.domain, Resolv::DNS::Resource::IN::MX] => ValidEmail2::Dns::CacheEntry.new(mock_mx_records, cached_at, ttl) } } |
|
251 | 292 | describe "#valid_mx?" do |
252 | 293 | let(:cached_at) { Time.now } |
253 | 294 | let(:mock_cache_data) { { [email_instance.address.domain, Resolv::DNS::Resource::IN::MX] => ValidEmail2::Dns::CacheEntry.new(mock_a_records, cached_at, ttl) } } |
254 | | - let(:mock_a_records) { [double("A", address: "192.168.1.1", ttl: ttl)] } |
| 295 | + let(:mock_a_records) { [double("A", address: "192.168.1.1", ttl:)] } |
255 | 296 |
|
256 | 297 | before do |
257 | 298 | allow(email_instance).to receive(:mx_servers).and_return(mock_mx_records) |
|
0 commit comments