# -*- coding: utf-8 -*-

# Import Python libs
from __future__ import absolute_import, print_function, unicode_literals

# Import Salt Testing libs
from tests.support.mixins import LoaderModuleMockMixin
from tests.support.unit import skipIf, TestCase

# Import Salt libs
import salt.state
from salt.config import minion_config
from salt.template import compile_template_str
import salt.serializers.yamlex as yamlex

basic_template = '''#!yamlex
foo: bar
'''

complex_template = '''#!yamlex
placeholder: {foo: !aggregate {foo: 42}}
placeholder: {foo: !aggregate {bar: null}}
placeholder: {foo: !aggregate {baz: inga}}
'''

SKIP_MESSAGE = '%s is unavailable, do prerequisites have been met?'


class RendererMixin(object):
    def render(self, template, opts=None):
        _config = minion_config(None)
        _config['file_client'] = 'local'
        if opts:
            _config.update(opts)
        _state = salt.state.State(_config)
        return compile_template_str(template,
                                    _state.rend,
                                    _state.opts['renderer'],
                                    _state.opts['renderer_blacklist'],
                                    _state.opts['renderer_whitelist'])


class RendererTests(TestCase, RendererMixin, LoaderModuleMockMixin):

    def setup_loader_modules(self):
        return {yamlex: {}}

    @skipIf(not yamlex.available, SKIP_MESSAGE % 'yamlex')
    def test_basic(self):
        sls_obj = self.render(basic_template)
        assert sls_obj == {'foo': 'bar'}, sls_obj

    @skipIf(not yamlex.available, SKIP_MESSAGE % 'yamlex')
    def test_complex(self):

        sls_obj = self.render(complex_template)
        assert sls_obj == {
            'placeholder': {
                'foo': {
                    'foo': 42,
                    'bar': None,
                    'baz': 'inga'
                }
            }
        }, sls_obj
