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

# Import Python libs
from __future__ import absolute_import

# Import Salt Testing libs
from salttesting import skipIf, TestCase
from salttesting.helpers import ensure_in_syspath

ensure_in_syspath('../..')

# Import Salt libs
import salt.state
from salt.config import minion_config
from salt.template import compile_template_str
from salt.serializers import 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'])


class RendererTests(TestCase, RendererMixin):
    @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

if __name__ == '__main__':
    from integration import run_tests
    run_tests(RendererTests, needs_daemon=False)
