Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

stringify conditional before handing it to Jinja2 for evaluation. #3645

Merged
merged 1 commit into from
Aug 2, 2013
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/ansible/utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ def check_conditional(conditional, basedir, inject, fail_on_undefined=False):
conditional = inject[conditional]
conditional = template.template(basedir, conditional, inject, fail_on_undefined=fail_on_undefined)
# a Jinja2 evaluation that results in something Python can eval!
presented = "{% if " + conditional + " %} True {% else %} False {% endif %}"
presented = "{%% if %s %%} True {%% else %%} False {%% endif %%}" % conditional
conditional = template.template(basedir, presented, inject)
val = conditional.lstrip().rstrip()
if val == "True":
Expand Down
94 changes: 94 additions & 0 deletions test/TestUtils.py
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,100 @@ def test_template_unicode(self):

assert res == u'hello wórld'


#####################################
### check_conditional tests

def test_check_conditional_jinja2_literals(self):
# see http://jinja.pocoo.org/docs/templates/#literals

# boolean
assert(ansible.utils.check_conditional(
'jinja2_compare true', '/', {}) == True)
assert(ansible.utils.check_conditional(
'jinja2_compare false', '/', {}) == False)
assert(ansible.utils.check_conditional(
'jinja2_compare True', '/', {}) == True)
assert(ansible.utils.check_conditional(
'jinja2_compare False', '/', {}) == False)

# integer
assert(ansible.utils.check_conditional(
'jinja2_compare 1', '/', {}) == True)
assert(ansible.utils.check_conditional(
'jinja2_compare 0', '/', {}) == False)

# string, beware, a string is truthy unless empty
assert(ansible.utils.check_conditional(
'jinja2_compare "yes"', '/', {}) == True)
assert(ansible.utils.check_conditional(
'jinja2_compare "no"', '/', {}) == True)
assert(ansible.utils.check_conditional(
'jinja2_compare ""', '/', {}) == False)


def test_check_conditional_jinja2_variable_literals(self):
# see http://jinja.pocoo.org/docs/templates/#literals

# boolean
assert(ansible.utils.check_conditional(
'jinja2_compare var', '/', {'var': 'True'}) == True)
assert(ansible.utils.check_conditional(
'jinja2_compare var', '/', {'var': 'true'}) == True)
assert(ansible.utils.check_conditional(
'jinja2_compare var', '/', {'var': 'False'}) == False)
assert(ansible.utils.check_conditional(
'jinja2_compare var', '/', {'var': 'false'}) == False)

# integer
assert(ansible.utils.check_conditional(
'jinja2_compare var', '/', {'var': '1'}) == True)
assert(ansible.utils.check_conditional(
'jinja2_compare var', '/', {'var': 1}) == True)
assert(ansible.utils.check_conditional(
'jinja2_compare var', '/', {'var': '0'}) == False)
assert(ansible.utils.check_conditional(
'jinja2_compare var', '/', {'var': 0}) == False)

# string, beware, a string is truthy unless empty
assert(ansible.utils.check_conditional(
'jinja2_compare var', '/', {'var': '"yes"'}) == True)
assert(ansible.utils.check_conditional(
'jinja2_compare var', '/', {'var': '"no"'}) == True)
assert(ansible.utils.check_conditional(
'jinja2_compare var', '/', {'var': '""'}) == False)

# Python boolean in Jinja2 expression
assert(ansible.utils.check_conditional(
'jinja2_compare var', '/', {'var': True}) == True)
assert(ansible.utils.check_conditional(
'jinja2_compare var', '/', {'var': False}) == False)


def test_check_conditional_jinja2_expression(self):
assert(ansible.utils.check_conditional(
'jinja2_compare 1 == 1', '/', {}) == True)
assert(ansible.utils.check_conditional(
'jinja2_compare bar == 42', '/', {'bar': 42}) == True)
assert(ansible.utils.check_conditional(
'jinja2_compare bar != 42', '/', {'bar': 42}) == False)


def test_check_conditional_jinja2_expression_in_variable(self):
assert(ansible.utils.check_conditional(
'jinja2_compare var', '/', {'var': '1 == 1'}) == True)
assert(ansible.utils.check_conditional(
'jinja2_compare var', '/', {'var': 'bar == 42', 'bar': 42}) == True)
assert(ansible.utils.check_conditional(
'jinja2_compare var', '/', {'var': 'bar != 42', 'bar': 42}) == False)

def test_check_conditional_jinja2_unicode(self):
assert(ansible.utils.check_conditional(
u'jinja2_compare "\u00df"', '/', {}) == True)
assert(ansible.utils.check_conditional(
u'jinja2_compare var == "\u00df"', '/', {'var': u'\u00df'}) == True)


#####################################
### key-value parsing

Expand Down