combo/tests/test_public_templatetags.py

466 lines
23 KiB
Python

import datetime
import os
import shutil
import time
import pytest
from django.core.files import File
from django.core.files.storage import default_storage
from django.template import Context, Template
from django.test import override_settings
from django.test.client import RequestFactory
from django.contrib.auth.models import User, Group, AnonymousUser
from django.utils.six import StringIO
from combo.data.models import Page
from combo.apps.assets.models import Asset
pytestmark = pytest.mark.django_db
def test_strptime():
t = Template('{{ someday|strptime:"%Y-%m-%d"|date:"Y" }}')
assert t.render(Context({'someday': '2015-04-15'})) == '2015'
assert t.render(Context({'someday': 'foobar'})) == ''
assert t.render(Context({'someday': None})) == ''
assert t.render(Context({'someday': {'foo': 'bar'}})) == ''
assert t.render(Context({'someday': ['foo', 'bar']})) == ''
def test_parse_datetime():
t = Template('{{ someday|parse_datetime|date:"Y m d H i s T" }}')
expected = '2015 04 15 13 11 12 UTC'
assert t.render(Context({'someday': '2015-04-15T13:11:12'})) == expected
assert t.render(Context({'someday': '2015-04-15 13:11:12'})) == expected
assert t.render(Context({'someday': '2015-04-15T13:11:12Z'})) == expected
assert t.render(Context({'someday': '2015-04-15T13:11:12+00:00'})) == expected
assert t.render(Context({'someday': '2015-04-15T13:11:12.12345'})) == expected
assert t.render(Context({'someday': '2015-04-15T13:11:12.12345Z'})) == expected
assert t.render(Context({'someday': '2015-04-15T13:11:12.12345+00:00'})) == expected
assert t.render(Context({'someday': time.localtime(time.mktime((2015, 4, 15, 13, 11, 12, 0, 0, 0)))})) == expected
assert t.render(Context({'someday': '2015-04-15T13:11'})) == '2015 04 15 13 11 00 UTC'
assert t.render(Context({'someday': '2015-04-15T13'})) == ''
assert t.render(Context({'someday': 'foobar'})) == ''
assert t.render(Context({'someday': ''})) == ''
assert t.render(Context({'someday': None})) == ''
assert t.render(Context({'someday': {'foo': 'bar'}})) == ''
assert t.render(Context({'someday': ['foo', 'bar']})) == ''
t = Template('{{ someday|parse_date|date:"Y m d" }}')
expected = '2015 04 15'
assert t.render(Context({'someday': '2015-04-15'})) == expected
assert t.render(Context({'someday': '2015-04-15T13:11:12Z'})) == expected
assert t.render(Context({'someday': 'foobar'})) == ''
assert t.render(Context({'someday': ''})) == ''
assert t.render(Context({'someday': None})) == ''
assert t.render(Context({'someday': {'foo': 'bar'}})) == ''
assert t.render(Context({'someday': ['foo', 'bar']})) == ''
t = Template('{{ someday|parse_time|date:"H i s" }}')
expected = '13 11 12'
assert t.render(Context({'someday': '13:11:12'})) == expected
assert t.render(Context({'someday': '13:11:12Z'})) == expected
assert t.render(Context({'someday': '13:11:12+00:00'})) == expected
assert t.render(Context({'someday': '13:11:12.12345'})) == expected
assert t.render(Context({'someday': '13:11:12.12345Z'})) == expected
assert t.render(Context({'someday': '13:11:12.12345+00:00'})) == expected
assert t.render(Context({'someday': '13:11'})) == '13 11 00'
assert t.render(Context({'someday': '13:99'})) == ''
assert t.render(Context({'someday': '13'})) == ''
assert t.render(Context({'someday': 'foobar'})) == ''
assert t.render(Context({'someday': ''})) == ''
assert t.render(Context({'someday': None})) == ''
assert t.render(Context({'someday': {'foo': 'bar'}})) == ''
assert t.render(Context({'someday': ['foo', 'bar']})) == ''
def test_has_role():
t = Template('{{ request.user|has_role:"Role1" }}')
request = RequestFactory().get('/')
user = User(username='foo', email='foo@example.net')
user.save()
request.user = user
context = Context({'request': request})
assert t.render(context) == 'False'
group = Group(name='Role1')
group.save()
user.groups.add(group)
user.save()
assert t.render(context) == 'True'
t = Template('{{ request.user|has_role:"Role2" }}')
assert t.render(context) == 'False'
group = Group(name='Role2')
group.save()
user.groups.add(group)
user.save()
assert t.render(context) == 'True'
# no request, no user, anonymous user
context = Context()
assert t.render(context) == 'False'
request = RequestFactory().get('/')
context = Context({'request': request})
assert t.render(context) == 'False'
request.user = AnonymousUser()
assert t.render(context) == 'False'
def test_get():
t = Template('{{ foo|get:"foo-bar" }}')
context = Context({'foo': {'foo-bar': 'hello'}})
assert t.render(context) == 'hello'
context = Context({'foo': {'bar-foo': 'hello'}})
assert t.render(context) == 'None'
context = Context({'foo': None})
assert t.render(context) == 'None'
t = Template('{{ foo|get:"foo-bar"|default:"" }}')
context = Context({'foo': {'rab': 'hello'}})
assert t.render(context) == ''
t = Template('{{ foo|get:key }}')
context = Context({'foo': {'foo-bar': 'hello'}, 'key': 'foo-bar'})
assert t.render(context) == 'hello'
def test_split():
t = Template('{% for x in plop|split %}{{x}}<br>{% endfor %}')
assert t.render(Context({'plop': 'ab cd ef'})) == 'ab<br>cd<br>ef<br>'
t = Template('{% for x in plop|split:"|" %}{{x}} {% endfor %}')
assert t.render(Context({'plop': 'ab|cd|ef'})) == 'ab cd ef '
def test_get_group():
context = Context({'cities': [
{'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
{'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
{'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
{'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
{'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]})
t = Template('{% regroup cities by country as country_list %}'
'{% for c in country_list|get_group:"USA" %}{{c.name}},{% endfor %}')
assert t.render(context) == 'New York,Chicago,'
def test_asset_template_tags():
for path in ('uploads', 'assets'):
if os.path.exists(default_storage.path(path)):
shutil.rmtree(default_storage.path(path))
assert Asset.objects.count() == 0
with override_settings(COMBO_ASSET_SLOTS={'collectivity:banner': {'label': 'Banner'}}):
t = Template('''{% load assets %}{% get_asset "collectivity:banner" as banner %}{% if banner %}BANNER{% endif %}''')
assert t.render(Context()) == ''
t = Template('''{% load assets %}{% asset_url "collectivity:banner" %}''')
assert t.render(Context()) == ''
t = Template('''{% load assets %}{% asset_css_url "collectivity:banner" %}''')
assert t.render(Context()) == 'none'
t = Template('''{% load assets %}{% get_asset "collectivity:banner" as banner %}{% if banner %}BANNER{% endif %}''')
Asset(key='collectivity:banner', asset=File(StringIO('test'), 'test.png')).save()
assert t.render(Context()) == 'BANNER'
t = Template('''{% load assets %}{% asset_url "collectivity:banner" %}''')
assert t.render(Context()) == '/media/assets/test.png'
t = Template('''{% load assets %}{% asset_css_url "collectivity:banner" %}''')
assert t.render(Context()) == 'url(/media/assets/test.png)'
page = Page(title='Home', slug='index', template_name='standard')
page.save()
t = Template('''{% load assets %}{% asset_url page.picture "collectivity:banner" %}''')
assert t.render(Context()) == '/media/assets/test.png'
t = Template('''{% load assets %}{% asset_css_url page.picture "collectivity:banner" %}''')
assert t.render(Context()) == 'url(/media/assets/test.png)'
page.picture = File(StringIO('test'), 'test2.png')
page.save()
t = Template('''{% load assets %}{% asset_url page.picture "collectivity:banner" %}''')
assert t.render(Context({'page': page})) == '/media/page-pictures/test2.png'
# pass image to sorl.thumbnail
t = Template('''{% load assets %}{% asset_url page.picture "collectivity:banner" size="200x200" %}''')
assert t.render(Context()).startswith('/media/cache/')
# unless file is missing
os.remove(page.picture.path)
del page.picture.file
t = Template('''{% load assets %}{% asset_url page.picture "collectivity:banner" size="200x200" %}''')
assert t.render(Context({'page': page})) == '/media/page-pictures/test2.png'
# unless it's in SVG
page.picture = File(StringIO('test'), 'test2.svg')
page.save()
t = Template('''{% load assets %}{% asset_url page.picture "collectivity:banner" size="200x200" %}''')
assert t.render(Context({'page': page})) == '/media/page-pictures/test2.svg'
def test_startswith():
t = Template('{% if foo|startswith:"bar" %}ok{% endif %}')
context = Context({'foo': None})
assert t.render(context) == ''
context = Context({'foo': 'xx'})
assert t.render(context) == ''
context = Context({'foo': 'bar'})
assert t.render(context) == 'ok'
def test_datetime_templatetags():
tmpl = Template('{{ plop|datetime }}')
assert tmpl.render(Context({'plop': '2017-12-21 10:32'})) == 'Dec. 21, 2017, 10:32 a.m.'
assert tmpl.render(Context({'plop': '21/12/2017 10h32'})) == 'Dec. 21, 2017, 10:32 a.m.'
assert tmpl.render(Context({'plop': '2017-12-21'})) == 'Dec. 21, 2017, midnight'
assert tmpl.render(Context({'plop': '21/12/2017'})) == 'Dec. 21, 2017, midnight'
assert tmpl.render(Context({'plop': '10h32'})) == ''
assert tmpl.render(Context({'plop': 'x'})) == ''
assert tmpl.render(Context({'plop': None})) == ''
assert tmpl.render(Context({'plop': 3})) == ''
assert tmpl.render(Context({'plop': {'foo': 'bar'}})) == ''
assert tmpl.render(Context()) == ''
tmpl = Template('{{ plop|datetime:"d i" }}')
assert tmpl.render(Context({'plop': '2017-12-21 10:32'})) == '21 32'
assert tmpl.render(Context({'plop': '2017-12-21 10:32:42'})) == '21 32'
assert tmpl.render(Context({'plop': '21/12/2017 10:32'})) == '21 32'
assert tmpl.render(Context({'plop': '21/12/2017 10:32:42'})) == '21 32'
assert tmpl.render(Context({'plop': '21/12/2017 10h32'})) == '21 32'
assert tmpl.render(Context({'plop': '21/12/2017'})) == '21 00'
assert tmpl.render(Context({'plop': '10h32'})) == ''
assert tmpl.render(Context({'plop': 'x'})) == ''
assert tmpl.render(Context({'plop': None})) == ''
assert tmpl.render(Context({'plop': 3})) == ''
assert tmpl.render(Context({'plop': {'foo': 'bar'}})) == ''
assert tmpl.render(Context()) == ''
tmpl = Template('{% if d1|datetime > d2|datetime %}d1>d2{% else %}d1<=d2{% endif %}')
assert tmpl.render(Context({'d1': '2017-12-22', 'd2': '2017-12-21'})) == 'd1>d2'
assert tmpl.render(Context({'d1': '2017-12-21', 'd2': '2017-12-21'})) == 'd1<=d2'
assert tmpl.render(Context({'d1': '2017-12-21 10:30', 'd2': '2017-12-21 09:00'})) == 'd1>d2'
assert tmpl.render(Context({'d1': '2017-12-21 10:30', 'd2': '2017-12-21'})) == 'd1>d2'
assert tmpl.render(Context({'d1': '2017-12-22'})) == 'd1<=d2'
assert tmpl.render(Context({'d2': '2017-12-22'})) == 'd1<=d2'
tmpl = Template('{{ plop|date }}')
assert tmpl.render(Context({'plop': '2017-12-21'})) == 'Dec. 21, 2017'
assert tmpl.render(Context({'plop': '21/12/2017'})) == 'Dec. 21, 2017'
assert tmpl.render(Context({'plop': '2017-12-21 10:32'})) == 'Dec. 21, 2017'
assert tmpl.render(Context({'plop': '21/12/2017 10:32'})) == 'Dec. 21, 2017'
assert tmpl.render(Context({'plop': '21/12/2017 10h32'})) == 'Dec. 21, 2017'
assert tmpl.render(Context({'plop': '21/12/2017 10:32:42'})) == 'Dec. 21, 2017'
assert tmpl.render(Context({'plop': '10:32'})) == ''
assert tmpl.render(Context({'plop': 'x'})) == ''
assert tmpl.render(Context({'plop': None})) == ''
assert tmpl.render(Context({'plop': 3})) == ''
assert tmpl.render(Context({'plop': {'foo': 'bar'}})) == ''
assert tmpl.render(Context()) == ''
tmpl = Template('{{ plop|date:"d" }}')
assert tmpl.render(Context({'plop': '2017-12-21'})) == '21'
assert tmpl.render(Context({'plop': '21/12/2017'})) == '21'
assert tmpl.render(Context({'plop': '2017-12-21 10:32'})) == '21'
assert tmpl.render(Context({'plop': '10:32'})) == ''
assert tmpl.render(Context({'plop': 'x'})) == ''
assert tmpl.render(Context({'plop': None})) == ''
assert tmpl.render(Context({'plop': 3})) == ''
assert tmpl.render(Context({'plop': {'foo': 'bar'}})) == ''
assert tmpl.render(Context()) == ''
tmpl = Template('{% if d1|date > d2|date %}d1>d2{% else %}d1<=d2{% endif %}')
assert tmpl.render(Context({'d1': '2017-12-22', 'd2': '2017-12-21'})) == 'd1>d2'
assert tmpl.render(Context({'d1': '2017-12-21', 'd2': '2017-12-21'})) == 'd1<=d2'
assert tmpl.render(Context({'d1': '2017-12-22'})) == 'd1<=d2'
assert tmpl.render(Context({'d2': '2017-12-22'})) == 'd1<=d2'
tmpl = Template('{{ plop|time }}')
assert tmpl.render(Context({'plop': '10:32'})) == '10:32 a.m.'
assert tmpl.render(Context({'plop': '2017-12-21 10:32'})) == '10:32 a.m.'
assert tmpl.render(Context({'plop': '21/12/2017 10h32'})) == '10:32 a.m.'
assert tmpl.render(Context({'plop': '21/12/2017'})) == 'midnight'
assert tmpl.render(Context({'plop': 'x'})) == ''
assert tmpl.render(Context({'plop': None})) == ''
assert tmpl.render(Context({'plop': 3})) == ''
assert tmpl.render(Context({'plop': {'foo': 'bar'}})) == ''
assert tmpl.render(Context()) == ''
tmpl = Template('{{ plop|time:"H i" }}')
assert tmpl.render(Context({'plop': '10:32'})) == '10 32'
assert tmpl.render(Context({'plop': '2017-12-21 10:32'})) == '10 32'
assert tmpl.render(Context({'plop': '21/12/2017 10h32'})) == '10 32'
assert tmpl.render(Context({'plop': '21/12/2017'})) == '00 00'
assert tmpl.render(Context({'plop': 'x'})) == ''
assert tmpl.render(Context({'plop': None})) == ''
assert tmpl.render(Context({'plop': 3})) == ''
assert tmpl.render(Context({'plop': {'foo': 'bar'}})) == ''
assert tmpl.render(Context()) == ''
# old fashion, with parse_*
tmpl = Template('{{ plop|parse_datetime|date:"d i" }}')
assert tmpl.render(Context({'plop': '2017-12-21 10:32'})) == '21 32'
assert tmpl.render(Context({'plop': '2017-12-21 10:32:42'})) == '21 32'
assert tmpl.render(Context({'plop': '21/12/2017 10:32'})) == '21 32'
assert tmpl.render(Context({'plop': '21/12/2017 10:32:42'})) == '21 32'
assert tmpl.render(Context({'plop': '21/12/2017 10h32'})) == '21 32'
assert tmpl.render(Context({'plop': 'x'})) == ''
assert tmpl.render(Context({'plop': None})) == ''
assert tmpl.render(Context({'plop': 3})) == ''
assert tmpl.render(Context({'plop': {'foo': 'bar'}})) == ''
assert tmpl.render(Context()) == ''
tmpl = Template('{{ plop|parse_date|date:"d" }}')
assert tmpl.render(Context({'plop': '2017-12-21'})) == '21'
assert tmpl.render(Context({'plop': '21/12/2017'})) == '21'
assert tmpl.render(Context({'plop': 'x'})) == ''
assert tmpl.render(Context({'plop': None})) == ''
assert tmpl.render(Context({'plop': 3})) == ''
assert tmpl.render(Context({'plop': {'foo': 'bar'}})) == ''
assert tmpl.render(Context()) == ''
tmpl = Template('{{ plop|parse_time|date:"H i" }}')
assert tmpl.render(Context({'plop': '10:32'})) == '10 32'
assert tmpl.render(Context({'plop': 'x'})) == ''
assert tmpl.render(Context({'plop': None})) == ''
assert tmpl.render(Context({'plop': 3})) == ''
assert tmpl.render(Context({'plop': {'foo': 'bar'}})) == ''
assert tmpl.render(Context()) == ''
def test_date_maths():
tmpl = Template('{{ plop|add_days:4 }}')
assert tmpl.render(Context({'plop': '2017-12-21'})) == 'Dec. 25, 2017'
assert tmpl.render(Context({'plop': '2017-12-21 18:00'})) == 'Dec. 25, 2017'
tmpl = Template('{{ plop|add_days:"-1" }}')
assert tmpl.render(Context({'plop': '2017-12-21'})) == 'Dec. 20, 2017'
assert tmpl.render(Context({'plop': '2017-12-21 18:00'})) == 'Dec. 20, 2017'
tmpl = Template('{{ plop|add_days:1.5 }}')
assert tmpl.render(Context({'plop': '2017-12-21'})) == 'Dec. 22, 2017'
assert tmpl.render(Context({'plop': '2017-12-21 18:00'})) == 'Dec. 22, 2017'
tmpl = Template('{{ plop|add_days:"1.5" }}')
assert tmpl.render(Context({'plop': '2017-12-21'})) == 'Dec. 22, 2017'
assert tmpl.render(Context({'plop': '2017-12-21 18:00'})) == 'Dec. 22, 2017'
tmpl = Template('{{ plop|add_hours:24 }}')
assert tmpl.render(Context({'plop': '2017-12-21'})) == 'Dec. 22, 2017, midnight'
assert tmpl.render(Context({'plop': '2017-12-21 18:00'})) == 'Dec. 22, 2017, 6 p.m.'
tmpl = Template('{{ plop|add_hours:"12.5" }}')
assert tmpl.render(Context({'plop': '2017-12-21'})) == 'Dec. 21, 2017, 12:30 p.m.'
assert tmpl.render(Context({'plop': '2017-12-21 18:00'})) == 'Dec. 22, 2017, 6:30 a.m.'
def test_age_in():
context = {
'form_var_datefield': time.strptime('2018-07-31', '%Y-%m-%d'),
'form_var_datefield2': time.strptime('2018-08-31', '%Y-%m-%d'),
'form_var_datestring': '2018-07-31',
'today': datetime.date.today(),
'now': datetime.datetime.now(),
}
for condition_value in ( # hope date is > 2018
# age_in_days
'"1970-01-01"|age_in_days > 0',
'"01/01/1970"|age_in_days > 0',
'"2500-01-01"|age_in_days < 0',
'"01/01/2500"|age_in_days < 0',
'form_var_datefield|age_in_days > 50',
'form_var_datefield|age_in_days:form_var_datestring == 0',
'form_var_datefield|age_in_days:form_var_datefield2 == 31',
'form_var_datefield2|age_in_days:form_var_datefield == -31',
'form_var_datefield|age_in_days:form_var_datefield == 0',
'form_var_datestring|age_in_days:form_var_datefield == 0',
'form_var_datestring|age_in_days:form_var_datestring == 0',
'today|add_days:-5|age_in_days == 5',
'today|add_days:5|age_in_days == -5',
'today|age_in_days == 0',
# with datetimes
'"1970-01-01 02:03"|age_in_days > 0',
'"01/01/1970 02h03"|age_in_days > 0',
'"2500-01-01 02:03"|age_in_days < 0',
'"01/01/2500 02h03"|age_in_days < 0',
'now|age_in_days == 0',
'now|add_hours:-24|age_in_days == 1',
'now|add_hours:24|age_in_days == -1',
'"2010-11-12 13:14"|age_in_days:"2010-11-12 13:14" == 0',
'"2010-11-12 13:14"|age_in_days:"2010-11-12 12:14" == 0',
'"2010-11-12 13:14"|age_in_days:"2010-11-12 14:14" == 0',
'"2010-11-12 13:14"|age_in_days:"2010-11-13 13:13" == 1',
'"2010-11-12 13:14"|age_in_days:"2010-11-13 13:15" == 1',
# age_in_hours
'now|add_hours:-5|age_in_hours == 5',
'now|add_hours:25|age_in_hours == -24',
'now|age_in_hours == 0',
'"2010-11-12 13:14"|age_in_hours:"2010-11-12 13:14" == 0',
'"2010-11-12 13:14"|age_in_hours:"2010-11-12 12:14" == -1',
'"2010-11-12 13:14"|age_in_hours:"2010-11-12 14:14" == 1',
'"2010-11-12 13:14"|age_in_hours:"2010-11-13 13:13" == 23',
'"2010-11-12 13:14"|age_in_hours:"2010-11-13 13:15" == 24',
'"1970-01-01 02:03"|age_in_hours > 0',
'"01/01/1970 02h03"|age_in_hours > 0',
'"2500-01-01 02:03"|age_in_hours < 0',
'"01/01/2500 02h03"|age_in_hours < 0',
# with dates
'"1970-01-01"|age_in_hours > 0',
'"01/01/1970"|age_in_hours > 0',
'"2500-01-01"|age_in_hours < 0',
'"01/01/2500"|age_in_hours < 0',
'form_var_datefield|age_in_hours > 1200',
'form_var_datefield|age_in_hours:form_var_datestring == 0',
'form_var_datefield|age_in_hours:form_var_datefield2 == 744', # 31*24
'form_var_datefield2|age_in_hours:form_var_datefield == -744',
'form_var_datefield|age_in_hours:form_var_datefield == 0',
'form_var_datestring|age_in_hours:form_var_datefield == 0',
'form_var_datestring|age_in_hours:form_var_datestring == 0',
'today|add_days:-1|age_in_hours >= 24',
'today|add_days:1|age_in_hours <= -0',
'today|add_days:1|age_in_hours >= -24',
'today|age_in_hours >= 0',
# age_in_years
'"1970-01-01"|age_in_years > 0',
'"01/01/1970"|age_in_years > 0',
'"2500-01-01"|age_in_years < 0',
'"01/01/2500"|age_in_years < 0',
'form_var_datefield|age_in_years:"2019-07-31" == 1',
'form_var_datefield|age_in_years:"2019-09-20" == 1',
'form_var_datefield|age_in_years:"2020-07-30" == 1',
'form_var_datefield|age_in_years:"2020-07-31" == 2',
'form_var_datestring|age_in_years:"2019-07-31" == 1',
'today|age_in_years == 0',
'today|add_days:-500|age_in_years == 1',
'today|add_days:-300|age_in_years == 0',
'today|add_days:300|age_in_years == -1',
'now|age_in_years == 0',
'now|add_days:-500|age_in_years == 1',
'now|add_days:-300|age_in_years == 0',
'now|add_days:300|age_in_years == -1',
'"1970-01-01 02:03"|age_in_years > 0',
'"2500-01-01 02:03"|age_in_years < 0',
# age_in_months
'form_var_datefield|age_in_months:form_var_datefield2 == 1',
'form_var_datefield2|age_in_months:form_var_datefield == -1',
'form_var_datefield|age_in_months:"2019-07-31" == 12',
'form_var_datefield|age_in_months:"2019-08-20" == 12',
'form_var_datefield|age_in_months:"2019-09-20" == 13',
'form_var_datestring|age_in_months:"2019-09-20" == 13',
'"1970-01-01"|age_in_months > 0',
'"01/01/1970"|age_in_months > 0',
'"2500-01-01"|age_in_months < 0',
'"01/01/2500"|age_in_months < 0',
'"1970-01-01 02:03"|age_in_months > 0',
'"2500-01-01 02:03"|age_in_months < 0',
# fail produce empty string
'foobar|age_in_days == ""',
'"foobar"|age_in_days == ""',
'"1970-01-01"|age_in_days:"foobar" == ""',
'foobar|age_in_hours == ""',
'"foobar"|age_in_hours == ""',
'"1970-01-01"|age_in_hours:"foobar" == ""',
'foobar|age_in_years == ""',
'"foobar"|age_in_years == ""',
'"1970-01-01"|age_in_years:"foobar" == ""',
'foobar|age_in_months == ""',
'"foobar"|age_in_months == ""',
'"1970-01-01"|age_in_months:"foobar" == ""',
):
tmpl = Template('{%% if %s %%}Good{%% endif %%}' % condition_value)
assert tmpl.render(Context(context)) == 'Good'