salt/tests/unit/utils/test_yamlloader.py
Erik Johnson a0118bcece Remove bytestrings and use textwrap.dedent for readability
PyYAML works with and without bytestrings on PY3, and Python 3 can read
all of the test data as regular strings, so bytestrings are unnecessary
here.

This also adds use of textwrap.dedent to make the YAML easier to read,
so it can be indented away from the far left side of the line.
2017-08-15 11:05:48 -05:00

103 lines
2.9 KiB
Python

# -*- coding: utf-8 -*-
'''
Unit tests for salt.utils.yamlloader.SaltYamlSafeLoader
'''
# Import python libs
from __future__ import absolute_import
import textwrap
# Import Salt Libs
from yaml.constructor import ConstructorError
from salt.utils.yamlloader import SaltYamlSafeLoader
import salt.utils
# Import Salt Testing Libs
from tests.support.unit import TestCase, skipIf
from tests.support.mock import patch, NO_MOCK, NO_MOCK_REASON, mock_open
@skipIf(NO_MOCK, NO_MOCK_REASON)
class YamlLoaderTestCase(TestCase):
'''
TestCase for salt.utils.yamlloader module
'''
@staticmethod
def _render_yaml(data):
'''
Takes a YAML string, puts it into a mock file, passes that to the YAML
SaltYamlSafeLoader and then returns the rendered/parsed YAML data
'''
with patch('salt.utils.fopen', mock_open(read_data=data)) as mocked_file:
with salt.utils.fopen(mocked_file) as mocked_stream:
return SaltYamlSafeLoader(mocked_stream).get_data()
def test_yaml_basics(self):
'''
Test parsing an ordinary path
'''
self.assertEqual(
self._render_yaml(textwrap.dedent('''\
p1:
- alpha
- beta''')),
{'p1': ['alpha', 'beta']}
)
def test_yaml_merge(self):
'''
Test YAML anchors
'''
# Simple merge test
self.assertEqual(
self._render_yaml(textwrap.dedent('''\
p1: &p1
v1: alpha
p2:
<<: *p1
v2: beta''')),
{'p1': {'v1': 'alpha'}, 'p2': {'v1': 'alpha', 'v2': 'beta'}}
)
# Test that keys/nodes are overwritten
self.assertEqual(
self._render_yaml(textwrap.dedent('''\
p1: &p1
v1: alpha
p2:
<<: *p1
v1: new_alpha''')),
{'p1': {'v1': 'alpha'}, 'p2': {'v1': 'new_alpha'}}
)
# Test merging of lists
self.assertEqual(
self._render_yaml(textwrap.dedent('''\
p1: &p1
v1: &v1
- t1
- t2
p2:
v2: *v1''')),
{"p2": {"v2": ["t1", "t2"]}, "p1": {"v1": ["t1", "t2"]}}
)
def test_yaml_duplicates(self):
'''
Test that duplicates still throw an error
'''
with self.assertRaises(ConstructorError):
self._render_yaml(textwrap.dedent('''\
p1: alpha
p1: beta'''))
with self.assertRaises(ConstructorError):
self._render_yaml(textwrap.dedent('''\
p1: &p1
v1: alpha
p2:
<<: *p1
v2: beta
v2: betabeta'''))