|
| 1 | +from _pytest.logging import LogCaptureFixture |
| 2 | +import pytest |
| 3 | + |
| 4 | +from pytest_mock import MockerFixture |
| 5 | + |
| 6 | +from mock import Mock |
| 7 | + |
| 8 | +import dns.resolver |
| 9 | +import dns.rdatatype |
| 10 | +import dns.rdataclass |
| 11 | +import dns.message |
| 12 | +import dns.rrset |
| 13 | +import dns.flags |
| 14 | + |
| 15 | +from pythclient.utils import get_key |
| 16 | + |
| 17 | + |
| 18 | +@pytest.fixture() |
| 19 | +def answer_program() -> dns.resolver.Answer: |
| 20 | + qname = dns.name.Name(labels=(b'devnet-program-v2', b'pyth', b'network', b'')) |
| 21 | + rdtype = dns.rdatatype.TXT |
| 22 | + rdclass = dns.rdataclass.IN |
| 23 | + response = dns.message.QueryMessage(id=0) |
| 24 | + response.flags = dns.flags.QR |
| 25 | + rrset_qn = dns.rrset.from_text(qname, 100, rdclass, rdtype) |
| 26 | + rrset_ans = dns.rrset.from_text(qname, 100, rdclass, rdtype, '"program=gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s"') |
| 27 | + response.question = [rrset_qn] |
| 28 | + response.answer = [rrset_ans] |
| 29 | + answer = dns.resolver.Answer( |
| 30 | + qname=qname, rdtype=rdtype, rdclass=rdclass, response=response) |
| 31 | + answer.rrset = rrset_ans |
| 32 | + return answer |
| 33 | + |
| 34 | + |
| 35 | +@pytest.fixture() |
| 36 | +def answer_mapping() -> dns.resolver.Answer: |
| 37 | + qname = dns.name.Name(labels=(b'devnet-mapping-v2', b'pyth', b'network', b'')) |
| 38 | + rdtype = dns.rdatatype.TXT |
| 39 | + rdclass = dns.rdataclass.IN |
| 40 | + response = dns.message.QueryMessage(id=0) |
| 41 | + response.flags = dns.flags.QR |
| 42 | + rrset_qn = dns.rrset.from_text(qname, 100, rdclass, rdtype) |
| 43 | + rrset_ans = dns.rrset.from_text(qname, 100, rdclass, rdtype, '"mapping=BmA9Z6FjioHJPpjT39QazZyhDRUdZy2ezwx4GiDdE2u2"') |
| 44 | + response.question = [rrset_qn] |
| 45 | + response.answer = [rrset_ans] |
| 46 | + answer = dns.resolver.Answer( |
| 47 | + qname=qname, rdtype=rdtype, rdclass=rdclass, response=response) |
| 48 | + answer.rrset = rrset_ans |
| 49 | + return answer |
| 50 | + |
| 51 | + |
| 52 | +@pytest.fixture() |
| 53 | +def mock_dns_resolver_resolve(mocker: MockerFixture) -> Mock: |
| 54 | + mock = Mock() |
| 55 | + mocker.patch('dns.resolver.resolve', side_effect=mock) |
| 56 | + return mock |
| 57 | + |
| 58 | + |
| 59 | +def test_utils_get_program_key(mock_dns_resolver_resolve: Mock, answer_program: dns.resolver.Answer) -> None: |
| 60 | + mock_dns_resolver_resolve.return_value = answer_program |
| 61 | + program_key = get_key("devnet", "program") |
| 62 | + assert program_key == "gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s" |
| 63 | + |
| 64 | + |
| 65 | +def test_utils_get_mapping_key(mock_dns_resolver_resolve: Mock, answer_mapping: dns.resolver.Answer) -> None: |
| 66 | + mock_dns_resolver_resolve.return_value = answer_mapping |
| 67 | + mapping_key = get_key("devnet", "mapping") |
| 68 | + assert mapping_key == "BmA9Z6FjioHJPpjT39QazZyhDRUdZy2ezwx4GiDdE2u2" |
| 69 | + |
| 70 | + |
| 71 | +def test_utils_get_mapping_key_not_found(mock_dns_resolver_resolve: Mock, |
| 72 | + answer_mapping: dns.resolver.Answer, |
| 73 | + caplog: LogCaptureFixture) -> None: |
| 74 | + mock_dns_resolver_resolve.side_effect = dns.resolver.NXDOMAIN |
| 75 | + exc_message = f'TXT record for {str(answer_mapping.response.canonical_name())[:-1]} not found' |
| 76 | + key = get_key("devnet", "mapping") |
| 77 | + assert exc_message in caplog.text |
| 78 | + assert key == "" |
| 79 | + |
| 80 | + |
| 81 | +def test_utils_get_mapping_key_invalid_number(mock_dns_resolver_resolve: Mock, |
| 82 | + answer_mapping: dns.resolver.Answer, |
| 83 | + caplog: LogCaptureFixture) -> None: |
| 84 | + answer_mapping.rrset = None |
| 85 | + mock_dns_resolver_resolve.return_value = answer_mapping |
| 86 | + exc_message = f'Invalid number of records returned for {str(answer_mapping.response.canonical_name())[:-1]}!' |
| 87 | + key = get_key("devnet", "mapping") |
| 88 | + assert exc_message in caplog.text |
| 89 | + assert key == "" |
0 commit comments