# # # from unittest import TestCase from unittest.mock import call, patch from octodns.processor.templating import Templating from octodns.record import Record from octodns.zone import Zone def _find(zone, name): return next(r for r in zone.records if r.name == name) class TemplatingTest(TestCase): def test_cname(self): templ = Templating('test') zone = Zone('unit.tests.', []) cname = Record.new( zone, 'cname', { 'type': 'CNAME', 'ttl': 42, 'value': '_cname.{zone_name}something.else.', }, lenient=True, ) zone.add_record(cname) noop = Record.new( zone, 'noop', { 'type': 'CNAME', 'ttl': 42, 'value': '_noop.nothing_to_do.something.else.', }, lenient=True, ) zone.add_record(noop) got = templ.process_source_zone(zone, None) cname = _find(got, 'cname') self.assertEqual('_cname.unit.tests.something.else.', cname.value) noop = _find(got, 'noop') self.assertEqual('_noop.nothing_to_do.something.else.', noop.value) def test_txt(self): templ = Templating('test') zone = Zone('unit.tests.', []) txt = Record.new( zone, 'txt', { 'type': 'TXT', 'ttl': 42, 'value': 'There are {zone_num_records} record(s) in {zone_name}', }, ) zone.add_record(txt) noop = Record.new( zone, 'noop', {'type': 'TXT', 'ttl': 43, 'value': 'Nothing to template here.'}, ) zone.add_record(noop) got = templ.process_source_zone(zone, None) txt = _find(got, 'txt') self.assertEqual('There are 2 record(s) in unit.tests.', txt.values[0]) noop = _find(got, 'noop') self.assertEqual('Nothing to template here.', noop.values[0]) @patch('octodns.record.TxtValue.template') def test_params(self, mock_template): templ = Templating('test') class DummySource: def __init__(self, id): self.id = id zone = Zone('unit.tests.', []) record_source = DummySource('record') txt = Record.new( zone, 'txt', { 'type': 'TXT', 'ttl': 42, 'value': 'There are {zone_num_records} record(s) in {zone_name}', }, source=record_source, ) zone.add_record(txt) templ.process_source_zone( zone, sources=[record_source, DummySource('other')] ) mock_template.assert_called_once() self.assertEqual( call( { 'record_name': 'txt', 'record_decoded_name': 'txt', 'record_encoded_name': 'txt', 'record_fqdn': 'txt.unit.tests.', 'record_decoded_fqdn': 'txt.unit.tests.', 'record_encoded_fqdn': 'txt.unit.tests.', 'record_type': 'TXT', 'record_ttl': 42, 'record_source_id': 'record', 'zone_name': 'unit.tests.', 'zone_decoded_name': 'unit.tests.', 'zone_encoded_name': 'unit.tests.', 'zone_num_records': 1, 'zone_source_ids': 'record, other', } ), mock_template.call_args, )