Browse Source

CAA unit tests for provider support

pull/103/head
Ross McFarland 8 years ago
parent
commit
c24c793bcb
No known key found for this signature in database GPG Key ID: 61C10C4FC8FE4A89
8 changed files with 77 additions and 15 deletions
  1. +1
    -1
      octodns/provider/powerdns.py
  2. +5
    -0
      tests/config/unit.tests.yaml
  3. +12
    -0
      tests/fixtures/powerdns-full-data.json
  4. +20
    -2
      tests/test_octodns_provider_dyn.py
  5. +14
    -0
      tests/test_octodns_provider_ns1.py
  6. +3
    -3
      tests/test_octodns_provider_powerdns.py
  7. +21
    -8
      tests/test_octodns_provider_route53.py
  8. +1
    -1
      tests/test_octodns_provider_yaml.py

+ 1
- 1
octodns/provider/powerdns.py View File

@ -68,7 +68,7 @@ class PowerDnsBaseProvider(BaseProvider):
values.append({ values.append({
'flags': flags, 'flags': flags,
'tag': tag, 'tag': tag,
'value': value,
'value': value[1:-1],
}) })
return { return {
'type': rrset['type'], 'type': rrset['type'],


+ 5
- 0
tests/config/unit.tests.yaml View File

@ -31,6 +31,11 @@
values: values:
- 6.2.3.4. - 6.2.3.4.
- 7.2.3.4. - 7.2.3.4.
- type: CAA
values:
- flags: 0
tag: issue
value: ca.unit.tests
_srv._tcp: _srv._tcp:
ttl: 600 ttl: 600
type: SRV type: SRV


+ 12
- 0
tests/fixtures/powerdns-full-data.json View File

@ -230,6 +230,18 @@
], ],
"ttl": 300, "ttl": 300,
"type": "A" "type": "A"
},
{
"comments": [],
"name": "unit.tests.",
"records": [
{
"content": "0 issue \"ca.unit.tests\"",
"disabled": false
}
],
"ttl": 3600,
"type": "CAA"
} }
], ],
"serial": 2017012803, "serial": 2017012803,


+ 20
- 2
tests/test_octodns_provider_dyn.py View File

@ -109,6 +109,14 @@ class TestDynProvider(TestCase):
'weight': 22, 'weight': 22,
'port': 20, 'port': 20,
'target': 'foo-2.unit.tests.' 'target': 'foo-2.unit.tests.'
}]}),
('', {
'type': 'CAA',
'ttl': 308,
'values': [{
'flags': 0,
'tag': 'issue',
'value': 'ca.unit.tests'
}]})): }]})):
expected.add_record(Record.new(expected, name, data)) expected.add_record(Record.new(expected, name, data))
@ -321,6 +329,16 @@ class TestDynProvider(TestCase):
'ttl': 307, 'ttl': 307,
'zone': 'unit.tests', 'zone': 'unit.tests',
}], }],
'caa_records': [{
'fqdn': 'unit.tests',
'rdata': {'flags': 0,
'tag': 'issue',
'value': 'ca.unit.tests'},
'record_id': 12,
'record_type': 'cAA',
'ttl': 308,
'zone': 'unit.tests',
}],
}} }}
] ]
got = Zone('unit.tests.', []) got = Zone('unit.tests.', [])
@ -414,10 +432,10 @@ class TestDynProvider(TestCase):
update_mock.assert_called() update_mock.assert_called()
add_mock.assert_called() add_mock.assert_called()
# Once for each dyn record (8 Records, 2 of which have dual values) # Once for each dyn record (8 Records, 2 of which have dual values)
self.assertEquals(14, len(add_mock.call_args_list))
self.assertEquals(15, len(add_mock.call_args_list))
execute_mock.assert_has_calls([call('/Zone/unit.tests/', 'GET', {}), execute_mock.assert_has_calls([call('/Zone/unit.tests/', 'GET', {}),
call('/Zone/unit.tests/', 'GET', {})]) call('/Zone/unit.tests/', 'GET', {})])
self.assertEquals(9, len(plan.changes))
self.assertEquals(10, len(plan.changes))
execute_mock.reset_mock() execute_mock.reset_mock()


+ 14
- 0
tests/test_octodns_provider_ns1.py View File

@ -96,6 +96,15 @@ class TestNs1Provider(TestCase):
'type': 'NS', 'type': 'NS',
'values': ['ns3.unit.tests.', 'ns4.unit.tests.'], 'values': ['ns3.unit.tests.', 'ns4.unit.tests.'],
})) }))
expected.add(Record.new(zone, '', {
'ttl': 40,
'type': 'CAA',
'value': {
'flags': 0,
'tag': 'issue',
'value': 'ca.unit.tests',
},
}))
nsone_records = [{ nsone_records = [{
'type': 'A', 'type': 'A',
@ -141,6 +150,11 @@ class TestNs1Provider(TestCase):
'ttl': 39, 'ttl': 39,
'short_answers': ['ns3.unit.tests.', 'ns4.unit.tests.'], 'short_answers': ['ns3.unit.tests.', 'ns4.unit.tests.'],
'domain': 'sub.unit.tests.', 'domain': 'sub.unit.tests.',
}, {
'type': 'CAA',
'ttl': 40,
'short_answers': ['0 issue ca.unit.tests'],
'domain': 'unit.tests.',
}] }]
@patch('nsone.NSONE.loadZone') @patch('nsone.NSONE.loadZone')


+ 3
- 3
tests/test_octodns_provider_powerdns.py View File

@ -79,7 +79,7 @@ class TestPowerDnsProvider(TestCase):
source = YamlProvider('test', join(dirname(__file__), 'config')) source = YamlProvider('test', join(dirname(__file__), 'config'))
source.populate(expected) source.populate(expected)
expected_n = len(expected.records) - 1 expected_n = len(expected.records) - 1
self.assertEquals(14, expected_n)
self.assertEquals(15, expected_n)
# No diffs == no changes # No diffs == no changes
with requests_mock() as mock: with requests_mock() as mock:
@ -87,7 +87,7 @@ class TestPowerDnsProvider(TestCase):
zone = Zone('unit.tests.', []) zone = Zone('unit.tests.', [])
provider.populate(zone) provider.populate(zone)
self.assertEquals(14, len(zone.records))
self.assertEquals(15, len(zone.records))
changes = expected.changes(zone, provider) changes = expected.changes(zone, provider)
self.assertEquals(0, len(changes)) self.assertEquals(0, len(changes))
@ -167,7 +167,7 @@ class TestPowerDnsProvider(TestCase):
expected = Zone('unit.tests.', []) expected = Zone('unit.tests.', [])
source = YamlProvider('test', join(dirname(__file__), 'config')) source = YamlProvider('test', join(dirname(__file__), 'config'))
source.populate(expected) source.populate(expected)
self.assertEquals(15, len(expected.records))
self.assertEquals(16, len(expected.records))
# A small change to a single record # A small change to a single record
with requests_mock() as mock: with requests_mock() as mock:


+ 21
- 8
tests/test_octodns_provider_route53.py View File

@ -77,6 +77,12 @@ class TestRoute53Provider(TestCase):
{'ttl': 67, 'type': 'NS', 'values': ['8.2.3.4.', '9.2.3.4.']}), {'ttl': 67, 'type': 'NS', 'values': ['8.2.3.4.', '9.2.3.4.']}),
('sub', ('sub',
{'ttl': 68, 'type': 'NS', 'values': ['5.2.3.4.', '6.2.3.4.']}), {'ttl': 68, 'type': 'NS', 'values': ['5.2.3.4.', '6.2.3.4.']}),
('',
{'ttl': 69, 'type': 'CAA', 'value': {
'flags': 0,
'tag': 'issue',
'value': 'ca.unit.tests'
}}),
): ):
record = Record.new(expected, name, data) record = Record.new(expected, name, data)
expected.add_record(record) expected.add_record(record)
@ -300,6 +306,13 @@ class TestRoute53Provider(TestCase):
'Value': 'ns1.unit.tests.', 'Value': 'ns1.unit.tests.',
}], }],
'TTL': 69, 'TTL': 69,
}, {
'Name': 'unit.tests.',
'Type': 'CAA',
'ResourceRecords': [{
'Value': '0 issue "ca.unit.tests"',
}],
'TTL': 69,
}], }],
'IsTruncated': False, 'IsTruncated': False,
'MaxItems': '100', 'MaxItems': '100',
@ -347,7 +360,7 @@ class TestRoute53Provider(TestCase):
{'HostedZoneId': 'z42'}) {'HostedZoneId': 'z42'})
plan = provider.plan(self.expected) plan = provider.plan(self.expected)
self.assertEquals(8, len(plan.changes))
self.assertEquals(9, len(plan.changes))
for change in plan.changes: for change in plan.changes:
self.assertIsInstance(change, Create) self.assertIsInstance(change, Create)
stubber.assert_no_pending_responses() stubber.assert_no_pending_responses()
@ -366,7 +379,7 @@ class TestRoute53Provider(TestCase):
'SubmittedAt': '2017-01-29T01:02:03Z', 'SubmittedAt': '2017-01-29T01:02:03Z',
}}, {'HostedZoneId': 'z42', 'ChangeBatch': ANY}) }}, {'HostedZoneId': 'z42', 'ChangeBatch': ANY})
self.assertEquals(8, provider.apply(plan))
self.assertEquals(9, provider.apply(plan))
stubber.assert_no_pending_responses() stubber.assert_no_pending_responses()
# Delete by monkey patching in a populate that includes an extra record # Delete by monkey patching in a populate that includes an extra record
@ -579,7 +592,7 @@ class TestRoute53Provider(TestCase):
{}) {})
plan = provider.plan(self.expected) plan = provider.plan(self.expected)
self.assertEquals(8, len(plan.changes))
self.assertEquals(9, len(plan.changes))
for change in plan.changes: for change in plan.changes:
self.assertIsInstance(change, Create) self.assertIsInstance(change, Create)
stubber.assert_no_pending_responses() stubber.assert_no_pending_responses()
@ -626,7 +639,7 @@ class TestRoute53Provider(TestCase):
'SubmittedAt': '2017-01-29T01:02:03Z', 'SubmittedAt': '2017-01-29T01:02:03Z',
}}, {'HostedZoneId': 'z42', 'ChangeBatch': ANY}) }}, {'HostedZoneId': 'z42', 'ChangeBatch': ANY})
self.assertEquals(8, provider.apply(plan))
self.assertEquals(9, provider.apply(plan))
stubber.assert_no_pending_responses() stubber.assert_no_pending_responses()
def test_health_checks_pagination(self): def test_health_checks_pagination(self):
@ -1174,16 +1187,16 @@ class TestRoute53Provider(TestCase):
@patch('octodns.provider.route53.Route53Provider._really_apply') @patch('octodns.provider.route53.Route53Provider._really_apply')
def test_apply_1(self, really_apply_mock): def test_apply_1(self, really_apply_mock):
# 17 RRs with max of 18 should only get applied in one call
provider, plan = self._get_test_plan(18)
# 18 RRs with max of 19 should only get applied in one call
provider, plan = self._get_test_plan(19)
provider.apply(plan) provider.apply(plan)
really_apply_mock.assert_called_once() really_apply_mock.assert_called_once()
@patch('octodns.provider.route53.Route53Provider._really_apply') @patch('octodns.provider.route53.Route53Provider._really_apply')
def test_apply_2(self, really_apply_mock): def test_apply_2(self, really_apply_mock):
# 17 RRs with max of 17 should only get applied in two calls
provider, plan = self._get_test_plan(17)
# 18 RRs with max of 17 should only get applied in two calls
provider, plan = self._get_test_plan(18)
provider.apply(plan) provider.apply(plan)
self.assertEquals(2, really_apply_mock.call_count) self.assertEquals(2, really_apply_mock.call_count)


+ 1
- 1
tests/test_octodns_provider_yaml.py View File

@ -30,7 +30,7 @@ class TestYamlProvider(TestCase):
# without it we see everything # without it we see everything
source.populate(zone) source.populate(zone)
self.assertEquals(15, len(zone.records))
self.assertEquals(16, len(zone.records))
# Assumption here is that a clean round-trip means that everything # Assumption here is that a clean round-trip means that everything
# worked as expected, data that went in came back out and could be # worked as expected, data that went in came back out and could be


Loading…
Cancel
Save