212 lines
8.7 KiB
Python
212 lines
8.7 KiB
Python
# Copyright (c) 2018 Red Hat, Inc.
|
|
#
|
|
# This file is part of ARA Records Ansible.
|
|
#
|
|
# ARA is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# ARA is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with ARA. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
import datetime
|
|
import six
|
|
import ara.models as m
|
|
|
|
from ara.tests.unit.common import TestAra
|
|
from ara.tests.unit.common import ansible_run
|
|
|
|
|
|
class TestFilters(TestAra):
|
|
'''Tests for our Jinja2 filters'''
|
|
def setUp(self):
|
|
super(TestFilters, self).setUp()
|
|
self.env = self.app.jinja_env
|
|
|
|
def tearDown(self):
|
|
super(TestFilters, self).tearDown()
|
|
|
|
def test_datefmt(self):
|
|
datestr = '2016-05-25 14:34:00'
|
|
date = datetime.datetime.strptime(datestr, '%Y-%m-%d %H:%M:%S')
|
|
t = self.env.from_string('{{ date | datefmt }}')
|
|
res = t.render(date=date)
|
|
|
|
self.assertEqual(res, datestr)
|
|
|
|
def test_datefmt_none(self):
|
|
t = self.env.from_string('{{ date | datefmt }}')
|
|
res = t.render(date=None)
|
|
|
|
self.assertEqual(res, 'n/a')
|
|
|
|
def test_timefmt(self):
|
|
time = datetime.timedelta(seconds=90061)
|
|
t = self.env.from_string('{{ time | timefmt }}')
|
|
res = t.render(time=time)
|
|
|
|
self.assertEqual(res, '1 day, 1:01:01')
|
|
|
|
def test_timefmt_none(self):
|
|
t = self.env.from_string('{{ time | timefmt }}')
|
|
res = t.render(time=None)
|
|
|
|
self.assertEqual(res, 'n/a')
|
|
|
|
def test_from_json_safe(self):
|
|
data = '{"key": "value"}'
|
|
t = self.env.from_string('{{ data | from_json | safe }}')
|
|
res = t.render(data=data)
|
|
|
|
# TODO: Figure out the difference between py2 and py3
|
|
if six.PY2:
|
|
expected = "{u'key': u'value'}"
|
|
else:
|
|
expected = "{'key': 'value'}"
|
|
self.assertEqual(res, expected)
|
|
|
|
def test_from_json_escape(self):
|
|
data = '{"key": "value"}'
|
|
t = self.env.from_string('{{ data | from_json | escape }}')
|
|
res = t.render(data=data)
|
|
|
|
# TODO: Figure out the difference between py2 and py3
|
|
if six.PY2:
|
|
expected = "{u'key': u'value'}"
|
|
else:
|
|
expected = "{'key': 'value'}"
|
|
|
|
self.assertEqual(res, expected)
|
|
|
|
def test_to_json_safe(self):
|
|
data = {'key': 'value'}
|
|
t = self.env.from_string('{{ data | to_nice_json | safe }}')
|
|
res = t.render(data=data)
|
|
|
|
self.assertEqual(res, '{\n "key": "value"\n}')
|
|
|
|
def test_to_json_escape(self):
|
|
data = {'key': 'value'}
|
|
t = self.env.from_string('{{ data | to_nice_json | escape }}')
|
|
res = t.render(data=data)
|
|
|
|
self.assertEqual(res, '{\n "key": "value"\n}')
|
|
|
|
def test_to_json_from_string(self):
|
|
data = '{"key": "value"}'
|
|
t = self.env.from_string('{{ data | to_nice_json | safe }}')
|
|
res = t.render(data=data)
|
|
|
|
self.assertEqual(res, '{\n "key": "value"\n}')
|
|
|
|
def test_to_json_from_invalid_string(self):
|
|
# json.dumps does not raise exception on a non-json string,
|
|
# it just returns an unicode string
|
|
data = "definitely not json"
|
|
t = self.env.from_string('{{ data | to_nice_json | safe }}')
|
|
res = t.render(data=data)
|
|
|
|
self.assertEqual(res, '"definitely not json"')
|
|
|
|
def test_jinja_pygments_formatter_string_simple(self):
|
|
data = "string"
|
|
t = self.env.from_string('{{ data | pygments_formatter | safe }}')
|
|
res = t.render(data=data)
|
|
|
|
# This is ugly, sorry
|
|
expected = '''<div class="codehilite"><pre><span></span>string\n</pre></div>\n''' # noqa
|
|
self.assertEqual(res, expected)
|
|
|
|
def test_jinja_pygments_formatter_string_json(self):
|
|
data = '{"one": "value", "two": "value"}'
|
|
t = self.env.from_string('{{ data | pygments_formatter | safe }}')
|
|
res = t.render(data=data)
|
|
|
|
# This is ugly, sorry
|
|
if six.PY2:
|
|
expected = '''<div class="codehilite"><pre><span></span><span class="p">{</span>\n <span class="nt">"one"</span><span class="p">:</span> <span class="s2">"value"</span><span class="p">,</span> \n <span class="nt">"two"</span><span class="p">:</span> <span class="s2">"value"</span>\n<span class="p">}</span>\n</pre></div>\n''' # noqa
|
|
else:
|
|
expected = '''<div class="codehilite"><pre><span></span><span class="p">{</span>\n <span class="nt">"one"</span><span class="p">:</span> <span class="s2">"value"</span><span class="p">,</span>\n <span class="nt">"two"</span><span class="p">:</span> <span class="s2">"value"</span>\n<span class="p">}</span>\n</pre></div>\n''' # noqa
|
|
self.assertEqual(res, expected)
|
|
|
|
def test_jinja_pygments_formatter_unicode(self):
|
|
data = u"string"
|
|
t = self.env.from_string('{{ data | pygments_formatter | safe }}')
|
|
res = t.render(data=data)
|
|
|
|
# This is ugly, sorry
|
|
expected = '''<div class="codehilite"><pre><span></span>string\n</pre></div>\n''' # noqa
|
|
self.assertEqual(res, expected)
|
|
|
|
def test_jinja_pygments_formatter_list(self):
|
|
data = ['one', 'two']
|
|
t = self.env.from_string('{{ data | pygments_formatter | safe }}')
|
|
res = t.render(data=data)
|
|
|
|
# This is ugly, sorry
|
|
if six.PY2:
|
|
expected = '''<div class="codehilite"><pre><span></span><span class="p">[</span>\n <span class="s2">"one"</span><span class="p">,</span> \n <span class="s2">"two"</span>\n<span class="p">]</span>\n</pre></div>\n''' # noqa
|
|
else:
|
|
expected = '''<div class="codehilite"><pre><span></span><span class="p">[</span>\n <span class="s2">"one"</span><span class="p">,</span>\n <span class="s2">"two"</span>\n<span class="p">]</span>\n</pre></div>\n''' # noqa
|
|
self.assertEqual(res, expected)
|
|
|
|
def test_jinja_pygments_formatter_dict(self):
|
|
data = {'one': 'value', 'two': 'value'}
|
|
t = self.env.from_string('{{ data | pygments_formatter | safe }}')
|
|
res = t.render(data=data)
|
|
|
|
# This is ugly, sorry
|
|
if six.PY2:
|
|
expected = '''<div class="codehilite"><pre><span></span><span class="p">{</span>\n <span class="nt">"one"</span><span class="p">:</span> <span class="s2">"value"</span><span class="p">,</span> \n <span class="nt">"two"</span><span class="p">:</span> <span class="s2">"value"</span>\n<span class="p">}</span>\n</pre></div>\n''' # noqa
|
|
else:
|
|
expected = '''<div class="codehilite"><pre><span></span><span class="p">{</span>\n <span class="nt">"one"</span><span class="p">:</span> <span class="s2">"value"</span><span class="p">,</span>\n <span class="nt">"two"</span><span class="p">:</span> <span class="s2">"value"</span>\n<span class="p">}</span>\n</pre></div>\n''' # noqa
|
|
self.assertEqual(res, expected)
|
|
|
|
def test_jinja_pygments_formatter_integer(self):
|
|
data = 1
|
|
t = self.env.from_string('{{ data | pygments_formatter | safe }}')
|
|
res = t.render(data=data)
|
|
|
|
# This is ugly, sorry
|
|
expected = '''<div class="codehilite"><pre><span></span>1\n</pre></div>\n''' # noqa
|
|
self.assertEqual(res, expected)
|
|
|
|
def test_jinja_pygments_formatter_boolean(self):
|
|
data = True
|
|
t = self.env.from_string('{{ data | pygments_formatter | safe }}')
|
|
res = t.render(data=data)
|
|
|
|
# This is ugly, sorry
|
|
expected = '''<div class="codehilite"><pre><span></span>True\n</pre></div>\n''' # noqa
|
|
self.assertEqual(res, expected)
|
|
|
|
def test_jinja_yamlhighlight(self):
|
|
data = """- name: Test thing
|
|
hosts: localhost
|
|
tasks:
|
|
- debug:
|
|
msg: "foo-message"""
|
|
t = self.env.from_string('{{ data | yamlhighlight | safe }}')
|
|
res = t.render(data=data)
|
|
|
|
self.assertIn('Test thing', res)
|
|
self.assertIn('localhost', res)
|
|
self.assertIn('foo-message', res)
|
|
|
|
def test_jinja_fast_count(self):
|
|
ansible_run()
|
|
query = m.Task.query
|
|
|
|
normal_count = query.count()
|
|
|
|
t = self.env.from_string('{{ query | fast_count }}')
|
|
fast_count = t.render(query=query)
|
|
|
|
self.assertEqual(normal_count, int(fast_count))
|