mirror of
				https://github.com/github/octodns.git
				synced 2024-05-11 05:55:00 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			145 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#
 | 
						|
#
 | 
						|
#
 | 
						|
 | 
						|
from unittest import TestCase
 | 
						|
 | 
						|
from octodns.record import Record
 | 
						|
from octodns.record.exception import ValidationError
 | 
						|
from octodns.record.txt import TxtRecord
 | 
						|
from octodns.zone import Zone
 | 
						|
 | 
						|
 | 
						|
class TestRecordTxt(TestCase):
 | 
						|
    zone = Zone('unit.tests.', [])
 | 
						|
 | 
						|
    def assertMultipleValues(self, _type, a_values, b_value):
 | 
						|
        a_data = {'ttl': 30, 'values': a_values}
 | 
						|
        a = _type(self.zone, 'a', a_data)
 | 
						|
        self.assertEqual('a', a.name)
 | 
						|
        self.assertEqual('a.unit.tests.', a.fqdn)
 | 
						|
        self.assertEqual(30, a.ttl)
 | 
						|
        self.assertEqual(a_values, a.values)
 | 
						|
        self.assertEqual(a_data, a.data)
 | 
						|
 | 
						|
        b_data = {'ttl': 30, 'value': b_value}
 | 
						|
        b = _type(self.zone, 'b', b_data)
 | 
						|
        self.assertEqual([b_value], b.values)
 | 
						|
        self.assertEqual(b_data, b.data)
 | 
						|
 | 
						|
    def test_txt(self):
 | 
						|
        a_values = ['a one', 'a two']
 | 
						|
        b_value = 'b other'
 | 
						|
        self.assertMultipleValues(TxtRecord, a_values, b_value)
 | 
						|
 | 
						|
    def test_validation(self):
 | 
						|
        # doesn't blow up (name & zone here don't make any sense, but not
 | 
						|
        # important)
 | 
						|
        Record.new(
 | 
						|
            self.zone,
 | 
						|
            '',
 | 
						|
            {
 | 
						|
                'type': 'TXT',
 | 
						|
                'ttl': 600,
 | 
						|
                'values': [
 | 
						|
                    'hello world',
 | 
						|
                    'this has some\\; semi-colons\\; in it',
 | 
						|
                ],
 | 
						|
            },
 | 
						|
        )
 | 
						|
 | 
						|
        # missing value
 | 
						|
        with self.assertRaises(ValidationError) as ctx:
 | 
						|
            Record.new(self.zone, '', {'type': 'TXT', 'ttl': 600})
 | 
						|
        self.assertEqual(['missing value(s)'], ctx.exception.reasons)
 | 
						|
 | 
						|
        # missing escapes
 | 
						|
        with self.assertRaises(ValidationError) as ctx:
 | 
						|
            Record.new(
 | 
						|
                self.zone,
 | 
						|
                '',
 | 
						|
                {
 | 
						|
                    'type': 'TXT',
 | 
						|
                    'ttl': 600,
 | 
						|
                    'value': 'this has some; semi-colons\\; in it',
 | 
						|
                },
 | 
						|
            )
 | 
						|
        self.assertEqual(
 | 
						|
            ['unescaped ; in "this has some; semi-colons\\; in it"'],
 | 
						|
            ctx.exception.reasons,
 | 
						|
        )
 | 
						|
 | 
						|
    def test_long_value_chunking(self):
 | 
						|
        expected = (
 | 
						|
            '"Lorem ipsum dolor sit amet, consectetur adipiscing '
 | 
						|
            'elit, sed do eiusmod tempor incididunt ut labore et dolore '
 | 
						|
            'magna aliqua. Ut enim ad minim veniam, quis nostrud '
 | 
						|
            'exercitation ullamco laboris nisi ut aliquip ex ea commodo '
 | 
						|
            'consequat. Duis aute irure dolor i" "n reprehenderit in '
 | 
						|
            'voluptate velit esse cillum dolore eu fugiat nulla pariatur. '
 | 
						|
            'Excepteur sint occaecat cupidatat non proident, sunt in culpa '
 | 
						|
            'qui officia deserunt mollit anim id est laborum."'
 | 
						|
        )
 | 
						|
 | 
						|
        long_value = (
 | 
						|
            'Lorem ipsum dolor sit amet, consectetur adipiscing '
 | 
						|
            'elit, sed do eiusmod tempor incididunt ut labore et dolore '
 | 
						|
            'magna aliqua. Ut enim ad minim veniam, quis nostrud '
 | 
						|
            'exercitation ullamco laboris nisi ut aliquip ex ea commodo '
 | 
						|
            'consequat. Duis aute irure dolor in reprehenderit in '
 | 
						|
            'voluptate velit esse cillum dolore eu fugiat nulla '
 | 
						|
            'pariatur. Excepteur sint occaecat cupidatat non proident, '
 | 
						|
            'sunt in culpa qui officia deserunt mollit anim id est '
 | 
						|
            'laborum.'
 | 
						|
        )
 | 
						|
        # Single string
 | 
						|
        single = Record.new(
 | 
						|
            self.zone,
 | 
						|
            '',
 | 
						|
            {
 | 
						|
                'type': 'TXT',
 | 
						|
                'ttl': 600,
 | 
						|
                'values': [
 | 
						|
                    'hello world',
 | 
						|
                    long_value,
 | 
						|
                    'this has some\\; semi-colons\\; in it',
 | 
						|
                ],
 | 
						|
            },
 | 
						|
        )
 | 
						|
        self.assertEqual(3, len(single.values))
 | 
						|
        self.assertEqual(3, len(single.chunked_values))
 | 
						|
        # Note we are checking that this normalizes the chunking, not that we
 | 
						|
        # get out what we put in.
 | 
						|
        self.assertEqual(expected, single.chunked_values[0])
 | 
						|
 | 
						|
        long_split_value = (
 | 
						|
            '"Lorem ipsum dolor sit amet, consectetur '
 | 
						|
            'adipiscing elit, sed do eiusmod tempor incididunt ut '
 | 
						|
            'labore et dolore magna aliqua. Ut enim ad minim veniam, '
 | 
						|
            'quis nostrud exercitation ullamco laboris nisi ut aliquip '
 | 
						|
            'ex" " ea commodo consequat. Duis aute irure dolor in '
 | 
						|
            'reprehenderit in voluptate velit esse cillum dolore eu '
 | 
						|
            'fugiat nulla pariatur. Excepteur sint occaecat cupidatat '
 | 
						|
            'non proident, sunt in culpa qui officia deserunt mollit '
 | 
						|
            'anim id est laborum."'
 | 
						|
        )
 | 
						|
        # Chunked
 | 
						|
        chunked = Record.new(
 | 
						|
            self.zone,
 | 
						|
            '',
 | 
						|
            {
 | 
						|
                'type': 'TXT',
 | 
						|
                'ttl': 600,
 | 
						|
                'values': [
 | 
						|
                    '"hello world"',
 | 
						|
                    long_split_value,
 | 
						|
                    '"this has some\\; semi-colons\\; in it"',
 | 
						|
                ],
 | 
						|
            },
 | 
						|
        )
 | 
						|
        self.assertEqual(expected, chunked.chunked_values[0])
 | 
						|
        # should be single values, no quoting
 | 
						|
        self.assertEqual(single.values, chunked.values)
 | 
						|
        # should be chunked values, with quoting
 | 
						|
        self.assertEqual(single.chunked_values, chunked.chunked_values)
 |