mirror of
https://github.com/internetee/registry.git
synced 2025-08-13 21:19:31 +02:00
159 lines
4.5 KiB
Ruby
159 lines
4.5 KiB
Ruby
require 'test_helper'
|
|
|
|
class ZoneAnswer
|
|
def initialize(valid_response: true)
|
|
@answer = []
|
|
|
|
algorithm = OpenStruct.new(code: 13)
|
|
|
|
answer = OpenStruct.new
|
|
answer.data = "some0 some1 some2 257 some4 some5 some6 mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ== some"
|
|
answer.flags = 257
|
|
answer.protocol = 3
|
|
answer.protocol = 7 unless valid_response
|
|
answer.algorithm = algorithm
|
|
|
|
@answer << answer
|
|
end
|
|
|
|
def each_answer
|
|
@answer.each {|rec|
|
|
yield rec
|
|
}
|
|
end
|
|
end
|
|
|
|
class ValidateDnssecJobTest < ActiveJob::TestCase
|
|
setup do
|
|
@domain = domains(:shop)
|
|
@dnskey = dnskeys(:one)
|
|
end
|
|
|
|
def test_job_should_set_validation_datetime_if_validation_is_valid
|
|
@domain.nameservers.each do |n|
|
|
n.update(validation_datetime: Time.zone.now - 1.minute)
|
|
end
|
|
@domain.dnskeys << @dnskey
|
|
@domain.save
|
|
|
|
@domain.reload
|
|
|
|
mock_zone_data = ZoneAnswer.new
|
|
|
|
Spy.on_instance_method(ValidateDnssecJob, :prepare_validator).and_return(Dnsruby::Resolver.new)
|
|
Spy.on_instance_method(Dnsruby::Resolver, :query).and_return(mock_zone_data)
|
|
|
|
ValidateDnssecJob.perform_now(domain_name: @domain.name)
|
|
|
|
@domain.reload
|
|
assert_not_nil @domain.dnskeys.first.validation_datetime
|
|
end
|
|
|
|
def test_job_should_not_set_validation_datetime_if_validation_is_invalid
|
|
@domain.nameservers.each do |n|
|
|
n.update(validation_datetime: Time.zone.now - 1.minute)
|
|
end
|
|
@domain.dnskeys << @dnskey
|
|
@domain.save
|
|
|
|
@domain.reload
|
|
|
|
mock_zone_data = ZoneAnswer.new(valid_response: false)
|
|
|
|
Spy.on_instance_method(ValidateDnssecJob, :prepare_validator).and_return(Dnsruby::Resolver.new)
|
|
Spy.on_instance_method(Dnsruby::Resolver, :query).and_return(mock_zone_data)
|
|
|
|
ValidateDnssecJob.perform_now(domain_name: @domain.name)
|
|
|
|
@domain.reload
|
|
assert_nil @domain.dnskeys.first.validation_datetime
|
|
end
|
|
|
|
def test_prepare_validator_configures_dnsruby_resolver_with_correct_parameters
|
|
job = ValidateDnssecJob.new
|
|
|
|
original_timeout = ENV['nameserver_validation_timeout']
|
|
|
|
# Timout set for current test - in given time DNSSEC validation should be finished
|
|
ENV['nameserver_validation_timeout'] = '4'
|
|
|
|
resolver = job.send(:prepare_validator, "8.8.8.8")
|
|
|
|
assert_instance_of Dnsruby::Resolver, resolver
|
|
|
|
assert resolver.do_validation
|
|
assert resolver.dnssec
|
|
assert_equal 4, resolver.packet_timeout
|
|
assert_equal 4, resolver.query_timeout
|
|
|
|
ENV['nameserver_validation_timeout'] = original_timeout
|
|
end
|
|
|
|
def test_perform_skips_validation_if_no_nameservers_present
|
|
domain = Domain.create!(
|
|
name: "test.test",
|
|
registrar: registrars(:bestnames),
|
|
registrant: @domain.registrant,
|
|
period: 1,
|
|
period_unit: 'y',
|
|
valid_to: 1.year.from_now
|
|
)
|
|
|
|
dnskey = @dnskey
|
|
domain.dnskeys << dnskey
|
|
|
|
original_validation_time = dnskey.validation_datetime
|
|
|
|
ValidateDnssecJob.new.perform(domain_name: domain.name)
|
|
|
|
dnskey.reload
|
|
assert_equal dnskey.validation_datetime, dnskey.validation_datetime, "Expected DNSKEY validation_datetime to be set after successful validation"
|
|
end
|
|
|
|
def test_perform_updates_dnskey_validation_if_nameservers_present
|
|
domain = Domain.create!(
|
|
name: "test.test",
|
|
registrar: registrars(:bestnames),
|
|
registrant: @domain.registrant,
|
|
period: 1,
|
|
period_unit: 'y',
|
|
valid_to: 1.year.from_now
|
|
)
|
|
|
|
dnskey = @dnskey
|
|
domain.dnskeys << dnskey
|
|
|
|
nameserver = domain.nameservers.create!(
|
|
hostname: 'ns1.test.test',
|
|
ipv4: ['192.0.2.1']
|
|
)
|
|
|
|
nameserver.update(validation_datetime: Time.zone.now - 1.minute)
|
|
|
|
mock_zone_data = ZoneAnswer.new
|
|
Spy.on_instance_method(ValidateDnssecJob, :prepare_validator).and_return(Dnsruby::Resolver.new)
|
|
Spy.on_instance_method(Dnsruby::Resolver, :query).and_return(mock_zone_data)
|
|
|
|
ValidateDnssecJob.perform_now(domain_name: domain.name)
|
|
|
|
dnskey.reload
|
|
assert_not_nil dnskey.validation_datetime, "Expected DNSKEY validation_datetime to be set after successful validation"
|
|
end
|
|
|
|
def perform_without_domain_name_executes_else_block
|
|
domain = domains(:shop)
|
|
|
|
domain.dnskeys << @dnskey unless domain.dnskeys.any?
|
|
|
|
# Add nameserver if not present
|
|
unless domain.nameservers.any?
|
|
domain.nameservers.create!(
|
|
hostname: "ns.#{domain.name}",
|
|
ipv4: ["192.0.2.1"],
|
|
validation_datetime: Time.zone.now
|
|
)
|
|
end
|
|
|
|
ValidateDnssecJob.perform_now
|
|
end
|
|
end
|