#
|
|
#
|
|
#
|
|
|
|
from unittest import TestCase
|
|
|
|
from octodns.processor.base import ProcessorException
|
|
from octodns.processor.zone import DynamicZoneConfigProcessor
|
|
|
|
|
|
class _GetSourcesMock:
|
|
def __init__(self, sources=[]):
|
|
self.data = {}
|
|
self.sources = sources
|
|
self.called = 0
|
|
|
|
def get_sources(self, name, config):
|
|
self.data[name] = config
|
|
self.called += 1
|
|
return self.sources
|
|
|
|
|
|
class _ListZonesMock:
|
|
id = '_ListZonesMock'
|
|
|
|
def __init__(self, zones):
|
|
self.zones = zones
|
|
self.called = 0
|
|
|
|
def list_zones(self):
|
|
self.called += 1
|
|
return self.zones
|
|
|
|
|
|
class _NoListZonesMock:
|
|
id = '_NoListZonesMock'
|
|
|
|
|
|
class BaseProcessorTest(TestCase):
|
|
proc = DynamicZoneConfigProcessor('test')
|
|
|
|
def test_process_zone_config_empty(self):
|
|
mock = _GetSourcesMock()
|
|
|
|
zones = {}
|
|
got = self.proc.process_zone_config(zones, mock.get_sources)
|
|
self.assertFalse(mock.called)
|
|
self.assertIs(zones, got)
|
|
|
|
def test_process_zone_config_static(self):
|
|
mock = _GetSourcesMock()
|
|
|
|
zones = {'unit.tests.': {'key': 'value'}}
|
|
got = self.proc.process_zone_config(zones, mock.get_sources)
|
|
self.assertFalse(mock.called)
|
|
self.assertIs(zones, got)
|
|
|
|
def test_process_zone_config_dynamic(self):
|
|
lz_mock = _ListZonesMock(
|
|
[
|
|
'dynamic1.unit.tests.',
|
|
'dynamic2.unit.tests.',
|
|
'existing.unit.tests.',
|
|
]
|
|
)
|
|
gs_mock = _GetSourcesMock([lz_mock])
|
|
|
|
zones = {
|
|
'*': {'type': 'dynamic'},
|
|
'unit.tests.': {'type': 'static'},
|
|
'existing.unit.tests.': {'type': 'exsiting'},
|
|
}
|
|
got = self.proc.process_zone_config(zones, gs_mock.get_sources)
|
|
self.assertEqual(1, gs_mock.called)
|
|
self.assertEqual({'*': {'type': 'dynamic'}}, gs_mock.data)
|
|
self.assertEqual(1, lz_mock.called)
|
|
|
|
self.assertIs(zones, got)
|
|
self.assertEqual({'type': 'dynamic'}, got['dynamic1.unit.tests.'])
|
|
self.assertEqual({'type': 'dynamic'}, got['dynamic2.unit.tests.'])
|
|
|
|
def test_process_zone_config_dynamic_prefix(self):
|
|
lz_mock = _ListZonesMock(['dyn-pre.unit.tests.'])
|
|
gs_mock = _GetSourcesMock([lz_mock])
|
|
|
|
zones = {'*.foo': {'type': 'dynamic-too'}}
|
|
got = self.proc.process_zone_config(zones, gs_mock.get_sources)
|
|
self.assertEqual(1, gs_mock.called)
|
|
self.assertEqual({'*.foo': {'type': 'dynamic-too'}}, gs_mock.data)
|
|
self.assertEqual(1, lz_mock.called)
|
|
|
|
self.assertIs(zones, got)
|
|
from pprint import pprint
|
|
|
|
pprint(got)
|
|
self.assertEqual({'type': 'dynamic-too'}, got['dyn-pre.unit.tests.'])
|
|
|
|
def test_process_zone_config_no_list_zones(self):
|
|
gs_mock = _GetSourcesMock([_NoListZonesMock()])
|
|
|
|
zones = {'*': {'type': 'dynamic'}}
|
|
with self.assertRaises(ProcessorException) as ctx:
|
|
self.proc.process_zone_config(zones, gs_mock.get_sources)
|
|
self.assertEqual(
|
|
'dynamic zone=* includes a source, _NoListZonesMock, that does not support `list_zones`',
|
|
str(ctx.exception),
|
|
)
|