added test for domain transfer iteraction

This commit is contained in:
oleghasjanov 2025-08-08 15:17:17 +03:00
parent 2620933543
commit 4d9c81f63b
17 changed files with 385 additions and 41 deletions

View file

@ -171,4 +171,218 @@ class ReppV1DomainsTransferTest < ActionDispatch::IntegrationTest
ENV["shunter_default_threshold"] = '10000'
ENV["shunter_enabled"] = 'false'
end
def test_transfers_domain_with_valid_dns_records
# Add nameservers to the domain
@domain.nameservers.create!(hostname: 'ns1.example.com', ipv4: ['192.0.2.1'])
@domain.nameservers.create!(hostname: 'ns2.example.com', ipv4: ['192.0.2.2'])
# Mock successful DNS validation for NS records
DNSValidator.stub :validate, { errors: [] } do
payload = { transfer: { transfer_code: @domain.transfer_code } }
post "/repp/v1/domains/#{@domain.name}/transfer", headers: @auth_headers, params: payload
json = JSON.parse(response.body, symbolize_names: true)
@domain.reload
assert_response :ok
assert_equal 1000, json[:code]
assert_equal 'Command completed successfully', json[:message]
assert_equal @domain.registrar, @user.registrar
end
end
def test_fails_transfer_with_invalid_nameserver_records
# Add nameservers to the domain
@domain.nameservers.create!(hostname: 'ns1.example.com', ipv4: ['192.0.2.1'])
@domain.nameservers.create!(hostname: 'ns2.example.com', ipv4: ['192.0.2.2'])
# Mock DNS validation failure for NS records
dns_error = 'Nameserver ns1.example.com is not authoritative for domain'
DNSValidator.stub :validate, { errors: [dns_error] } do
payload = { transfer: { transfer_code: @domain.transfer_code } }
post "/repp/v1/domains/#{@domain.name}/transfer", headers: @auth_headers, params: payload
json = JSON.parse(response.body, symbolize_names: true)
@domain.reload
assert_response :bad_request
assert_equal 2306, json[:code]
assert_equal dns_error, json[:message]
# Domain should not be transferred
refute @domain.registrar == @user.registrar
end
end
def test_transfers_domain_with_valid_dnssec_records
# Add DNSSEC keys to the domain
@domain.dnskeys.create!(
flags: 257,
protocol: 3,
alg: 8,
public_key: 'AwEAAddt2AkLfYGKgiEZB5SmIF8EvrjxNMH6HtxWEA4RJ9Ao6LCRHzfK'
)
# Mock successful DNS validation for DNSKEY records
DNSValidator.stub :validate, { errors: [] } do
payload = { transfer: { transfer_code: @domain.transfer_code } }
post "/repp/v1/domains/#{@domain.name}/transfer", headers: @auth_headers, params: payload
json = JSON.parse(response.body, symbolize_names: true)
@domain.reload
assert_response :ok
assert_equal 1000, json[:code]
assert_equal 'Command completed successfully', json[:message]
assert_equal @domain.registrar, @user.registrar
end
end
def test_fails_transfer_with_invalid_dnssec_records
# Add DNSSEC keys to the domain
@domain.dnskeys.create!(
flags: 257,
protocol: 3,
alg: 8,
public_key: 'AwEAAddt2AkLfYGKgiEZB5SmIF8EvrjxNMH6HtxWEA4RJ9Ao6LCRHzfK'
)
# Mock DNS validation failure for DNSKEY records
dns_error = 'DNSKEY record not found in DNS'
DNSValidator.stub :validate, { errors: [dns_error] } do
payload = { transfer: { transfer_code: @domain.transfer_code } }
post "/repp/v1/domains/#{@domain.name}/transfer", headers: @auth_headers, params: payload
json = JSON.parse(response.body, symbolize_names: true)
@domain.reload
assert_response :bad_request
assert_equal 2306, json[:code]
assert_equal dns_error, json[:message]
# Domain should not be transferred
refute @domain.registrar == @user.registrar
end
end
def test_transfers_domain_without_nameservers
# Ensure domain has no nameservers
@domain.nameservers.destroy_all
# Should transfer successfully without DNS validation
payload = { transfer: { transfer_code: @domain.transfer_code } }
post "/repp/v1/domains/#{@domain.name}/transfer", headers: @auth_headers, params: payload
json = JSON.parse(response.body, symbolize_names: true)
@domain.reload
assert_response :ok
assert_equal 1000, json[:code]
assert_equal 'Command completed successfully', json[:message]
assert_equal @domain.registrar, @user.registrar
end
def test_transfers_domain_without_dnssec
# Ensure domain has no DNSSEC keys
@domain.dnskeys.destroy_all
# Should transfer successfully without DNSSEC validation
payload = { transfer: { transfer_code: @domain.transfer_code } }
post "/repp/v1/domains/#{@domain.name}/transfer", headers: @auth_headers, params: payload
json = JSON.parse(response.body, symbolize_names: true)
@domain.reload
assert_response :ok
assert_equal 1000, json[:code]
assert_equal 'Command completed successfully', json[:message]
assert_equal @domain.registrar, @user.registrar
end
def test_bulk_transfer_with_dns_validation
domain2 = domains(:metro)
# Add minimum required nameservers to both domains (2 nameservers required)
@domain.nameservers.create!(hostname: 'ns1.example.com', ipv4: ['192.0.2.1'])
@domain.nameservers.create!(hostname: 'ns2.example.com', ipv4: ['192.0.2.2'])
domain2.nameservers.create!(hostname: 'ns1.example.org', ipv4: ['192.0.2.10'])
domain2.nameservers.create!(hostname: 'ns2.example.org', ipv4: ['192.0.2.11'])
# Mock DNS validation - success for both domains
DNSValidator.stub :validate, { errors: [] } do
payload = {
"data": {
"domain_transfers": [
{ "domain_name": @domain.name, "transfer_code": @domain.transfer_code },
{ "domain_name": domain2.name, "transfer_code": domain2.transfer_code }
]
}
}
post "/repp/v1/domains/transfer", headers: @auth_headers, params: payload
json = JSON.parse(response.body, symbolize_names: true)
assert_response :ok
assert_equal 1000, json[:code]
assert_equal 'Command completed successfully', json[:message]
# Both domains should be in success list
assert_equal 2, json[:data][:success].length
assert json[:data][:success].any? { |d| d[:domain_name] == @domain.name }
assert json[:data][:success].any? { |d| d[:domain_name] == domain2.name }
@domain.reload
domain2.reload
assert @domain.registrar == @user.registrar
assert domain2.registrar == @user.registrar
end
end
def test_bulk_transfer_with_mixed_dns_validation_results
domain2 = domains(:metro)
# Add minimum required nameservers to both domains (2 nameservers required)
@domain.nameservers.create!(hostname: 'ns1.example.com', ipv4: ['192.0.2.1'])
@domain.nameservers.create!(hostname: 'ns2.example.com', ipv4: ['192.0.2.2'])
domain2.nameservers.create!(hostname: 'ns1.example.org', ipv4: ['192.0.2.10'])
domain2.nameservers.create!(hostname: 'ns2.example.org', ipv4: ['192.0.2.11'])
# Mock DNS validation - fail for first domain, succeed for second
validation_results = {
@domain.name => { errors: ['Nameserver ns1.example.com is not authoritative'] },
domain2.name => { errors: [] }
}
DNSValidator.stub :validate, ->(domain:, **) {
validation_results[domain.name] || { errors: [] }
} do
payload = {
"data": {
"domain_transfers": [
{ "domain_name": @domain.name, "transfer_code": @domain.transfer_code },
{ "domain_name": domain2.name, "transfer_code": domain2.transfer_code }
]
}
}
post "/repp/v1/domains/transfer", headers: @auth_headers, params: payload
json = JSON.parse(response.body, symbolize_names: true)
assert_response :ok
assert_equal 1000, json[:code]
# First domain should fail, second should succeed
assert_equal 1, json[:data][:success].length
assert_equal domain2.name, json[:data][:success][0][:domain_name]
assert_equal 1, json[:data][:failed].length
assert_equal @domain.name, json[:data][:failed][0][:domain_name]
assert json[:data][:failed][0][:errors][:msg].include?('not authoritative')
@domain.reload
domain2.reload
# Only domain2 should be transferred
refute @domain.registrar == @user.registrar
assert domain2.registrar == @user.registrar
end
end
end