From 11406e88e2be424b68154fd5996826a1fc3808d6 Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sun, 28 Sep 2025 12:43:03 -0700 Subject: [PATCH] More testing of dynamic config regex/lob --- tests/test_octodns_manager.py | 91 +++++++++++++++++++++++++++++++++-- 1 file changed, 87 insertions(+), 4 deletions(-) diff --git a/tests/test_octodns_manager.py b/tests/test_octodns_manager.py index 5ee22a3..6ef1cf5 100644 --- a/tests/test_octodns_manager.py +++ b/tests/test_octodns_manager.py @@ -1489,10 +1489,84 @@ class TestManager(TestCase): manager._get_sources = MagicMock() manager._get_sources.return_value = [mock_source] + # won't match anything + config_n = {'foo': 42, 'glob': r'*.nope.com.'} # match things with .a. config_a = {'foo': 42, 'glob': r'*.a.com.'} # match things with .b. config_b = {'bar': 43, 'glob': r'*.b.com.'} + # will match anything + config_c = {'bar': 43, 'glob': r'*'} + zones = { + '*.nope.com.': config_n, + '*.a.com.': config_a, + '*.b.com.': config_b, + '*': config_c, + } + mock_source.list_zones.return_value = [ + # matched by a + 'one.a.com.', + # matched by a + 'two.a.com.', + # matched by b + 'one.b.com.', + # matched by b + 'two.b.com.', + # matched by c, catch all + 'ignored.com.', + ] + got = manager._preprocess_zones(zones, sources=[]) + # 4 configs + self.assertEqual(4, manager._get_sources.call_count) + # 1 shared source + self.assertEqual(1, mock_source.list_zones.call_count) + self.assertEqual( + { + 'one.a.com.': config_a, + 'two.a.com.': config_a, + 'one.b.com.': config_b, + 'two.b.com.': config_b, + 'ignored.com.': config_c, + }, + got, + ) + + # if we define the catch all first it'll take everything and leave + # nothing for the others + zones = { + '*': config_c, + '*.nope.com.': config_n, + '*.a.com.': config_a, + '*.b.com.': config_b, + } + got = manager._preprocess_zones(zones, sources=[]) + self.assertEqual( + { + 'one.a.com.': config_c, + 'two.a.com.': config_c, + 'one.b.com.': config_c, + 'two.b.com.': config_c, + 'ignored.com.': config_c, + }, + got, + ) + + def test_preprocess_zones_regex(self): + # these will be unused + environ['YAML_TMP_DIR'] = '/tmp' + environ['YAML_TMP_DIR2'] = '/tmp' + manager = Manager(get_config_filename('simple.yaml')) + + manager._get_sources = MagicMock() + mock_source = MagicMock() + mock_source.id = 'mm' + manager._get_sources = MagicMock() + manager._get_sources.return_value = [mock_source] + + # match things with .a. + config_a = {'foo': 42, 'regex': r'\.a\.'} + # match things with .b. + config_b = {'bar': 43, 'regex': r'\.b\.'} zones = {'*.a.com.': config_a, '*.b.com.': config_b} mock_source.list_zones.side_effect = [ [ @@ -1506,7 +1580,7 @@ class TestManager(TestCase): got = manager._preprocess_zones(zones, sources=[]) self.assertEqual(2, manager._get_sources.call_count) self.assertEqual(1, mock_source.list_zones.call_count) - # a will glob match .a.com., b will .b.com., ignored.com. won't match + # a will regex match .a.com., b will .b.com., ignored.com. won't match # anything self.assertEqual( { @@ -1518,7 +1592,7 @@ class TestManager(TestCase): got, ) - def test_preprocess_zones_regex(self): + def test_preprocess_zones_regex_claimed(self): # these will be unused environ['YAML_TMP_DIR'] = '/tmp' environ['YAML_TMP_DIR2'] = '/tmp' @@ -1532,15 +1606,22 @@ class TestManager(TestCase): # match things with .a. config_a = {'foo': 42, 'regex': r'\.a\.'} - # match things with .b. - config_b = {'bar': 43, 'regex': r'\.b\.'} + # match everything + config_b = {'bar': 43, 'regex': r'.*'} zones = {'*.a.com.': config_a, '*.b.com.': config_b} mock_source.list_zones.side_effect = [ [ + # won't match a b/c no . before the a, will match b + 'a.com.', + # will match a, and be claimed 'one.a.com.', + # will match a, and be claimed 'two.a.com.', + # will match b 'one.b.com.', + # will match b 'two.b.com.', + # will match b 'ignored.com.', ] ] @@ -1551,10 +1632,12 @@ class TestManager(TestCase): # anything self.assertEqual( { + 'a.com.': config_b, 'one.a.com.': config_a, 'two.a.com.': config_a, 'one.b.com.': config_b, 'two.b.com.': config_b, + 'ignored.com.': config_b, }, got, )