wcs/tests/test_templates.py

292 lines
12 KiB
Python

# -*- coding: utf-8 -*-
import datetime
import pytest
from quixote import cleanup
from qommon.template import Template, TemplateError
from wcs.conditions import Condition
from utilities import create_temporary_pub, clean_temporary_pub
def setup_module(module):
cleanup()
global pub
pub = create_temporary_pub()
pub.substitutions.feed(pub)
def teardown_module(module):
clean_temporary_pub()
def test_template():
tmpl = Template('')
assert tmpl.render() == ''
assert tmpl.render({'foo': 'bar'}) == ''
tmpl = Template('zoo')
assert tmpl.render() == 'zoo'
assert tmpl.render({'foo': 'bar'}) == 'zoo'
# django
tmpl = Template('{{ foo }}')
assert tmpl.render() == ''
assert tmpl.render({'foo': 'bar'}) == 'bar'
tmpl = Template('{% if foo %}{{ foo }}{% endif %}')
assert tmpl.render() == ''
assert tmpl.render({'foo': 'bar'}) == 'bar'
# ezt
tmpl = Template('[foo]')
assert tmpl.render() == '[foo]'
assert tmpl.render({'foo': 'bar'}) == 'bar'
tmpl = Template('[if-any foo][foo][end]')
assert tmpl.render() == ''
assert tmpl.render({'foo': 'bar'}) == 'bar'
# mix Django/ezt: Django wins
tmpl = Template('{% if foo %}{{ foo }}[foo]{% endif %}')
assert tmpl.render({'foo': 'bar'}) == 'bar[foo]'
# django syntax error
with pytest.raises(TemplateError):
tmpl = Template('{% if foo %}{{ foo }}{% end %}', raises=True)
tmpl = Template('{% if foo %}{{ foo }}{% end %}')
assert tmpl.render({'foo': 'bar'}) == '{% if foo %}{{ foo }}{% end %}'
# ezt syntax error
with pytest.raises(TemplateError):
tmpl = Template('[if-any foo][foo][endif]', raises=True)
tmpl = Template('[if-any foo][foo][endif]')
assert tmpl.render({'foo': 'bar'}) == '[if-any foo][foo][endif]'
def test_now_and_today_variables():
# create a today string, verify it contains the year, at least
today = Template('{{d}}').render({'d': datetime.date.today()})
assert datetime.date.today().strftime('%Y') in today
tmpl = Template('{{ today }}')
for mode in (None, 'lazy'):
context = pub.substitutions.get_context_variables(mode=mode)
assert tmpl.render(context) == today
tmpl = Template('{{ now }}')
for mode in (None, 'lazy'):
context = pub.substitutions.get_context_variables(mode=mode)
assert today in tmpl.render(context) # contains the date,
assert tmpl.render(context) != today # but not only
# ezt templates (legacy)
today = Template('[t]').render({'t': datetime.date.today()})
assert today == datetime.date.today().strftime('%Y-%m-%d')
now = Template('[n]').render({'n': datetime.datetime.now()})
assert now == datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
tmpl = Template('[today]')
for mode in (None, 'lazy'):
context = pub.substitutions.get_context_variables(mode=mode)
assert tmpl.render(context) == today
tmpl = Template('[now]')
for mode in (None, 'lazy'):
context = pub.substitutions.get_context_variables(mode=mode)
assert tmpl.render(context) == now
def test_template_templatetag():
# check qommon templatetags are always loaded
tmpl = Template('{{ date|parse_datetime|date:"Y" }}')
assert tmpl.render({'date': '2018-06-06'}) == '2018'
# check other templatetags can be loaded
tmpl = Template('{% load i18n %}{% trans "hello" %}')
assert tmpl.render() == 'hello'
def test_startswith_templatetag():
tmpl = Template('{% if foo|startswith:"bar" %}hello{% endif %}')
assert tmpl.render() == ''
assert tmpl.render({'foo': 'bar-baz'}) == 'hello'
assert tmpl.render({'foo': 'baz-bar'}) == ''
def test_split_templatetag():
tmpl = Template('{{ foo|split|last }}')
assert tmpl.render() == ''
assert tmpl.render({'foo': 'bar baz'}) == 'baz'
assert tmpl.render({'foo': 'baz-bar'}) == 'baz-bar'
tmpl = Template('{{ foo|split:"-"|last }}')
assert tmpl.render() == ''
assert tmpl.render({'foo': 'bar-baz'}) == 'baz'
assert tmpl.render({'foo': 'baz-bar'}) == 'bar'
def test_template_encoding():
# django
tmpl = Template('{{ foo }} à vélo')
assert tmpl.render() == ' à vélo'
assert tmpl.render({'foo': 'fou'}) == 'fou à vélo'
assert tmpl.render({'foo': 'félé'}) == 'félé à vélo'
tmpl = Template("{% if foo == 'félé' %}à vélo{% endif %}")
assert tmpl.render() == ''
assert tmpl.render({'foo': 'fou'}) == ''
assert tmpl.render({'foo': 'félé'}) == 'à vélo'
tmpl = Template("{% if foo.bar == 'félé' %}à vélo{% endif %}")
assert tmpl.render() == ''
assert tmpl.render({'foo': {'bar': 'fou'}}) == ''
assert tmpl.render({'foo': {'bar': 'félé'}}) == 'à vélo'
# ezt
tmpl = Template('[foo] à vélo')
assert tmpl.render() == '[foo] à vélo'
assert tmpl.render({'foo': 'fou'}) == 'fou à vélo'
assert tmpl.render({'foo': 'félé'}) == 'félé à vélo'
def test_datetime_templatetags():
tmpl = Template('{{ plop|datetime }}')
assert tmpl.render({'plop': '2017-12-21 10:32'}) == 'Dec. 21, 2017, 10:32 a.m.'
assert tmpl.render({'plop': '21/12/2017 10h32'}) == 'Dec. 21, 2017, 10:32 a.m.'
assert tmpl.render({'plop': '2017-12-21'}) == 'Dec. 21, 2017, midnight'
assert tmpl.render({'plop': '21/12/2017'}) == 'Dec. 21, 2017, midnight'
assert tmpl.render({'plop': '10h32'}) == ''
assert tmpl.render({'plop': 'x'}) == ''
assert tmpl.render({'plop': None}) == ''
assert tmpl.render({'plop': 3}) == ''
assert tmpl.render({'plop': {'foo': 'bar'}}) == ''
assert tmpl.render() == ''
tmpl = Template('{{ plop|datetime:"d i" }}')
assert tmpl.render({'plop': '2017-12-21 10:32'}) == '21 32'
assert tmpl.render({'plop': '2017-12-21 10:32:42'}) == '21 32'
assert tmpl.render({'plop': '21/12/2017 10:32'}) == '21 32'
assert tmpl.render({'plop': '21/12/2017 10:32:42'}) == '21 32'
assert tmpl.render({'plop': '21/12/2017 10h32'}) == '21 32'
assert tmpl.render({'plop': '21/12/2017'}) == '21 00'
assert tmpl.render({'plop': '10h32'}) == ''
assert tmpl.render({'plop': 'x'}) == ''
assert tmpl.render({'plop': None}) == ''
assert tmpl.render({'plop': 3}) == ''
assert tmpl.render({'plop': {'foo': 'bar'}}) == ''
assert tmpl.render() == ''
tmpl = Template('{% if d1|datetime > d2|datetime %}d1>d2{% else %}d1<=d2{% endif %}')
assert tmpl.render({'d1': '2017-12-22', 'd2': '2017-12-21'}) == 'd1>d2'
assert tmpl.render({'d1': '2017-12-21', 'd2': '2017-12-21'}) == 'd1<=d2'
assert tmpl.render({'d1': '2017-12-21 10:30', 'd2': '2017-12-21 09:00'}) == 'd1>d2'
assert tmpl.render({'d1': '2017-12-21 10:30', 'd2': '2017-12-21'}) == 'd1>d2'
assert tmpl.render({'d1': '2017-12-22'}) == 'd1<=d2'
assert tmpl.render({'d2': '2017-12-22'}) == 'd1<=d2'
tmpl = Template('{{ plop|date }}')
assert tmpl.render({'plop': '2017-12-21'}) == 'Dec. 21, 2017'
assert tmpl.render({'plop': '21/12/2017'}) == 'Dec. 21, 2017'
assert tmpl.render({'plop': '2017-12-21 10:32'}) == 'Dec. 21, 2017'
assert tmpl.render({'plop': '21/12/2017 10:32'}) == 'Dec. 21, 2017'
assert tmpl.render({'plop': '21/12/2017 10h32'}) == 'Dec. 21, 2017'
assert tmpl.render({'plop': '21/12/2017 10:32:42'}) == 'Dec. 21, 2017'
assert tmpl.render({'plop': '10:32'}) == ''
assert tmpl.render({'plop': 'x'}) == ''
assert tmpl.render({'plop': None}) == ''
assert tmpl.render({'plop': 3}) == ''
assert tmpl.render({'plop': {'foo': 'bar'}}) == ''
assert tmpl.render() == ''
tmpl = Template('{{ plop|date:"d" }}')
assert tmpl.render({'plop': '2017-12-21'}) == '21'
assert tmpl.render({'plop': '21/12/2017'}) == '21'
assert tmpl.render({'plop': '2017-12-21 10:32'}) == '21'
assert tmpl.render({'plop': '10:32'}) == ''
assert tmpl.render({'plop': 'x'}) == ''
assert tmpl.render({'plop': None}) == ''
assert tmpl.render({'plop': 3}) == ''
assert tmpl.render({'plop': {'foo': 'bar'}}) == ''
assert tmpl.render() == ''
tmpl = Template('{% if d1|date > d2|date %}d1>d2{% else %}d1<=d2{% endif %}')
assert tmpl.render({'d1': '2017-12-22', 'd2': '2017-12-21'}) == 'd1>d2'
assert tmpl.render({'d1': '2017-12-21', 'd2': '2017-12-21'}) == 'd1<=d2'
assert tmpl.render({'d1': '2017-12-22'}) == 'd1<=d2'
assert tmpl.render({'d2': '2017-12-22'}) == 'd1<=d2'
tmpl = Template('{{ plop|time }}')
assert tmpl.render({'plop': '10:32'}) == '10:32 a.m.'
assert tmpl.render({'plop': '2017-12-21 10:32'}) == '10:32 a.m.'
assert tmpl.render({'plop': '21/12/2017 10h32'}) == '10:32 a.m.'
assert tmpl.render({'plop': '21/12/2017'}) == 'midnight'
assert tmpl.render({'plop': 'x'}) == ''
assert tmpl.render({'plop': None}) == ''
assert tmpl.render({'plop': 3}) == ''
assert tmpl.render({'plop': {'foo': 'bar'}}) == ''
assert tmpl.render() == ''
tmpl = Template('{{ plop|time:"H i" }}')
assert tmpl.render({'plop': '10:32'}) == '10 32'
assert tmpl.render({'plop': '2017-12-21 10:32'}) == '10 32'
assert tmpl.render({'plop': '21/12/2017 10h32'}) == '10 32'
assert tmpl.render({'plop': '21/12/2017'}) == '00 00'
assert tmpl.render({'plop': 'x'}) == ''
assert tmpl.render({'plop': None}) == ''
assert tmpl.render({'plop': 3}) == ''
assert tmpl.render({'plop': {'foo': 'bar'}}) == ''
assert tmpl.render() == ''
# old fashion, with parse_*
tmpl = Template('{{ plop|parse_datetime|date:"d i" }}')
assert tmpl.render({'plop': '2017-12-21 10:32'}) == '21 32'
assert tmpl.render({'plop': '2017-12-21 10:32:42'}) == '21 32'
assert tmpl.render({'plop': '21/12/2017 10:32'}) == '21 32'
assert tmpl.render({'plop': '21/12/2017 10:32:42'}) == '21 32'
assert tmpl.render({'plop': '21/12/2017 10h32'}) == '21 32'
assert tmpl.render({'plop': 'x'}) == ''
assert tmpl.render({'plop': None}) == ''
assert tmpl.render({'plop': 3}) == ''
assert tmpl.render({'plop': {'foo': 'bar'}}) == ''
assert tmpl.render() == ''
tmpl = Template('{{ plop|parse_date|date:"d" }}')
assert tmpl.render({'plop': '2017-12-21'}) == '21'
assert tmpl.render({'plop': '21/12/2017'}) == '21'
assert tmpl.render({'plop': 'x'}) == ''
assert tmpl.render({'plop': None}) == ''
assert tmpl.render({'plop': 3}) == ''
assert tmpl.render({'plop': {'foo': 'bar'}}) == ''
assert tmpl.render() == ''
tmpl = Template('{{ plop|parse_time|date:"H i" }}')
assert tmpl.render({'plop': '10:32'}) == '10 32'
assert tmpl.render({'plop': 'x'}) == ''
assert tmpl.render({'plop': None}) == ''
assert tmpl.render({'plop': 3}) == ''
assert tmpl.render({'plop': {'foo': 'bar'}}) == ''
assert tmpl.render() == ''
def test_variable_unicode_error_handling():
tmpl = Template('{{ form_var_éléphant }}')
assert tmpl.render() == ''
def test_decimal_templatetag():
tmpl = Template('{{ plop|decimal }}')
assert tmpl.render({'plop': 'toto'}) == ''
assert tmpl.render({'plop': '3.14'}) == '3.14'
assert tmpl.render({'plop': '3,14'}) == '3.14'
assert tmpl.render({'plop': 3.14}) == '3.14'
assert tmpl.render({'plop': 12345.678}) == '12345.678'
assert tmpl.render({'plop': None}) == ''
tmpl = Template('{{ plop|decimal:3 }}')
assert tmpl.render({'plop': '3.14'}) == '3.140'
assert tmpl.render({'plop': None}) == ''
tmpl = Template('{{ plop|decimal:"3" }}')
assert tmpl.render({'plop': '3.14'}) == '3.140'
assert tmpl.render({'plop': None}) == ''
tmpl = Template('{% if plop|decimal > 2 %}hello{% endif %}')
assert tmpl.render({'plop': 3}) == 'hello'
assert tmpl.render({'plop': '3'}) == 'hello'
assert tmpl.render({'plop': 2.001}) == 'hello'
assert tmpl.render({'plop': '2.001'}) == 'hello'
assert tmpl.render({'plop': 1}) == ''
assert tmpl.render({'plop': 1.99}) == ''
assert tmpl.render({'plop': '1.99'}) == ''
assert tmpl.render({'plop': 'x'}) == 'hello'
assert tmpl.render({'plop': None}) == 'hello' # will be str > int, always True.