from typing import TYPE_CHECKING, cast
import dns.rdatatype
from GetDomainDNSDetails import get_domain_dns_details_command, make_query
if TYPE_CHECKING:
import dns.resolver
class MockRData:
def __init__(self, name, rdtype, rdclass):
self.rdtype = rdtype
self.rdclass = rdclass
self.name = name
def to_text(self):
return self.name
class MockAnswer:
def __init__(self, rrset: list[MockRData]):
self.rrset = rrset
class MockResolver:
def __init__(self):
self.nameservers = []
def resolve(self, qname, rdtype, rdclass, tcp=None, lifetime=None, raise_on_no_answer=None):
return MockAnswer(
[MockRData(f"fake{dns.rdatatype.to_text(rdtype)}", rdtype, rdclass), MockRData("fakename2", "fake", "fake")]
)
def test_make_query(mocker):
"""
Given:
- dns resolver object
- arguments: domain and query type (CNAME)
When
- testing function used in the script (not exposed)
Then
- CNAME of the domain is returned
"""
resolver = cast("dns.resolver.Resolver", MockResolver())
answer = make_query(resolver, "example.com", "CNAME", False)
assert len(answer) == 1
assert "CNAME" in answer
assert len(answer["CNAME"]) == 1
assert answer["CNAME"][0] == "fakeCNAME"
def test_get_domain_dns_details_command(mocker):
"""
Given:
- arguments: domain and dns servers
When
- resolving domain with default queries (CNAME, A, AAA)
Then
- resolution is performed
- expected output is returned to context in DomainDNSDetails
"""
mocker.patch("dns.resolver.Resolver", side_effect=MockResolver)
args = {"domain": "developers.paloaltonetworks.com", "server": "1.1.1.1"}
result = get_domain_dns_details_command(args)
assert result.outputs == {
"DomainDNSDetails": {
"domain": "developers.paloaltonetworks.com",
"server": "1.1.1.1",
"A": ["fakeA"],
"AAAA": ["fakeAAAA"],
"CNAME": ["fakeCNAME"],
"NS": ["fakeNS"],
}
}